PowerShell 中可以使用 Get-NetNeighbor 命令来实现类似于 Windows 中 arp -a 的功能,用于显示本地系统的 ARP 缓存表
Get-NetNeighbor 完整解构
基础定位
Get-NetNeighbor 是 Windows PowerShell 内置 NetTCPIP 模块命令,作用:
- IPv4 ARP 条目(IPv4 地址 ↔ MAC)
- IPv6 NDP 邻居条目(IPv6 地址 ↔ MAC)
arp -a≈Get-NetNeighbor -AddressFamily IPv4netsh interface ipv6 show neighbors≈Get-NetNeighbor -AddressFamily IPv6
重要区分:arp.exe老旧工具仅兼容 IPv4;Get-NetNeighbor 原生双栈统一接口,同时管理 ARP 缓存与 NDP 邻居缓存。
一、底层执行原理
1. 整体调用栈模型
PowerShell Console
↓
NetTCPIP.dll (NetTCPIP CIM/WMI提供程序)
↓
iphlpapi.dll (IP Helper API)
↓
内核系统调用
↓
tcpip.sys(内核协议栈,维护ARP缓存 + IPv6邻居缓存)
2. 核心 API
Get-NetNeighbor 底层最终调用:
GetIpNetTable2()
iphlpapi.dll,是现代 Windows 提供的统一邻居表查询 API,同时输出 IPv4 ARP、IPv6 NDP 邻居记录。GetIpNetTable() 仅支持 IPv4(arp.exe 底层使用)。工作流程原理
- PowerShell 加载
NetTCPIP模块; - 模块发起 CIM 请求,转发至
iphlpapi.dll::GetIpNetTable2(); iphlpapi.dll通过 IOCTL 系统调用下发请求至tcpip.sys;tcpip.sys遍历内核内存中的两张表:- IPv4:ARP Cache Table
- IPv6:Neighbor Cache Table(NDP)
- 内核把条目(IP 地址、MAC、接口索引、状态、寿命)向上返回;
- 数据封装为 NetNeighbor 对象(PSObject)输出到 PowerShell 管道。
3. 邻居状态字段来源(由 tcpip.sys 内核标记)
Connected:有效稳定条目Incomplete:正在解析(ARP Request / NDP NS 已发出,尚未收到应答)Unreachable:邻居探测失败Permanent:静态固化条目(手动添加)
所有状态不是 PowerShell 生成,完全由内核 tcpip.sys 维护。
二、依赖文件清单(分层)
1)用户态程序 / 模块
NetTCPIP.dll路径:C:\Windows\System32\WindowsPowerShell\v1.0\Modules\NetTCPIP\承载所有Get/Set/New/Remove-NetNeighbor、IP 地址、路由相关 Cmdlet。iphlpapi.dll核心依赖,提供GetIpNetTable2API。ws2_32.dllWinsock 支撑cimwin32.dllCIM 基础设施(WMI 现代替代)powershell.exe/pwsh.exePowerShell 运行时
2)内核层依赖
tcpip.sys:双栈协议栈,保存 ARP 缓存、IPv6 邻居缓存ndis.sys:NDIS 网络驱动框架- 网卡厂商 NDIS 小端口驱动
3)无独立系统服务
tcpip.sys自主维护;
对比:ipconfig /renew 需要 Dhcp 服务;Get-NetNeighbor不需要任何额外服务。
4)持久化边界说明
- 动态 ARP/NDP 条目:内存临时,老化自动删除
- 静态永久条目 (Permanent):写入内核配置,重启失效;
静态邻居条目不会自动写入注册表持久保存,开机需要重新脚本加载。
注册表不存储动态邻居缓存!注册表只存放网卡静态 TCP/IP 参数,和邻居表无关。
三、配套链(上下游组件生态)
1. 同模块配套 Cmdlet(NetTCPIP 套件)
Get-NetNeighbor # 查询邻居表
New-NetNeighbor # 添加静态ARP/NDP条目
Remove-NetNeighbor # 删除邻居缓存
Clear-NetNeighborCache # 清空整张邻居表
Get-NetIPAddress
Get-NetRoute
Get-NetAdapter
2. 传统命令行配套(兼容层)
arp.exe:仅 IPv4,底层调用老旧 GetIpNetTable ()netsh interface ipv4 show neighborsnetsh interface ipv6 show neighbors
3. 协议底层配套
- IPv4 ARP(RFC826):填充 IPv4 邻居条目
- IPv6 NDP(RFC4861 NS/NA 报文):填充 IPv6 邻居条目
- ICMPv6:支撑 IPv6 NDP 邻居探测
4. 网络侧配套链路
Get-NetNeighbor 查看本地缓存 → 抓包验证 ARP/NDP 报文 → 核查交换机二层安全策略5. 监控 / 安全配套
Get-NetNeighbor 输出,用于:- ARP 欺骗检测
- 非法终端接入审计
- 邻居可达性异常监控
四、完整逻辑全链路
链路 1:基础查询 Get-NetNeighbor
pwsh.exe/powershell.exe
↓
加载 NetTCPIP 模块
↓
NetTCPIP.dll 发起调用 iphlpapi.dll!GetIpNetTable2()
↓
iphlpapi.dll 发起系统调用,下发控制指令至 tcpip.sys
↓
tcpip.sys 读取内核内存:
IPv4 ARP Cache + IPv6 Neighbor Cache
↓
原始条目数据逐层向上返回
↓
NetTCPIP.dll 将原始C结构封装为 PowerShell NetNeighbor 对象
↓
输出对象流,控制台展示表格/可供管道继续处理
链路 2:过滤示例 Get-NetNeighbor -AddressFamily IPv6
⚠️ 注意:过滤是在 PowerShell 用户层完成,无法在内核侧只索取单栈数据。
链路 3:添加静态条目 New-NetNeighbor
New-NetNeighbor → NetTCPIP.dll → iphlpapi.dll → SetIpNetEntry2()
↓
下发命令至tcpip.sys
↓
在内核邻居表写入 Permanent 静态映射
链路 4:清除缓存 Clear-NetNeighborCache
FlushIpNetTable2(),通知 tcpip.sys 清空指定接口 / 全系统动态邻居条目。五、关键认知误区澄清
-
❌
Get-NetNeighbor直接抓取网卡报文解析 ARP/NDP✅ 错误。不抓包!只是读取 tcpip.sys已经学习完成的内核缓存。看不到历史上已经老化删除的记录。 -
❌
arp -a和Get-NetNeighbor IPv4数据源完全一致✅ 数据源同源(tcpip.sys ARP 缓存),但调用 API 不同:arp.exe 使用老旧GetIpNetTable;Get-NetNeighbor 使用现代GetIpNetTable2,信息字段更丰富。 -
❌ 静态邻居条目永久保存在注册表✅ 错误。仅存内核内存,重启丢失;如需持久,开机脚本执行 New-NetNeighbor。
-
❌ 可以通过 Get-NetNeighbor 触发 ARP/NDP 探测✅ 错误!查询动作不会主动发送 ARP Request / NDP NS。想要触发解析:必须主动 ping 目标 IP,由 tcpip.sys 主动发起邻居请求。
-
❌ IPv6 条目叫 ARP 缓存✅ 规范名称:邻居缓存 Neighbor Cache,由 NDP 协议维护,不属于 ARP。
六、横向对比速记
| 工具 | 支持协议 | 底层 API | 归属 |
|---|---|---|---|
| arp.exe | 仅 IPv4 ARP | GetIpNetTable | 传统 EXE |
| Get-NetNeighbor | IPv4 ARP + IPv6 NDP | GetIpNetTable2 | PowerShell NetTCPIP 模块 |
1、详细介绍内核协议栈(Windows NT 内核协议栈 tcpip.sys)
基础定义
分层架构(自上而下)
- Winsock 接口层(用户态)
ws2_32.dll,为应用程序提供 socket API;应用无法直接操作内核栈,必须通过这套接口。
- 内核 Socket 层(AFD.SYS)
内核套接字驱动,转发用户态 socket 请求至 tcpip.sys。
- tcpip.sys 协议处理层【核心】
承载完整协议处理:
- 网络层:IPv4、IPv6、ICMPv4、ICMPv6
- 地址解析:ARP 缓存管理、NDP 邻居缓存管理
- 传输层:TCP、UDP
- 路由表维护、分片重组、QoS、数据包过滤
- NDIS 接口层(ndis.sys)
统一网络驱动框架,隔离协议栈与各类网卡驱动;提供数据包收发、网卡枚举、二层帧封装。
- 网卡小端口驱动
厂商硬件驱动,负责和物理网卡交互,收发以太网帧。
tcpip.sys 关键内置数据表(和你前面学习内容强关联)
- IPv4 ARP Cache(ARP 缓存表)
- IPv6 Neighbor Cache(NDP 邻居缓存)
- IP 路由表
- TCP 连接控制块 TCB、UDP 端口表
核心特性
- ARP/NDP 报文在内核自主生成、收发,不需要用户态服务;
Get-NetNeighbor、arp -a本质都是读取该驱动内存中的缓存;- 所有网卡 IP、网关、MTU、地址生命周期全部由协议栈维护;
- 隔离边界:用户态程序不能直接修改内核内存缓存,只能通过 Win32 API 间接读写。
配套依赖
2、如何使用 Get-NetNeighbor 命令
前置要求:Windows 8 / Server2012 及以上原生内置,归属 NetTCPIP 模块,打开 PowerShell 执行。
基础语法
# 查看全部邻居缓存(IPv4 ARP + IPv6 NDP)
Get-NetNeighbor
# 仅查看IPv4 ARP缓存(等价 arp -a)
Get-NetNeighbor -AddressFamily IPv4
# 仅查看IPv6 NDP邻居缓存
Get-NetNeighbor -AddressFamily IPv6
高频实用示例
# 指定网卡索引查看(先 Get-NetAdapter 确认接口索引号)
Get-NetNeighbor -InterfaceIndex 3
# 筛选状态为 Incomplete(解析失败/未收到应答)的条目
Get-NetNeighbor | Where-Object {$_.State -eq "Incomplete"}
# 格式化输出IP、MAC、状态
Get-NetNeighbor -AddressFamily IPv4 | Select IPAddress,LinkLayerAddress,State
# 添加静态ARP绑定(永久条目,重启失效)
New-NetNeighbor -InterfaceIndex 3 -IPAddress "192.168.1.1" -LinkLayerAddress "AA-BB-CC-DD-EE-FF" -State Permanent
# 删除一条邻居缓存
Remove-NetNeighbor -IPAddress 192.168.1.1 -InterfaceIndex 3
# 清空所有动态邻居缓存
Clear-NetNeighborCache
字段释义(State 状态)
Connected:正常可用动态条目Incomplete:正在解析,已发 ARP/NS,无回复Unreachable:邻居探测判定不可达Permanent:静态永久绑定条目
重要注意点
- 查询不会主动触发 ARP/NDP 探测;想要触发解析,需要 ping 对应 IP;
- 静态条目仅保存在内核内存,系统重启丢失;
- 普通用户可查询;增删静态条目需要管理员权限。
3、PowerShell 和 CMD 命令核心区别
1)底层架构本质区别
CMD
- 宿主程序:
cmd.exe,传统命令解释器 - 处理对象:纯文本字符串
- 内置命令有限,大量功能依赖独立 exe 程序(arp.exe、ipconfig.exe、route.exe)
- 管道传递:文本流,工具之间只能通过字符串交互,需要复杂文本截取
PowerShell
- 宿主:
powershell.exe/pwsh.exe - 处理对象:.NET 对象(核心差异)
- 拥有原生模块系统(NetTCPIP、ActiveDirectory 等),大量 Cmdlet 内置,不再依赖独立 exe
- 管道传递完整对象,可以直接读取属性,不用文本切割
2)网络相关直观对比(贴合你学习链路)
| 场景 | CMD | PowerShell |
|---|---|---|
| 查看 ARP 缓存 | arp -a(独立 exe,仅 IPv4) |
Get-NetNeighbor(原生双栈,输出对象) |
| 查看网卡 IP | ipconfig /all(文本输出) |
Get-NetIPAddress(结构化对象) |
| 路由管理 | route.exe | Get-NetRoute / New-NetRoute |
| 过滤数据 | findstr 文本匹配 | Where-Object 对象属性筛选 |
3)关键能力差异
-
数据交互CMD:所有输出是字符串,提取 MAC、IP 需要 for 循环、findstr 截取,极易出错;PowerShell:直接访问
$obj.IPAddress、$obj.LinkLayerAddress属性。 -
扩展性CMD 扩展能力弱,依靠外部 exe;PowerShell 支持模块、函数、面向对象、远程管理 (WinRM)。
-
系统 API 调用方式CMD 调用独立 exe 程序(ipconfig.exe、arp.exe),exe 再调用 DLL;PowerShell Cmdlet 一般直接封装 API,减少中间 exe 层级。
-
兼容性CMD 兼容老旧 Windows 批处理脚本;PowerShell 向后兼容,可以调用所有传统 exe 命令。
4)一句话总结
实例直观对比
arp -a | findstr 192.168.1.1
Get-NetNeighbor -AddressFamily IPv4 | Where-Object IPAddress -eq "192.168.1.1"
Get-NetNeighbor 故障排查标准操作流程
Get-NetNeighbor、基础抓包、二层交换机知识前置术语回顾
- Incomplete:主机发出 ARP Request / NDP NS 请求,未收到任何应答
- Neighbor Cache:内核
tcpip.sys维护,同时承载 IPv4 ARP 表、IPv6 NDP 邻居表 - 关键命令速查
# 查看全部邻居表
Get-NetNeighbor
# 单独IPv4 ARP
Get-NetNeighbor -AddressFamily IPv4
# 单独IPv6 NDP
Get-NetNeighbor -AddressFamily IPv6
# 筛选异常条目
Get-NetNeighbor | Where-Object {$_.State -eq 'Incomplete'}
一、标准化排查总流程(通用链路)
Step1 采集基线信息,确认故障现象
- 打开 PowerShell,导出邻居缓存快照留存证据
Get-NetNeighbor | Export-Csv -Path C:\neighbor_before.csv -Encoding UTF8
- 定位异常接口:
# 查看网卡索引号
Get-NetAdapter
# 只观察故障网卡邻居表(替换接口索引)
Get-NetNeighbor -InterfaceIndex 3
- 确认故障分类
- 现象 A:目标 IP 条目持续 Incomplete → 地址解析不通
- 现象 B:同一 IP 频繁切换 MAC / 网关 MAC 异常 → ARP 欺骗 / NDP 欺骗
- 现象 C:IPv6 邻居反复消失、可达性震荡 → NDP 邻居可达性故障
重要提醒:Get-NetNeighbor仅读取内核缓存,不会主动触发解析想要触发 ARP/NDP 请求:ping 目标IP
Step2 基础连通性分层定位(由上层到下层)
- Ping 目标 IP
ping 192.168.1.1
ping 2001::xxx
- 持续监控邻居状态(实时观察变化)
while($true){Get-NetNeighbor -InterfaceIndex 3;Start-Sleep 1}
- 判断边界
- 若 ping 不通 + 条目 Incomplete:二层解析环节故障
- 若 ping 通但邻居表异常:存在缓存异常、静态条目冲突
Step3 区分单栈故障:IPv4 ARP / IPv6 NDP
# 分离查看
Get-NetNeighbor -AddressFamily IPv4
Get-NetNeighbor -AddressFamily IPv6
- 仅 IPv4 异常:聚焦 ARP、交换机 DAI、ARP Snooping
- 仅 IPv6 异常:聚焦 NDP、RA Guard、组播转发、DAD 冲突
Step4 清理缓存复现故障(排除陈旧缓存干扰)
# 清空动态邻居缓存
Clear-NetNeighborCache
# 重新触发解析
ping 目标IP
# 再次观测状态
Get-NetNeighbor
⚠️ Permanent 静态条目不会被清除。
Step5 结合抓包确认报文收发(关键分界点)
- Incomplete 场景重点观察:
- 是否发出 ARP Request / ICMPv6 NS
- 是否收到对端 ARP Reply / NA
- 报文判定结论:
表格
抓包现象 根因方向 请求报文发出,无应答 对端离线、交换机阻断广播 / 组播、VLAN 隔离、防火墙拦截 请求未发出 本机协议栈 tcpip.sys 异常、路由判定目标不在同一链路 收到应答,但内核不写入缓存 安全软件拦截、MAC 冲突、重复地址 DAD 冲突
Step6 网络设备侧协同核查
- IPv4 环境:交换机 MAC 地址表、ARP-Snooping、DAI 动态 ARP 检测
- IPv6 环境:NDP Snooping、RA Guard、MLD 组播转发策略
- 确认:同一广播域,路由器不转发 ARP/NDP 报文
Step7 临时验证手段
- 手动添加静态邻居条目测试连通性
# IPv4静态ARP
New-NetNeighbor -InterfaceIndex 3 -IPAddress "192.168.1.1" -LinkLayerAddress "xx-xx-xx-xx-xx-xx" -State Permanent
# IPv6静态NDP
New-NetNeighbor -InterfaceIndex 3 -IPAddress "2001::1" -LinkLayerAddress "xx-xx-xx-xx-xx-xx" -State Permanent
Step8 故障闭环与证据留存
# 故障恢复后再次导出快照对比
Get-NetNeighbor | Export-Csv -Path C:\neighbor_after.csv -Encoding UTF8
二、场景专项排查链路
场景 1:邻居条目持续 Incomplete 专项排查
可能根因清单
- 目标设备关机、离线、防火墙禁止应答 ARP/NS
- 两端不在同一个 VLAN / 广播域
- 交换机关闭广播转发、端口隔离
- IPv6 场景:请求节点组播被交换机拦截(MLD 问题)
- 本机网卡驱动异常、tcpip.sys 协议栈损坏
- 目标存在 IP 冲突(IPv6 DAD 冲突尤为常见)
定向排查顺序
- ping 触发解析 →
Get-NetNeighbor确认进入 Incomplete - 抓包:确认本机是否发出请求报文
- 在同网段另一台设备测试能否解析目标 IP
- 其他主机正常:本机网卡 / 协议栈问题
- 所有主机都无法解析:二层网络、目标设备问题
- IPv6 额外检查:是否启用 IPv6、组播是否正常、DAD 地址冲突
场景 2:ARP 欺骗(IPv4)排查链路
操作步骤
- 持续监控邻居表,记录异常 MAC
while($true){Get-NetNeighbor -AddressFamily IPv4 | Where IPAddress -eq "192.168.1.1";sleep 1}
- 区分两种情况
- 异常 MAC 为本机:本机中毒发起 ARP 欺骗
- 异常 MAC 为未知终端:内网主机恶意发送免费 ARP
- 临时处置:添加网关静态 ARP 绑定
New-NetNeighbor -InterfaceIndex X -IPAddress 网关IP -LinkLayerAddress 真实网关MAC -State Permanent
- 交换机溯源:通过异常 MAC 查看对应接入端口,定位攻击主机
- 长期防护:交换机开启 ARP Snooping + DAI
场景 3:IPv6 NDP 异常(NDP 欺骗、邻居震荡)
IPv6 无广播,依靠 NS/NA、RA 报文,攻击类型:RA 欺骗、NA 欺骗现象:默认网关随机变化、邻居条目频繁 Unreachable、无法获取 IPv6 地址
排查链路
Get-NetNeighbor -AddressFamily IPv6观察网关邻居条目- 抓包重点查看 ICMPv6 RA、NA 报文
- 判定:是否存在非法设备发送伪造 RA/NA
- 临时防护:交换机开启 RA Guard、NDP Snooping
- 检查 DAD 重复地址检测告警(地址冲突会导致邻居不稳定)
三、常见坑与避坑清单
- ❌ 不要只依靠
arp -a排查 IPv6,必须使用Get-NetNeighbor - ❌ Incomplete ≠ 一定被攻击,优先确认目标设备是否在线
- ❌ 清理缓存后不重新 ping,不会产生新的邻居条目
- ❌ 静态邻居条目重启失效,不能作为永久解决方案
- ❌ ARP/NDP 为链路本地协议,跨三层设备无法解析
- ❌ 防火墙拦截 ICMPv6 会直接导致 NDP 整体失效
四、故障排查速查脚本(可直接复制使用)
#1.导出邻居缓存
Get-NetNeighbor | Export-Csv C:\neighbor_log.csv -Encoding UTF8
#2.筛选所有异常状态条目
Get-NetNeighbor | Where-Object {$_.State -in 'Incomplete','Unreachable'}
#3.持续监控
while($true)
{
Clear-Host
Get-NetNeighbor -InterfaceIndex 3
Start-Sleep 1
}
整套 Windows NT 内核网络分层完整讲解
1、详细介绍内核协议栈(Windows NT 内核协议栈 tcpip.sys)
基础定位
tcpip.sys 运行于内核模式 Ring0,是 Windows TCP/IP 协议栈核心驱动,原生实现IPv4/IPv6 双栈,位于传输层、网络层处理核心。核心职责
- 网络层处理
IPv4、IPv6 报文收发、分片 / 重组;ICMPv4、ICMPv6;维护 ARP 缓存表(IPv4)、Neighbor 邻居缓存(IPv6 NDP);路由表计算与查找。
- 传输层处理
TCP(连接管理、重传、拥塞控制、TCB 传输控制块)、UDP;端口绑定、流量控制。
- 地址解析逻辑
收到上层发包请求时,查询邻居缓存;无有效条目自动发起 ARP Request / NDP NS 请求;接收应答更新缓存。
Get-NetNeighbor、arp -a最终都是通过 API 读取tcpip.sys内核内存中的邻居缓存。
- 内置过滤与策略
内置 TCP/IP 筛选、IPsec、QoS 流量调度、路径 MTU 发现 PMTUd。
上下游对接
- 上层:接收
afd.sys下发的 Socket 数据 - 下层:将封装好的 IP 报文交付
ndis.sys转发给网卡驱动
关键内置数据表
- IPv4 ARP Cache
- IPv6 Neighbor Cache(NDP)
- IP 路由表
- TCP TCB 连接块、UDP 端口控制表
典型关联故障
Incomplete、路由失效、TCP 重传、IPv6 NDP 异常、ARP 解析异常,根源大多在tcpip.sys处理逻辑。2、介绍 AFD.SYS 的工作原理
定位
核心工作原理
- 用户态应用调用
ws2_32.dll的 socket API(socket/connect/send/recv); ws2_32.dll通过系统调用,把请求转发至内核afd.sys;- AFD 负责管理 Socket 对象、缓冲区、I/O 模型:
- 维护每个 socket 的收发缓冲区;
- 实现重叠 IO、IOCP 完成端口、异步 Socket(Windows 高性能网络基石);
- 处理阻塞 / 非阻塞等待、事件通知;
- AFD 剥离上层 Socket 语义,把原始数据交给
tcpip.sys完成 TCP/UDP/IP 封装; - 下行报文反向流程:tcpip.sys 向上投递数据 → AFD 放入 Socket 缓冲区 → 通知用户态应用读取。
关键特点
afd.sys不实现任何 TCP/IP 协议,只做 Socket 会话管理;协议处理全权交给tcpip.sys。- 所有 Windows 网络程序(浏览器、ping、服务器软件)的 Socket 通信必须经过 AFD。
- 常见现象:大量连接堆积、端口耗尽、IOCP 卡顿,很多和 AFD 缓冲区、连接资源调度相关。
简易数据流
应用程序 → ws2_32.dll → 系统调用 → afd.sys(套接字管理、缓冲区) → tcpip.sys(协议封装) → ndis.sys
3、详细介绍 NDIS 接口层(ndis.sys)
ndis.sys。定位
tcpip.sys下方、硬件网卡驱动上方,统一抽象层,解耦协议栈与网卡硬件驱动。作用:让tcpip.sys不需要认识不同厂商千差万别的网卡驱动;网卡驱动也不用适配协议栈。
NDIS 分层模型(自上而下)
- 协议驱动:tcpip.sys 属于 NDIS 协议驱动,负责生成 IP 报文;
- NDIS 中间驱动(可选):防火墙、VPN、流量采集驱动(Wireshark NDIS 捕获驱动);
- 小端口驱动(Miniport Driver):网卡厂商硬件驱动,直接操控网卡。
ndis.sys作为调度中枢,提供标准接口,转发报文。
核心工作原理
下行(主机发包)
tcpip.sys组装好 IP 报文 → 调用 NDIS 标准接口 → ndis.sys转发给网卡小端口驱动 → 网卡转换成以太网帧发送。上行(接收报文)
ndis.sys → ndis 分发至对应协议驱动tcpip.sys;
tcpip.sys识别以太网类型(0x0800 IPv4 / 0x86DD IPv6 / 0x0806 ARP)再进一步处理。核心能力
- 硬件抽象:统一发包、收包、网卡参数配置接口;
- 支持报文过滤、多队列 RSS 接收、电源管理;
- 提供数据包捕获能力(抓包软件依赖 NDIS);
- 维护网卡状态、MAC 地址、MTU、VLAN 配置。
和 ARP/NDP 强相关关键点
Incomplete。层级完整汇总(串联全部三者)
【用户态】
应用程序
↓
ws2_32.dll (Winsock 用户态Socket API)
———————————— 用户态/内核态边界 ———————————
【内核态】
afd.sys 内核Socket管理层(会话、缓冲区、IOCP)
↓
tcpip.sys TCP/IP协议栈(IPv4/IPv6、ARP、NDP、TCP、UDP、路由、邻居缓存)
↓
ndis.sys NDIS驱动抽象接口层
↓
网卡小端口驱动
↓
物理网卡硬件
高频易混淆区分总结
- afd.sys:只管 Socket 会话、缓冲区,不处理 IP/TCP 协议
- tcpip.sys:真正的 TCP/IP 协议实现,维护 ARP、NDP 邻居缓存
- ndis.sys:网卡硬件抽象层,负责二层帧收发,隔离协议栈与硬件
1、如何使用 PowerShell 导出邻居缓存快照
适用:Get-NetNeighbor,用于故障前后留存证据、离线对比分析,管理员权限最佳。
基础导出命令
# 完整导出全部邻居缓存(IPv4 ARP + IPv6 NDP)为CSV,方便Excel打开
Get-NetNeighbor | Export-Csv -Path "C:\neighbor_snapshot.csv" -Encoding UTF8 -NoTypeInformation
-Encoding UTF8:防止中文乱码-NoTypeInformation:去除 CSV 首行多余.NET 类型字段
场景化导出脚本
# 仅导出IPv4 ARP缓存
Get-NetNeighbor -AddressFamily IPv4 | Export-Csv "C:\arp_snapshot.csv" -Encoding UTF8 -NoTypeInformation
# 仅导出IPv6 NDP邻居缓存
Get-NetNeighbor -AddressFamily IPv6 | Export-Csv "C:\ndp_snapshot.csv" -Encoding UTF8 -NoTypeInformation
# 只导出故障网卡(替换InterfaceIndex)
Get-NetNeighbor -InterfaceIndex 3 | Export-Csv "C:\if3_neighbor.csv" -Encoding UTF8 -NoTypeInformation
# 只导出异常状态条目(Incomplete、Unreachable)
Get-NetNeighbor | Where-Object {$_.State -in "Incomplete","Unreachable"} | Export-Csv "C:\error_neighbor.csv" -Encoding UTF8 -NoTypeInformation
进阶:带时间戳自动快照(便于持续监控)
$time=Get-Date -Format "yyyyMMdd_HHmmss"
Get-NetNeighbor | Export-Csv "C:\neighbor_$time.csv" -Encoding UTF8 -NoTypeInformation
关键注意事项
- 快照仅捕获当前内核缓存,不会主动触发 ARP/NDP 解析;排查前先
ping 目标IP再导出。 Permanent静态条目与动态条目会一并导出。- CSV 可离线对比故障前后 MAC 变化,用于定位 ARP/NDP 欺骗。
2、如何使用基础抓包工具分析邻居缓存相关故障
Incomplete、MAC 异常的根本原因。步骤 1:配置抓包过滤器
# IPv4 ARP报文过滤
arp
# IPv6 NDP报文过滤(NS/NA/RS/RA)
icmpv6.type == 135 or icmpv6.type == 136
# 同时抓取ARP+NDP
arp or icmpv6.type == 135 or icmpv6.type == 136
步骤 2:标准分析流程
- 启动抓包 → 清空邻居缓存
Clear-NetNeighborCache ping 目标IP主动触发地址解析- 对照
Get-NetNeighbor状态,结合抓包 4 种判定:表格抓包现象 结论 邻居缓存表现 发出 ARP Request / NS,无任何应答 二层转发阻断、目标设备离线、防火墙屏蔽 条目变为 Incomplete发出请求,收到合法 Reply/NA 解析成功,内核写入缓存 状态变为 Connected收到多条 Reply/NA,MAC 来回切换 存在 ARP 欺骗 / NDP 欺骗 同一 IP 不断绑定不同 MAC 未发出 ARP/NS 请求 协议栈判定目标不在同一网段,直接路由,不会产生邻居条目 无对应 IP 条目
实操要点
- 抓包网卡必须选择业务网卡;
- IPv6 场景重点关注请求节点组播能否正常转发;
- 抓包文件(pcapng)可和邻居缓存 CSV 配套留存作为故障证据;
- 区分:抓包看线路报文,Get-NetNeighbor 看系统内核最终缓存,两者不一致通常是本机防火墙、安全软件拦截应答报文。
3、如何使用二层交换机排查邻居条目 Incomplete 状态
现象:Windows 主机持续出现Incomplete,代表 ARP Request/NDP NS 发出后收不到应答,需要在交换机侧定位二层链路问题。
Step1 基础信息采集
- 在 Windows 主机获取:本机网卡接口索引、本机 IP、目标 IP、目标预期 MAC;
- 交换机查询主机接入端口:
# 华为/H3C
display mac-address 主机MAC
# 思科
show mac-address-table address <mac>
Step2 核心排查步骤
-
检查 VLAN 一致性确认本机端口与目标端口在同一个 VLAN;跨 VLAN 无法直接 ARP/NDP 解析,必然 Incomplete。
-
验证广播 / 组播转发能力
- IPv4:ARP 依靠广播;检查端口是否配置
port-isolate端口隔离、ACL 阻断广播报文。 - IPv6:NDP 依靠组播;确认交换机开启 MLD Snooping,没有过滤请求节点组播。
- 端口状态与链路质量
检查端口是否 err-disabled、速率双工不匹配、存在大量 CRC 错误、风暴抑制拦截广播。
# 查看端口统计
display interface GigabitEthernet 0/0/1
- 安全策略核查(最常见诱因)
- 交换机开启 DAI(动态 ARP 检测),非法 ARP 报文被丢弃;
- 开启 NDP Snooping、RA Guard,拦截非法 NA 报文;
- ACL 过滤 ARP、ICMPv6 报文。
- 跨设备转发验证
在交换机镜像端口抓包:
- 能否看到主机发出的 ARP/NS;
- 目标设备回复的 ARP Reply/NA 能否回传到主机端口。
Step3 分层判定结论
- 主机发请求,交换机收到请求,但目标无回复 → 目标终端故障、防火墙拦截;
- 主机发请求,目标正常回复,交换机不转发回源端口 → 交换机策略、VLAN、组播问题;
- 同一网段其他主机解析正常,仅这台 Windows 异常 → 主机网卡驱动、tcpip.sys、本机防火墙问题。
快速临时验证手段
|
使用 这个命令的输出通常包括以下列信息:
使用 |
|||||||
|
你可以根据需要使用这些参数来过滤和定制 |
|||||||
|
这些参数允许用户根据需要过滤和定制 |
PowerShell 中可以使用 Get-NetNeighbor 命令来实现类似于 Windows 中 arp -a 的功能,用于显示本地系统的 ARP 缓存表。以下是如何在 PowerShell 中执行类似 arp -a 的操作:
Get-NetNeighbor
这个命令会列出本地系统的 ARP 缓存表,显示每个 IP 地址对应的 MAC 地址以及其他相关信息,类似于 Windows 中 arp -a 命令的输出。
|
Get-NetNeighbor 索引号(ifIndex)、IP 地址(IPAddress)、链路层地址(LinkLayerAddress)、状态(State)和策略存储(PolicyStore) ifIndex IPAddress LinkLayerAddress State PolicyStore |
Get-NetNeighbor 返回本地系统的邻居关系表,该表列出了系统中已知的网络邻居的信息,包括其接口索引号(ifIndex)、IP 地址(IPAddress)、链路层地址(LinkLayerAddress)、状态(State)和策略存储(PolicyStore)。
如果你想过滤特定接口的 ARP 缓存表,你可以使用 InterfaceIndex 参数,例如:
Get-NetNeighbor -InterfaceIndex <InterfaceIndex>
其中 <InterfaceIndex> 是你想要过滤的网络接口的索引号。你可以使用 Get-NetAdapter 命令来查看所有网络接口及其对应的索引号。

浙公网安备 33010602011771号