
在实际网络中免费 ARPGratuitous ARP是最容易被忽视却又直接影响 IP 地址可用性的协议机制之一。配置静态 IP 地址时系统会先发送 ARP Probe 探测地址是否被占用地址确认可用后又会发送免费 ARP 通告让交换机和相邻主机及时更新 ARP 缓存。很多“设备突然上不了网”“网关不通”“两台机器 IP 冲突”的问题根因都藏在免费 ARP 的交互细节里。下面先讲清 ARP 和免费 ARP 的关系再用 arping、tcpdump 和 Wireshark 做一组可复现实验最后给出静态 IP 配置场景下的冲突排查路径和工程实践建议。1. 先理清 ARP 的职责再理解免费 ARP 为什么存在1.1 ARP 解决的是同一条链路内的寻址问题IP 地址是逻辑地址负责跨网络的路由寻址但在同一台交换机连接的二层网络内部数据帧必须使用 MAC 地址才能送达具体网卡。ARPAddress Resolution Protocol地址解析协议就是在这两者之间搭桥它根据目标 IPv4 地址查询同一链路内对应的 MAC 地址。这里强调“同一链路”是因为 ARP 请求使用广播帧发送广播帧只在二层域内传播不会穿过路由器。跨网段通信时主机先把数据交给网关由网关继续转发所以主机只需要解析网关的 MAC不需要知道远端服务器的 MAC。抓包时可以在网卡上看到 ARP 报文它的 EtherType 是0x0806。判断一个报文是不是 ARP第一眼看 EtherType第二眼看 opcode 字段opcode 为 1 表示 ARP 请求为 2 表示 ARP 回复。1.2 一次标准 ARP 交互的完整链路假设主机 A192.168.1.10要和主机 B192.168.1.20通信链路过程如下。A 检查自己的 ARP 缓存看是否已经有 192.168.1.20 对应的 MAC。如果没有A 向局域网发送广播 ARP 请求谁的 IP 是 192.168.1.20请告诉 192.168.1.10。B 收到广播后发现目标协议地址是自己于是回复一个单播 ARP 应答192.168.1.20 的 MAC 是 00:1a:2b:3c:4d:5e。A 收到应答后把这条映射写入 ARP 缓存然后开始封装 IP 数据包并发送。在 Linux 上查看缓存可以用如下命令。ip neigh show # 或者使用传统命令 arp -a标准 ARP 的特点是“有问才有答”。请求方发出查询目标主机才回复。这个过程中双方都会把自己的 IP-MAC 映射填进对方缓存这是 ARP 协议一个容易忽略的细节ARP 报文里的发送方地址信息会被所有收到报文的设备拿来更新缓存。1.3 “免费 ARP”的“免费”到底是什么意思免费 ARP 的英文是 Gratuitous ARP这里“免费”不是指不花钱而是指“无请求、主动发送”。它是一台主机在没有收到任何 ARP 请求的情况下主动广播自己的 IP-MAC 映射。理解这一点很关键。标准 ARP 是被动响应的免费 ARP 是主动宣告的。主机通过免费 ARP 告诉整个广播域我的 IP 是 X我的 MAC 是 Y请所有设备更新缓存。在 IPv4 地址冲突检测Duplicate Address DetectionDAD场景中免费 ARP 又细分为两种形态ARP Probe探测报文发送者协议地址填0.0.0.0目标协议地址填待检测的 IP用来询问“这个地址有没有人用”。ARP Announcement通告报文发送者协议地址和目标协议地址都填自己的 IP用来主动宣告“这个地址现在归我”。很多人把这两种报文统称为免费 ARP严格看都不算错但它们的作用完全不同。配静态 IP 时先做探测确认没人占用后才做通告两个动作配合起来才构成完整的地址冲突检测流程。2. 免费 ARP 的报文特征与三大典型场景2.1 通过报文内容识别免费 ARP在 Wireshark 或 tcpdump 里可以从 ARP 报文的关键字段判断它属于哪一种。下表整理了标准 ARP 请求、标准 ARP 回复、ARP Probe、免费 ARP 通告的区别。报文类型opcode发送者协议地址目标协议地址触发方式作用标准 ARP 请求1请求方自身 IP要查询的 IP有通信需求查询目标 MAC标准 ARP 回复2被查询方 IP请求方 IP收到请求回填目标 MACARP Probe10.0.0.0待检测 IP配置新地址前探测地址是否被占用免费 ARP 通告1 或 2自身 IP与发送者 IP 相同地址生效后、MAC 变更后主动广播映射判断免费 ARP 通告最简单的方法是发送者协议地址和目标协议地址完全相同。ARP Probe 则看发送者协议地址是否为0.0.0.0。Wireshark 在解析时如果发现这两种特征通常会在 Info 列直接标记为 Gratuitous ARP。2.2 场景一配置 IP 时的地址冲突检测ARP ProbeRFC 5227 定义了 IPv4 地址冲突检测的标准流程。主机在正式使用一个 IPv4 地址之前先发送 ARP Probe 探测报文过程大致如下。主机把发送者协议地址设置为0.0.0.0目标协议地址设置为待检测的 IP。按一定间隔重复发送多次探测常见实现是发送 3 次间隔 1 到 2 秒。如果在探测期间收到针对该 IP 的 ARP 回复说明这个地址已经被其他设备占用。如果收到其他主机发来的、目标 IP 相同的 ARP Probe同样说明存在重复配置风险。确认地址无人使用后主机才发送免费 ARP 通告正式使用该地址。为什么要特意把发送者协议地址填成0.0.0.0而不是直接填候选 IP因为如果探测报文直接使用候选 IP网内某些设备可能因为缓存了旧的映射误以为这是一次真实通信从而更新自己的 ARP 缓存甚至主动回复干扰探测结果。用0.0.0.0可以避免探测行为污染现有通信。2.3 场景二地址确认后发送的免费通告ARP Announcement地址探测通过后主机需要让网内所有设备知道自己的存在。于是它发送免费 ARP 通告报文中发送者协议地址和目标协议地址都填自己的 IP。这里的 opcode 可以是 1请求也可以是 2回复具体取决于实现常见工具和操作系统多使用请求形式。通告报文的作用有两个更新其他主机的 ARP 缓存避免后续通信因为旧映射而失败。更新交换机的 MAC 地址表让交换机知道这个 MAC 从哪个端口收到帧。典型场景是设备刚开机或刚接入网络。如果之前有一台设备曾经使用过同一个 IP但后来下线了网内其他主机的缓存里可能还留着旧的 IP-MAC 映射。免费 ARP 通告可以把这些旧映射一次性刷新。2.4 场景三MAC 变更、网关切换和 HA 倒换除了配置 IP免费 ARP 还经常出现在下面几类生产事件中。第一类是网卡 MAC 地址变更。管理员更换网卡、虚拟机迁移、链路聚合切换主备成员时设备需要让交换机和其他主机重新认识自己这时发送免费 ARP 通告能缩短业务中断时间。第二类是网关或 HA 高可用切换。以 keepalived 的 VRRP 场景为例虚拟 IPVIP从主节点漂移到备节点后备节点会立刻发送免费 ARP告诉交换机“VIP 的 MAC 已经变成我的了”。如果不发这个通告交换机 MAC 表和业务主机的 ARP 缓存还指向原来的主节点流量会继续送到故障或已降级的节点上造成长时间不通。第三类是 DHCP 租约变化。DHCP 客户端在续租或重新获取地址后如果 IP 变了也会主动发送免费 ARP通知邻居刷新缓存。3. 用实验观察arping 发送tcpdump 抓包Wireshark 分析3.1 实验环境准备推荐准备两台位于同一二层网络内的 Linux 主机或者在一台物理机上用两台虚拟机挂在同一个虚拟交换机下。演示网段使用192.168.1.0/24被测网卡假设为eth0实际环境请替换为真实的接口名。先确认本机网卡和 ARP 缓存状态。ip addr show eth0 ip neigh showDebian/Ubuntu 系统安装 arpingsudo apt update sudo apt install iputils-arpingRHEL/CentOS 系统通常已经包含 arping如果没有可以通过 yum 安装 iputils 工具包。注意实验网段内不要有重要生产设备免费 ARP 会刷新相邻主机的 ARP 缓存如果用别人的正式 IP 做实验可能直接把对方搞下线。3.2 发送 ARP Probe 探测地址冲突在确认某个 IP 是否空闲时可以用 arping 的-D参数进入重复地址检测模式。sudo arping -D -I eth0 -c 3 192.168.1.100参数含义-D表示发送 DAD 探测报文-I eth0指定从 eth0 发出-c 3表示发送 3 次最后的 IP 是待检测地址。正常输出会显示发送了 3 个广播探测收到 0 个回复说明该地址当前空闲。为了模拟冲突在另一台主机的 eth0 上添加同一个 IP。sudo ip addr add 192.168.1.100/24 dev eth0然后回到第一台主机再次执行上面的 arping 探测命令。这次应能收到回复输出中会出现收到响应或超时的混合结果说明该地址已经被占用不能再分配使用。3.3 发送免费 ARP 通告并观察其他主机缓存变化在确认地址空闲后可以主动发送免费 ARP 通告模拟设备上线时的行为。sudo arping -U -I eth0 -c 3 192.168.1.100-U表示 unsolicited即主动发送免费 ARP 通告报文中发送者协议地址和目标协议地址都是192.168.1.100。也可以使用-A参数此时发送的是 opcode 为 2 的 ARP 回复形式作用类似。在另一台主机上观察缓存变化ip neigh show 192.168.1.100第一次执行时可能没有该条记录执行免费 ARP 通告后再执行就能看到当前缓存中 192.168.1.100 对应的 MAC 已经是发送方网卡的 MAC。3.4 如何用 Wireshark 快速定位重复地址抓包时可以使用如下命令或者在 Wireshark 里使用捕捉过滤器。sudo tcpdump -i eth0 -nn -e ether proto 0x0806-nn不做主机名和服务名解析-e显示链路层 MAC 地址ether proto 0x0806只抓 ARP 报文。执行 arping -D 时tcpdump 输出大致如下。Request who-has 192.168.1.100 tell 0.0.0.0, length 28执行 arping -U 时输出一般类似。Request who-has 192.168.1.100 (broadcast) tell 192.168.1.100, length 28在 Wireshark 中观察三个要点EtherType 是否为 0x0806opcode 字段是 1 还是 2发送者协议地址和目标协议地址是否相同或者发送者协议地址是否为 0.0.0.0。满足后两种特征之一就属于免费 ARP 相关报文。4. 操作系统里的免费 ARP 与 DAD 行为4.1 Linux 配置静态 IP 时发生了什么在 Linux 上通过ip addr为接口添加 IPv4 地址时内核默认会启动重复地址检测除非显式带上了nodad标志。sudo ip addr add 192.168.1.100/24 dev eth0内核发送 DAD 探测的次数由 sysctl 参数控制。sysctl net.ipv4.conf.eth0.dad_transmits sysctl net.ipv4.conf.eth0.arp_notifydad_transmits表示发送 DAD 探测报文的次数。如果检测到网络中存在相同 IP不同版本内核的表现会有差异常见结果是内核记录类似IPv4: duplicate address detected的日志地址能否继续使用取决于内核版本和添加方式。因此生产环境不能只依赖系统日志还需要在业务层做一次主动探测确认。arp_notify控制接口状态变化时是否发送免费 ARP 通告默认值为 0关闭状态。在链路聚合、bond 主备切换等场景中设置arp_notify1可以让内核在接口变为可用时主动通告缩短故障切换时间。通过 NetworkManager 或 netplan 配置静态 IP 时底层仍会走内核的 DAD 流程只是配置文件由上层工具接管。4.2 Windows 在配置静态 IP 时怎么检测冲突Windows 在网卡适配器里填写静态 IP 并确认后系统同样会发送 ARP 探测和通告。如果检测到地址冲突桌面右下角会弹出提示说明该 IP 地址已经和其他网络设备冲突系统日志里通常会有 Tcpip 来源的警告事件。查看当前主机上的 IPv4 地址和状态可以执行以下命令。ipconfig /all netsh interface ipv4 show ipaddressesWindows 的ArpRetryCount注册表参数控制发送 ARP 探测的重试次数默认值为 3。这个值过小可能导致在繁忙网段中漏探过大则会拖慢地址配置过程一般不需要手工修改。排查冲突时优先看系统事件日志冲突事件比抓包更容易定位。4.3 DHCP 环境里的免费 ARP 和 DHCPDECLINEDHCP 场景中同样会用到免费 ARP。DHCP 客户端从服务器拿到地址后部分客户端会先做 ARP 探测确认地址没有被手动配置的静态 IP 占用。如果发现冲突客户端向 DHCP 服务器发送 DHCPDECLINE 消息服务器收到后会把这个地址标记为不可分配并重新提供其他地址。这个机制解释了为什么 DHCP 池明明没有重叠某些设备仍然获得冲突地址很可能是网内有人把静态 IP 配置在了 DHCP 池的地址范围内。排查时不能只看 DHCP 服务器的租约列表还要结合网内静态 IP 台账一起核对。5. 常见 IP 冲突现象与排查路径5.1 现象一配置 IP 后提示“地址已在网络中”这种现象最直接另一台设备已经占用了同一个 IP新配置的设备在 DAD 阶段收到了回复于是报冲突。常见原因有地址台账混乱两个管理员分别分配了同一个 IP。静态 IP 与 DHCP 池重叠。设备休眠后唤醒重新配置地址时对方恰好在线。arp 缓存残留导致误判虽然概率低但不能排除。检查方式先确认本机 IP 和 MAC再用 arping -D 手动探测最后抓包确认是否有回复。arping -D -I eth0 -c 3 192.168.1.100如果探测收到回复立即记录回复方的 MAC再通过交换机show mac address-table找到对应端口顺着端口定位物理设备。5.2 现象二设备能上网但网关 ARP 缓存一直指向错误 MAC典型表现是业务时断时续ping 网关偶尔丢包重启网关后恢复一段时间过一会儿又复发。这类问题往往不是 IP 重复而是 MAC 重复或免费 ARP 刷脏了缓存。可能原因如下虚拟机克隆后没有重新生成 MAC多台虚拟机共用同一个 MAC。网卡更换后旧设备仍然在线旧设备通过免费 ARP 通告了错误映射。交换机 MAC 地址表在两个端口之间抖动导致转发不稳定。检查顺序在被影响主机上执行ip neigh show 网关IP确认网关 MAC 是否和网关设备真实 MAC 一致再到交换机上查看 MAC 表项出现在哪个端口最后在局域网内抓 ARP 报文看是否有异常的免费 ARP 通告把映射改掉。5.3 现象三交换机或安全设备拦截了免费 ARP部分交换机默认开启 ARP 安全检查或端口安全策略可能丢弃来源不可信的 ARP 报文。这会导致两个结果DAD 探测检测不到真实冲突或者设备上线后邻居缓存长时间不刷新。检查方式查看交换机上 ARP Inspection 或端口安全的计数器和日志。查看是否配置了 ARP 限速免费 ARP 短时间内高频发送会被限速丢弃。查看无线网络的客户端隔离策略隔离模式会阻止客户端之间直接收 ARP。处理时要把设备端口配置为受信任端口或者放行特定 VLAN 内的免费 ARP同时保留对大量异常的 ARP 报文的监控告警。5.4 冲突排查顺序清单下面的表格可以作为每次处理 IP 冲突时的固定动作。步骤命令或操作预期结果异常说明1ip addr show或ipconfig /all本机 IP、掩码、MAC、网关正确掩码或网关写错会造成间接问题2arping -D -I eth0 -c 3 候选IP无回复代表可用有回复代表地址被占用3ip neigh show网关和关键主机映射正确映射异常时记下 MAC4tcpdump -i eth0 -nn -e ether proto 0x0806能看到本地探测和通告抓不到可能被交换机丢弃5交换机查询 MAC 表每个 MAC 只出现在一个端口MAC flapping 说明有重复 MAC6核对 DHCP 租约和静态台账地址无重叠静态 IP 与 DHCP 池重叠是常见根因6. 生产环境里的免费 ARP 最佳实践6.1 静态 IP 分配前的预检为服务器或网络设备分配静态 IP 前先做三步预检。第一步核对台账。确认目标 IP 不在其他设备的静态分配记录里也不落在 DHCP 池范围内。这一步靠工具解决不了必须依赖制度建议在 CMDB 或网管系统里维护 IP 地址表。第二步使用 arping -D 做实际探测。不要只依赖 ping因为很多主机禁 ping但 ARP 探测是二层广播行为只要目标在线就能收到回复。第三步编写批量配置脚本时给 DAD 留足时间。脚本里连续执行ip addr add后立即启动服务可能还没等 DAD 结束就开始通信容易在冲突场景下产生错误行为。正确的顺序是添加地址、等待探测完成、确认无告警再拉起业务。6.2 集群和高可用场景必须依赖免费 ARP 更新缓存Keepalived、VRRP 等主备方案能否在切换后立刻接管流量很大程度取决于备节点是否及时发送免费 ARP。若切换后客户端仍然访问旧 MAC流量会继续发往故障节点。在生产环境建议做如下检查主备切换演练时同时抓取交换机端口和客户端上的 ARP 报文确认切换后能看到备节点发出的免费 ARP。若 keepalived 的配置中关闭了 gratuitous ARP 相关选项切换后要手工通过脚本执行arping -U通告。检查交换机是否对该接口启用了 ARP 报文限速避免切换瞬间的大量通告被丢弃。Linux bond 主备模式下可以设置arp_notify1让内核在链路切换时主动发送免费 ARP减少对端缓存老化等待时间。6.3 免费 ARP 与 ARP 欺骗的边界免费 ARP 本身是正常机制但攻击者也可能伪造免费 ARP 报文把某个 IP 的 MAC 改成攻击者的 MAC从而截获通信这就是通常说的 ARP 欺骗或 ARP 缓存投毒。区别不在报文类型而在于发送者是否合法。在合规的生产环境中防护手段集中在网络设备侧交换机启用 Dynamic ARP InspectionDAI对非信任端口的 ARP 报文做 IP-MAC 绑定校验关键服务器使用静态 ARP 条目部署 ARP 监控对短时间高频发送免费 ARP 的设备告警。学习实验时也应在隔离网段操作不要在企业办公网随意发送免费 ARP 通告。6.4 深入学习路径理解免费 ARP 和地址冲突检测建议按以下顺序继续深入。阅读 RFC 826掌握 ARP 报文字段和基本交互。阅读 RFC 5227重点看 IPv4 地址冲突检测的探测、通告和退避算法。对比 IPv6 的邻居发现协议NDPIPv6 使用邻居请求和邻居通告完成类似功能。阅读 Linux 内核网络源码中 ARP 相关实现观察arp_notify、dad_transmits等参数的实际触发逻辑。在实验环境把主备切换、MAC 变更、VM 克隆这几种场景完整演练一遍。如果只记一句话配置静态 IP 之前先花两分钟做一次免费 ARP 探测当网关缓存不对、主备切换不生效时优先怀疑免费 ARP 没有发出去或者被交换机策略拦掉了。把这条链路想清楚很多网络问题都能快速定位。