
上午十点我们办公室的财务大姐喊了一声网怎么断了紧接着开发、测试陆续反映系统卡死整个内网仿佛被人掐住了脖子。我用arp -a一看网关MAC地址居然变成了另一台并不存在的设备——典型的ARP欺诈攻击。这种攻击在内网里太常见了但真正理解它的人并不多。ARP欺诈攻击ARP欺骗是局域网里最经典、也最容易被忽视的安全问题。它利用的是ARP协议本身的盲信机制设备之间互相信任从不验证应答信息的真实性。攻击者只要伪造一个ARP应答报文就能让目标设备的ARP缓存表被篡改从而把流量引向自己或让通信直接中断。这篇文章我会从ARP协议原理、报文格式出发结合GNS3实验环境下的抓包分析把欺诈攻击的玩法、检测思路以及基于DHCP Snooping、DAI动态ARP检测的防御方案完整拆解一遍。不管是网络工程师、安全运维还是刚学网络协议的学生都能从中拿到可直接落地的方法。1. ARP协议的真实面目一个从不验明正身的局域网信使在聊欺诈攻击之前必须先把ARP协议本身的基因缺陷讲清楚。很多人知道ARP是“地址解析协议”却不知道它到底在解析什么、为什么设计得如此脆弱。1.1 IP地址和MAC地址一张“姓名”和“身份证号”的关系在局域网里每个设备都有两个地址IP地址相当于你门牌上的“姓名”是逻辑地址用来在网络层定位MAC地址则是出厂烧在网卡里的“身份证号”是物理地址用来在数据链路层完成真正的交付。电脑A要发给电脑B一个IP数据包但数据包到了二层网络交换机只认MAC地址不认IP地址。所以发送方必须想办法把我要找的这个IP翻译成对应的MAC地址这个翻译工作就是ARP干的。理解地址解析的另一面你就能明白为什么ARP欺诈攻击这么容易得手整个过程依赖的是问一下、答一下的信任模式。试想一下你在小区里喊了一嗓子“张三在家吗”结果旁边路过一个陌生人说“我就是张三”你信了然后把家里钥匙交给了他。ARP协议本质上就是这么干的。1.2 广播请求与单播响应ARP的完整工作流程我把一次正常的ARP交互拆成几个步骤这里也顺便解释为什么抓包时看到的是“一波广播带一波单播”。主机A要向IP为192.168.1.2的主机B发包先查自己的ARP缓存表。如果缓存里有对应表项直接用表中的MAC地址封装二层帧不发ARP。如果没查到主机A会构造一个ARP请求报文源IP填自己的IP源MAC填自己的MAC目标IP填192.168.1.2目标MAC填全零。这个请求以广播方式发出去局域网内所有设备都能收到。主机B收到广播请求后发现目标IP是自己就回复一个ARP应答报文把自己的MAC地址填进去目标MAC填主机A的MAC以单播方式发回去。主机A收到应答后把“IP 192.168.1.2 → MAC xx:xx:xx:xx:xx:xx”这条映射关系写入ARP缓存表然后用它封装数据包。整个过程还有个关键细节主机B在发出应答之前会先把主机A的IP-MAC映射写入自己的ARP缓存。这意味着攻击者不需要等到有人问它就能主动“塞”给你一条错误缓存。ARP缓存表本身也是动态老化机制默认过期时间2到10分钟不等这为攻击者反复投毒创造了窗口。1.3 免费ARPGratuitous ARP与IP冲突检测ARP还有一种特殊形态叫免费ARP设备主动广播一个ARP请求但目标是自己的IP。表面上看起来像我在找我自己实际上它有两个作用。一是通知全网我的MAC地址是这个你们都更新缓存二是探测IP冲突——如果收到别人回应说明这个IP已经被占用了。热词里提到的免费ARP可以用来探测IP地址是否冲突指的就是这个场景。但免费ARP也是一把双刃剑攻击者可以伪造免费ARP向全网宣告网关IP的MAC地址是我的所有设备都会默默接受。这就是ARP欺诈攻击最常用的广播投毒手段后面我会详细展开。2. 把ARP报文扒开看头部字段、GNS3实验与抓包观察光知道流程还不够想彻底识别和防御ARP欺诈必须能看懂报文里的每一个字段。我在GNS3里搭了个实验环境两台路由器分别连接两台主机模拟跨网段通信顺便抓包分析ARP报文转发过程。这个实验也是很多网络课程里的经典练习。2.1 GNS3实验拓扑与基础配置我用GNS3搭的最小化拓扑是这样的R1路由器1连接Host1接口IP为192.168.1.1/24R2路由器2连接Host2接口IP为192.168.2.1/24R1和R2之间用串口或以太口互联互联网段为10.0.12.0/30Host1访问Host2192.168.2.2时需要经过R1 → R2 → Host2两跳路由配置好接口IP后我在Host1上用ping触发一次跨网段通信然后在R1的入接口和出接口分别抓包。这个过程能非常直观地看到同一个IP数据包在每一跳到达路由器后都会触发新的ARP解析源MAC和目标MAC在不同网段接口上会不断变化而IP层源目地址始终不变。这就是IP数据转发报文ARP协议在真实转发路径上的体现。2.2 ARP报文头部字段逐项解读抓包后我们能在Wireshark里看到完整的ARP报文这里我按字段拆解一遍这个表建议保存分析问题时逐字段对照很有用。字段长度含义与攻击关注点硬件类型2字节值为1表示以太网攻击工具会正常填充基本不伪造协议类型2字节值为0x0800表示IPv4同样不会被伪造硬件地址长度1字节以太网MAC地址长度固定为6协议地址长度1字节IPv4地址长度固定为4操作码Opcode2字节1请求2应答。攻击者主要用应答帧或免费ARP来投毒发送方MAC6字节攻击者会伪造填受害者的IP但填自己的MAC发送方IP4字节攻击者会伪造填网关IP或受害主机IP目标MAC6字节请求帧中通常全零应答帧填请求方MAC攻击者也常伪造目标IP4字节请求帧填要解析的IP应答帧填请求方IP注意二层帧头里还有两个字段源MAC和目的MAC。正常情况下ARP报文本身内部的“发送方硬件地址”会和二层帧头源MAC一致但在欺诈攻击中两者经常不一致。检测时比对这两个字段就是一条快速识别线索。2.3 抓包结果里那些值得留意的细节我在实验里观察到几个容易被忽略但很重要的细节这对后面做检测非常有帮助。ARP请求发到广播MACFF:FF:FF:FF:FF:FF但ARP应答是单播。攻击者如果大量发“看似应答”的广播帧那基本就是投毒或扫描行为。同一台设备连续发出多条“发送方IP是网关”的ARP应答且发送方MAC频繁变化这是明显的攻击迹象。正常网关设备不会频繁变动自己的MAC。跨网段通信时主机发出的IP数据包二层目的MAC是默认网关的MAC而不是最终目标主机IP对应的MAC。如果你抓到一个数据包的目的IP是远端主机但二层MAC是网关的这就说明ARP解析工作正常。3. 欺诈攻击的三类主要玩法为什么网关MAC会被“调包”搞懂了协议原语攻击手段其实就是在正常流程上做“恶意变形”。我在这里把最主流的三种形式整理出来中心思想不变伪造ARP报文污染目标的ARP缓存让自己成为通信链路里的“隐形中间人”。3.1 网关欺骗双向欺骗流量“免费经过”攻击者网关欺骗是最常见的欺诈手法。攻击者向受害主机发送伪造的ARP应答宣称网关IP对应的MAC是我同时向网关发送伪造的应答宣称受害主机IP对应的MAC也是我。这样一来受害主机发给网关的流量会先到攻击者网关回给受害主机的流量也会先经过攻击者。攻击者在这个位置就能干任何事抓包分析明文密码、篡改网页内容、把敏感流量转发到钓鱼服务器这就是典型中间人攻击。同时通信两端毫不知情因为它们收到的数据最终都能到对方那里只是绕了一个“看不见的弯”。我在排障时遇到过一个案例核心业务系统响应偶尔变慢排查链路和服务器都正常最后发现是有人做了双向欺骗把几十台办公电脑的默认网关流量都吸到自己的笔记本上做抓包测试。整栋楼的人都在给他“免费送礼”。3.2 单向欺骗与拒绝服务让目标彻底“断网”如果攻击者只向受害主机发送“网关IP的MAC是XX”的伪造应答但XX其实是攻击者编造的或已不存在设备的MAC那么受害主机会把正常的网关缓存覆盖掉发出的所有出站流量都会被丢进黑洞。这就是ARP拒绝服务。这种攻击最讨厌的地方在于隐蔽性极强受害主机看起来网络正常工作但就是上不了网、访问不了内网服务器。你把网线、网卡、交换机端口都查一遍可能都没问题最后打开ARP缓存一看网关MAC地址变成了个陌生值。还有一种变体是“ARP泛洪”攻击者短时间内发送大量携带随机MAC的ARP报文把交换机CPU或目标设备的缓存表塞满导致正常ARP解析无法完成间接形成拒绝服务。虽然不如直接欺骗精准但在无线网络里很常见。3.3 免费ARP投毒不需要应答也不需要被问前面提到免费ARP是设备主动宣告自己IP-MAC映射的消息正常情况下用来做IP冲突检测或网卡切换通告。攻击者直接伪造一条免费ARP广播“我是网关IP我的MAC是攻击者的MAC”全网设备都会更新自己的缓存。之所以把免费ARP单独拎出来讲是因为它连“等别人来问”都不需要完全主动出击攻击成本极低。你只要有一台接入网内的设备不需要和任何人通信也能把网关的ARP缓存污染掉。这也是为什么“免费ARP可以用来探测IP地址是否冲突”这个功能会被安全设备反过来利用来检测异常宣告。我在防御方案部分会再展开。4. 从检测到防御完整堵住ARP欺诈的几条路线了解攻击后必须给出能落地的防御手段。我一直强调一句话ARP攻击不是洪水猛兽只要在接入层控制住谁能说话、说什么话就成功了一大半。4.1 基础防御静态ARP表与MAC地址绑定最直接的思路是“不信动态宣告”。在关键设备上手动配置静态ARP表项让网关IP固定绑定真实网关MAC地址。Windows命令是这样的arp -s 192.168.1.1 00-11-22-33-44-55Linux下用arp -s 192.168.1.1 00:11:22:33:44:55静态ARP的优点是零成本、纯终端配置就能实现缺点是维护麻烦且只在单机上生效。内网里一百台电脑你不能每台都去敲命令吧。而且如果网关设备本身更换了MAC比如换了网卡、做了VRRP主备切换静态缓存反而会成为新的故障源。所以它比较适合保护个别重点服务器不适合全网络推广。4.2 交换机端口安全与限制动态ARP学习在接入层交换机上可以做端口安全配置限制一个端口允许通过的MAC地址数量防止攻击者非法接入。Cisco设备大致类似Switch(config)# interface GigabitEthernet0/1 Switch(config-if)# switchport port-security Switch(config-if)# switchport port-security maximum 2 Switch(config-if)# switchport port-security violation shutdown这个配置的思路是每个终端端口只允许1-2个MAC地址通过超过就关闭端口或丢弃报文。它能挡住一部分私自接交换机、接无线AP的物理层攻击但对已经通过合法端口发出的伪造ARP报文无能为力。因为端口安全的限制对象是源MAC地址而ARP欺诈攻击里的以太网帧头源MAC往往也是伪造的这就需要在更深的协议层做校验。4.3 DHCP Snooping加DAI核心方案这是企业网络里最成熟、也最值得推荐的防御组合正好回应热词里那句arp detect 通过dhcp snooping必须要配置。DHCP Snooping的核心思路是建立一个“信任边界”交换机连接合法DHCP服务器的端口设为信任端口面向用户的端口设为非信任端口。非信任端口上收到的DHCP服务器报文一律丢弃同时交换机监听所有DHCP交互过程建立一张“IP-MAC-端口-VLAN”的绑定数据库。Dynamic ARP InspectionDAI则利用DHCP Snooping生成的这张绑定表对非信任端口收到的每个ARP报文做合法性校验报文里的发送方IP和发送方MAC必须在绑定表里有对应记录且来源端口一致才算通过否则直接丢弃同时可以记录日志或触发告警。我放一段Cisco交换机上的核心配置供参考! 启用DHCP Snooping并指定VLAN Switch(config)# ip dhcp snooping vlan 10 Switch(config)# ip dhcp snooping ! 连接DHCP服务器的上联口设为信任端口 Switch(config)# interface GigabitEthernet0/24 Switch(config-if)# ip dhcp snooping trust ! 启用DAI并默认所有端口不接受不可信ARP Switch(config)# ip arp inspection vlan 10 ! 也可以显式关闭某个端口的DAI慎用 Switch(config)# interface GigabitEthernet0/1 Switch(config-if)# ip arp inspection trust这个方案的逻辑很明显DAI查ARP、DHCP Snooping建表两者联动从源头把伪造ARP拦在接入端口之外。为什么说“必须要配置”因为没有DHCP Snooping绑定的绑定表DAI就没有可校验的“白名单”校验自然无从谈起。如果网络里用的是静态IP而非DHCP则可以通过ip dhcp snooping binding手工添加静态绑定或者给端口配置ip arp inspection时配合ACL来放行。4.4 终端侧检测工具免费ARP与缓存监控的合理使用对于没有条件改交换机的场景终端侧的轻量检测也可以做起来。比如使用ArpWatch或自我实现的ARP缓存监控脚本周期检查网关IP对应的MAC是否发生变化或者部署一个被动监听程序收集网络中的免费ARP报文比对“宣告网关IP的MAC”是否始终一致。为什么“免费ARP可以用来探测IP地址是否冲突”在这里有用因为在正常场景下网络中不应该频繁出现多个不同MAC争抢同一个IP的免费ARP宣告。一旦发现同一IP地址持续被多个MAC宣告就说明存在IP冲突或ARP欺骗。这类终端监控工具不能阻止攻击但能让你在第一时间发现问题、定位攻击源端口。5. 实战排查链路从“网断了”到“找到攻击源”最后分享一次完整的排障过程希望给正在被类似问题折磨的人一条清晰的排查链路。5.1 第一步确认症状别在物理链路里浪费时间遇到大面积断网或间歇性掉线先别急着换网线。先ping一下网关通不通再ping一个外网地址比如223.5.5.5看是整体不通还是只有部分业务不通。然后立刻在所有受影响的机器上查看ARP缓存arp -a重点看默认网关那条记录的MAC地址是否一致。如果多台机器显示同一个异常的网关MAC那几乎可以锁定是ARP欺骗。如果所有机器看到的网关MAC都和正常值一样才把精力转向物理链路和路由设备。5.2 第二步抓包定位攻击特征我在核心交换机上做端口镜像把镜像流量导入Wireshark然后用过滤表达式筛选ARP包arp观察以下行为特征同一发送方MAC大量发送携带不同发送方IP的ARP应答ARP应答的目的MAC是广播地址正常应答应该单播网关IP对应的MAC在短时间内频繁变化出现大量源MAC不断变化的ARP请求疑似扫描或泛洪只要命中任意两条基本就能判定内网存在ARP欺诈攻击。接下来定位攻击源记录这些异常ARP报文是在哪个端口被镜像到的。如果条件不允许镜像就直接看交换机的MAC地址表查看异常MAC对应的端口号。5.3 第三步用绑定表和信任端口完成止损确认攻击端口后有两种止损手段。第一是在交换机关闭该端口shutdown物理隔离第二是部署DHCP Snooping加DAI从机制上让伪造ARP发不出来。如果你已经配置了DAI此时应该在交换机日志里看到类似icmp receive packet... invalid arp...或ARP inspection的丢弃记录这些日志可以直接作为处置证据。我个人在处置这类问题时还有一个习惯事后把攻击者的MAC和IP加入“黑名单”台账同时检查接入交换机里是否还有私接的无线AP或傻瓜交换机——很多ARP攻击源就藏在这些“不受控”的二级网络后面。物理层失控协议层防得再好也是白搭。5.4 第四步加固收尾排除“内鬼”风险处理完攻击源只是第一步还需要确认“内鬼”是怎么进来的。常见原因包括办公区开放网口未做准入控制、访客WiFi与办公网未隔离、有人私自拉了一台无线路由器把办公网和家庭网桥接在一起。每一条都是ARP攻击的温床。加固方向上除了前面说的DHCP Snooping加DAI我还建议把关键网段做成802.1X准入认证或者至少在接入层做MAC白名单准入。把“谁能插上线就能进网”变成“认证通过才能通信”ARP欺诈的空间就会被压缩到极小。我在实际项目中做过统计部署DHCP Snooping加DAI并配合端口安全后小型办公网因ARP攻击导致的“莫名掉线”投诉直接降为零。这不是什么高深技术但它验证了一件事——ARP欺诈的根源是协议信任模型太薄弱而防御的关键从来不是去修复协议而是用一层层管理手段把信任变成审计。