
ARP协议这东西说它简单是真简单总共就两个报文类型抓包看两眼就能明白个大概可说它坑多也是真坑多我见过太多人配置完静态绑定就以为万事大吉结果换个网段、加个VLAN故障照旧。更别提那些能ping通网关但上不了外网的经典问题十有八九最后都绕回到ARP表上。这篇内容我打算把ARP从报文结构到排障实操完整捋一遍既讲清楚它为什么这么设计也把我在实际网络环境里踩过的坑和验证过的排查手法都摊开说。不管你是刚接触网络协议的新手还是已经做了几年运维、想系统梳理一遍底层机制的老手应该都能从里面找到能直接拿去用的东西。1. 为什么ARP值得单独拎出来讲1.1 一个看起来不需要存在的协议很多人学网络协议的时候会有个疑问IP地址已经能定位一台主机了为什么还要MAC地址为什么不能直接拿IP地址发数据这个问题不搞清楚ARP就永远只是个背了忘、忘了背的知识点。原因在于网络分层。IP地址是逻辑地址它的设计目标是可路由——让数据包能跨越不同网络找到目的地。但真正在物理链路上传输数据帧的时候网卡只认MAC地址不认IP。你可以把IP地址理解成快递单上的收件地址MAC地址理解成这栋楼里具体的门牌号。快递员交换机只负责把包裹送到楼里但最后送到哪个房间得看门牌号。ARP干的事情就是根据收件地址问出具体门牌号——已知对方IP求出对方MAC。这个类比虽然不完美但足够说明问题ARP是逻辑地址到物理地址的翻译官没有它IP层的数据根本落不了地。1.2 ARP在整个通信链路中的位置一次完整的局域网通信数据从应用层往下走到网络层封装成IP包再到数据链路层封装成帧。封装帧的时候必须填源MAC和目的MAC源MAC是自己的目的MAC从哪来就是从ARP表里查。查到了直接填查不到就发ARP请求去问。这里有个关键点很多人忽略ARP表是缓存的不是永久的。它有老化时间动态学习的条目过一段时间不用就会被清掉。这个设计是为了适应网络变化——万一对方换了网卡、换了IP缓存不老化就会一直往错误的地方发数据。但反过来老化也带来一个问题如果老化时间设置不当或者网络里ARP请求太频繁就会造成广播风暴或者表项震荡。这些细节后面会展开。1.3 适合谁来读这篇内容如果你属于下面几类人这篇内容应该对你有直接帮助刚学完TCP/IP四层模型想知道协议之间怎么协作的入门者做网络运维经常遇到间歇性断网能ping通但访问不了这类问题的从业者准备考网络相关认证需要把ARP机制吃透的备考者做安全相关工作想了解ARP欺骗原理和防御手段的技术人员。我尽量不堆砌RFC原文而是用为什么这么设计和实际怎么排查两条线穿插着讲读起来不会太枯燥。2. ARP报文结构拆解28字节里藏了什么2.1 报文格式逐字段说明ARP报文本身很短固定长度28字节以太网环境下。别看它短每个字段都有明确用途理解这些字段是后面分析抓包和排查故障的基础。字段长度作用说明硬件类型2字节标识链路层类型以太网填1协议类型2字节标识网络层协议IPv4填0x0800硬件地址长度1字节MAC地址长度以太网为6协议地址长度1字节IP地址长度IPv4为4操作码2字节1表示请求2表示应答发送方MAC6字节请求方的物理地址发送方IP4字节请求方的逻辑地址目标MAC6字节请求时全0未知应答时填对方MAC目标IP4字节要查询的逻辑地址这张表建议记牢尤其是操作码和两个目标字段。抓包的时候判断一个ARP包是请求还是应答看操作码最快判断请求方想找谁看目标IP。2.2 请求与应答的差异在哪ARP请求是广播发送的目的MAC填全FFF:FF:FF:FF:FF:FF意思是这个网段里所有设备都收一下。为什么必须广播因为请求方还不知道目标MAC只能广而告之。而ARP应答是单播发送的直接回给请求方因为请求方的MAC在请求报文里已经带上了。这里有个容易被忽略的细节ARP请求报文里的目标MAC字段是全0不是全F。全F是帧头里的目的MAC全0是ARP报文内部的目标MAC字段。这两个位置不一样抓包的时候别搞混。我第一次看ARP报文的时候就犯过这个迷糊盯着报文里的全0字段纳闷了半天。2.3 免费ARP和ARP探测除了常规的请求和应答实际网络里还有两种特殊ARP免费ARPGratuitous ARP发送方主动广播一个ARP请求目标IP就是自己的IP。目的有两个——一是检测网段内有没有IP冲突如果有人回应说明IP被占用了二是通知网段内其他设备更新ARP表比如自己换了MAC让大家赶紧改过来。设备刚上线、IP地址变更、主备切换的时候经常会发免费ARP。ARP探测ARP Probe在正式使用某个IP之前先发一个源IP为0.0.0.0的ARP请求目标IP是要用的那个IP。如果收到应答说明这个IP已经被别人用了不能直接用。这个机制在DHCP分配地址的时候会用到是防止IP冲突的第一道防线。注意免费ARP和ARP探测的区别在于源IP。免费ARP的源IP是自己的IPARP探测的源IP是0.0.0.0。抓包分析IP冲突问题时这个区别很关键。3. ARP工作流程从不知道到知道的完整过程3.1 同网段通信的ARP交互全过程假设主机A192.168.1.10要ping主机B192.168.1.20两台机器在同一网段A的ARP表里没有B的记录。整个过程是这样的A查自己的ARP缓存没找到192.168.1.20对应的MACA构造ARP请求源MAC是A的MAC源IP是192.168.1.10目标MAC全0目标IP是192.168.1.20以广播形式发出网段内所有设备都收到这个广播但只有IP为192.168.1.20的设备会处理它B收到请求后先把A的IP-MAC映射记到自己的ARP表里这是被动学习然后构造ARP应答单播回给AA收到应答把B的IP-MAC映射记到自己的ARP表里然后就可以正常封装数据帧发数据了。这个流程里有个很重要的机制被动学习。B在收到A的请求时顺手就把A的映射记下来了不需要额外再发一次请求。这意味着一次ARP交互双方都完成了地址解析效率很高。但也正因为被动学习的存在ARP欺骗才有了可乘之机——攻击者发一个伪造的ARP应答接收方不做验证就更新表项。这个后面讲安全的时候会细说。3.2 跨网段通信时ARP扮演什么角色跨网段通信的时候ARP的作用范围就变了。主机A192.168.1.10要访问192.168.2.20A发现目标IP不在自己网段于是把数据包发给网关192.168.1.1。这时候A发的ARP请求目标IP是网关的IP不是最终目的地的IP。也就是说跨网段通信时ARP解析的是网关的MAC不是目标主机的MAC。数据包到了网关之后网关再根据自己的路由表和ARP表决定下一跳发给谁。每一跳都做一次ARP解析逐跳转发。这个机制解释了一个常见现象如果网关的ARP表项出问题即使目标主机完全正常你也访问不了。排查跨网段故障的时候先确认网关的ARP表再看目标主机的ARP表顺序别搞反。3.3 ARP缓存表的老化与更新机制ARP缓存表不是一成不变的。动态学习的表项有老化时间不同系统的默认值不一样系统类型默认老化时间说明Linux约60秒可调通过内核参数控制Windows约15-45秒不同版本有差异网络设备通常300秒厂商实现不同老化时间到了之后表项会被标记为待删除下次要用的时候重新发起ARP请求。这个机制保证了网络变化能被及时感知但也带来一个问题如果老化时间太短ARP请求频繁增加广播流量太长网络变化感知慢。实际调优的时候要根据网络规模权衡。实操心得在终端设备密集的办公网里适当延长ARP老化时间能减少广播风暴的风险但在设备频繁上下线的环境比如无线接入场景老化时间太长反而会导致幽灵表项表现为能ping通但实际设备已经下线。4. 实操亲手抓一次ARP交互4.1 抓包环境准备要直观理解ARP最好的办法是自己抓一次包。我用的是最普通的家庭网络环境一台笔记本通过无线连到路由器另一台设备在同一网段。抓包工具用Wireshark这个没什么争议免费且功能足够。准备工作很简单确认两台设备在同一网段比如都是192.168.1.x在笔记本上启动Wireshark选择正在使用的网卡抓包过滤器填arp只看ARP报文避免被其他流量淹没先清空本机ARP缓存确保能抓到完整的请求-应答过程。清空ARP缓存的命令按系统不同# Linux系统 sudo ip neigh flush all # Windows系统管理员权限 arp -d *清空之后去ping一下同网段的另一台设备然后回Wireshark看抓到的包。4.2 抓包结果解读正常情况下应该能看到一对报文一个广播的ARP请求一个单播的ARP应答。在Wireshark里点开请求报文展开Address Resolution Protocol部分能看到前面表格里那些字段的实际值。重点看几个地方Opcode请求是1应答是2Sender IP/MAC请求方自己的地址Target IP要查询的地址Target MAC请求报文里是全0应答报文里是对方的MAC。应答报文里Sender和Target的角色互换了——原来请求方的信息变成了Target应答方的信息变成了Sender。这个角色互换是理解ARP交互的关键看懂了这一点整个流程就通了。4.3 用命令行查看ARP表抓包看的是过程看结果用命令行更直接# Linux ip neigh show # Windows arp -a # 网络设备以常见命令行为例 display arp输出里能看到IP地址、MAC地址、接口、状态动态/静态。状态这一列很重要——动态表示学习来的静态表示手动绑定的。排查故障的时候先看状态对不对再看MAC对不对。注意不同厂商网络设备的ARP表查看命令有差异但核心字段都是IP、MAC、接口、类型、老化时间这几项。记不住具体命令的时候用问号补全或者查手册别凭记忆瞎敲。5. ARP相关的典型故障与排查实录5.1 能ping通网关但上不了外网怎么查这是最经典的ARP相关故障之一。现象是ping网关正常ping外网地址不通DNS解析也失败。很多人第一反应是DNS问题或者路由问题但有时候根子在ARP上。排查思路是这样的先确认本机ARP表里网关的表项是否正确。如果网关的MAC显示不全或者明显不对比如全0说明ARP解析有问题清空ARP缓存重新学习看能否恢复正常如果重新学习后还是不对检查网关侧是否有ARP抑制或者静态绑定配置检查网段内是否有IP冲突——两台设备用了同一个IPARP应答会打架表现为表项频繁变化。我遇到过一次这种情况用户机器能ping通网关但访问任何外网地址都超时。最后查出来是网段内有人手动配了和网关相同的IP导致网关的ARP应答被干扰。这种问题用抓包最容易定位——看ARP应答是不是来自两个不同的MAC。5.2 ARP表项异常增多或频繁变化ARP表项异常增多通常意味着网段内有大量设备在频繁发ARP请求或者有扫描行为。表项频繁变化可能是IP冲突也可能是ARP欺骗。排查手法连续多次查看ARP表观察同一IP的MAC是否在变化抓包看ARP请求的来源统计哪些IP发得最频繁检查交换机端口的安全配置看是否有端口安全或者DAI动态ARP检测功能可以启用。这里要提一句ARP表项数量是有上限的不同设备上限不同。表满了之后新的ARP学习会失败表现为部分设备通信异常。网络规模大的时候要关注这个上限必要时调整或者做网段拆分。5.3 常见问题速查表现象可能原因排查动作ping网关不通本机ARP表无网关表项或表项错误清空ARP缓存重学抓包看请求是否有应答能ping通但访问慢ARP表项老化频繁反复解析检查老化时间设置观察ARP请求频率间歇性断网IP冲突或ARP欺骗抓包看应答来源MAC是否唯一跨网段访问失败网关ARP表异常登录网关查看ARP表确认下一跳解析正常新设备接入后老设备异常IP地址冲突检查新设备IP配置用ARP探测确认6. ARP安全欺骗原理与防御手段6.1 ARP欺骗为什么能成功ARP协议设计之初就没考虑安全验证——收到ARP应答不管是不是自己请求的直接更新表项。这个无条件信任的设计在可信网络里没问题但在开放环境里就是漏洞。攻击者发一个伪造的ARP应答声称网关IP对应的MAC是我的MAC接收方不做验证就更新了表项之后所有发往网关的数据都发给了攻击者。这就是中间人攻击的基础。更恶劣的是攻击者可以同时欺骗通信双方实现双向流量劫持。这个问题的根源在于ARP没有认证机制。要彻底解决得靠协议层面的改造但实际部署中更多是用检测和防护手段来缓解。6.2 静态绑定最直接但最笨的办法最直接的防御是静态绑定——手动把IP和MAC的映射写死不接受动态更新。命令示例如下# Linux添加静态ARP表项 sudo ip neigh add 192.168.1.1 lladdr AA:BB:CC:DD:EE:FF dev eth0 nud permanent # Windows添加静态表项 netsh interface ipv4 add neighbors 以太网 192.168.1.1 AA-BB-CC-DD-EE-FF静态绑定的优点是简单可靠缺点是维护成本高。设备多了绑不过来设备换网卡了还得手动改。所以实际环境里通常只对关键设备网关、服务器做静态绑定终端设备还是靠动态学习。6.3 动态ARP检测与端口安全规模大一点的网络更常用的是交换机侧的防护功能DAI动态ARP检测结合DHCP Snooping的绑定表检查ARP报文的合法性非法的直接丢弃端口安全限制每个端口允许学习的MAC数量防止MAC泛洪ARP限速限制单位时间内ARP报文的数量防止ARP风暴。这些功能需要在交换机上配置具体命令因厂商而异。配置之前要确认DHCP Snooping已经启用并且绑定表准确否则DAI可能误杀正常流量。我见过有人只开了DAI没开DHCP Snooping结果整个网段ARP全被丢弃排查了半天才发现是配置顺序问题。实操心得部署DAI之前先在镜像端口抓一段时间的ARP流量确认绑定表覆盖了所有合法设备再正式启用。直接上线风险太大一旦误杀就是大面积断网。7. 几个容易被忽略的ARP细节7.1 ARP代理与跨网段解析ARP代理Proxy ARP是个有意思的机制路由器收到ARP请求时如果目标IP不在本网段但路由可达路由器可以用自己的MAC代答让请求方以为目标就在本地。这个机制在早期网络里用来做透明子网划分现在用得少了但在某些场景下还会遇到。启用Proxy ARP要谨慎它会让网络拓扑变得不直观——明明跨网段看起来却像同网段。排查故障的时候如果不知道有Proxy ARP很容易被误导。7.2 免费ARP在双机热备中的作用双机热备场景里主备切换的时候备用设备会发免费ARP通知网段内所有设备这个VIP的MAC变了赶紧更新。如果免费ARP没发出去或者被过滤了切换后流量还是往旧设备发表现为切换不生效。排查这类问题的时候重点看切换瞬间有没有免费ARP发出以及接收方有没有正确更新表项。有些安全设备会过滤免费ARP这个要提前确认。7.3 虚拟化环境下的ARP特殊性虚拟化环境里虚拟机的MAC是虚拟的ARP行为受虚拟交换机影响。常见的问题包括MAC地址冲突克隆虚拟机没改MAC、虚拟交换机不转发广播导致ARP请求收不到、安全组规则拦截ARP等。在云环境里排查网络问题ARP往往是第一个要看的点。先确认虚拟机的ARP表能不能正常学习到网关再看安全组和网络ACL有没有放行ARP。这个顺序能省不少时间。8. 写在最后的实操体会ARP这个协议单独看每个知识点都不难难的是把它放到真实网络环境里去理解。我刚开始做运维的时候遇到网络故障总是先怀疑路由、怀疑DNS后来发现很多问题的根子就在ARP表上——表项错了、表项老了、表项被欺骗了。现在我的排查习惯是先看本机ARP表再看网关ARP表最后抓包确认交互过程。这个顺序看起来笨但覆盖了绝大多数局域网通信问题。尤其是能ping通但访问异常这类模糊现象从ARP入手往往最快定位。还有一个体会是抓包这件事不能偷懒。命令行看ARP表只能看到结果看不到过程。很多问题比如应答来自多个MAC、请求发了没回应答只有抓包才能看清楚。Wireshark的ARP过滤器用熟了排查效率会高很多。最后提一个容易被忽略的点不同厂商设备对ARP的实现有差异老化时间、表项上限、免费ARP的发送时机都可能不一样。做跨厂商组网的时候这些差异要提前确认别想当然地按一个标准来配。我吃过这个亏两台设备老化时间差了一倍结果一边表项还在、一边已经老化通信时通时断查了很久才发现是参数不一致。