局域网ARP欺骗防御实战:从断网排查到DAI落地
先说一个很多人都会遇到的场景办公室网络用了两年一直挺稳突然某天开始全体间歇性断网ping网关一会儿通一会儿断把路由器重启了能好十来分钟然后继续抽风。排查了一圈硬件没问题、运营商说光猫信号正常最后一抓包才发现问题根本不在出口而是在内网——有人通过ARP欺骗在冒充网关。这篇文章想聊的就是ARP防御这件事。我先把话放在前面ARP协议本身的设计在今天的网络环境下可以说“裸奔”绝大多数局域网攻击都是从这里开刀的。但好消息是只要理解了它的攻击链路防御手段其实不难落地从家用路由器到园区交换机都有对应方案。如果你想搞清楚局域网里“频繁掉线”的真正原因或者想在公司、学校的网络里做点靠谱的基础防护这篇内容应该对你有用。1. 从一次“幽灵断网”说起ARP欺骗是怎么让全办公室都“迷路”的1.1 ARP表就是局域网里的“通讯录”但通讯录不是不能改的解释ARP欺骗之前得先理解ARP协议在干嘛。以太网里两台设备要通信靠的不是IP地址而是MAC地址——你可以把IP理解成“人名”MAC理解成“门牌号”。当一台电脑想访问网关时它先要拿到网关IP对应的MAC地址这个“查门牌号”的动作就是ARP协议完成的。具体流程很简单设备发送一个广播问“192.168.1.1这个IP的门牌号是多少”整个局域网都能听到这个广播网关会回复自己的MAC地址然后请求方把这条映射关系写进本地的ARP缓存表。下次要发包的时候就直接查缓存不再广播了。问题就出在这张ARP缓存表上。协议设计的时候没有校验任何东西——谁来回复都可以先到先得后到的还能覆盖之前的记录。这在当年可信内网的环境下没太大问题但放在今天这个任何设备都随便能接入的局域网里等于把通讯录的编辑权限开放给了所有人。1.2 攻击路径拆解网关欺骗、中间人监听、ARP洪泛我见过太多网络管理员一遇到断网就先怪运营商、怪光猫实际上内网被ARP欺骗的情况至少占了三四成。常见的攻击手法无非下面这几种网关欺骗最常见直接导致全网断网攻击者不断发送伪造的ARP应答宣称“我就是网关”把自己的MAC地址和网关IP绑定在一起。于是所有终端的ARP缓存表都把网关MAC指向了攻击者的设备终端访问互联网的数据全都被送到了攻击者那里。如果攻击者不作转发就是全网瘫痪如果做转发就变成中间人。中间人监听攻击者一边骗终端说“我是网关”一边骗网关说“我是终端”数据就在攻击者手里过了一圈。这个场景比断网更危险因为终端和服务器都感知不到异常但所有流量内容都被看光了。ARP洪泛通过疯狂发送大量伪造ARP报文塞满交换机的MAC地址表导致正常的二层转发也开始广播洪泛全网变成“慢动作”掉包率急剧上升。1.3 协议为什么敢这么“裸奔”很多人会问ARP协议搞成这样为什么不改答案是没法大改因为它是IPv4以太网的基础设施全网设备都在依赖它。IPv6里换成了NDP邻居发现协议但NDP借鉴了ARP的教训加入了SEND安全机制然而实际网络里大量设备默认并不启用SEND所以IPv6环境下类似问题照样存在。明白这一点之后你就能理解为什么防御ARP攻击不能只靠某一个点的设置而要做分层防护。后面几节我会按“先判断、再选型、后落地”的思路把方案讲清楚。2. 不动一台设备几条命令和一次抓包先判断网里有没有“内鬼”2.1 Windows下的四步快速排查判断局域网有没有ARP欺骗其实就是检查一件事情网关IP对应的真实MAC地址是否被篡改。在Windows上按下WinR输入cmd打开命令行按顺序执行下面这些操作第一步正常ping一下网关确保ARP缓存里确实有网关的记录ping 192.168.1.1 -n 4第二步把当前的ARP缓存表打出来arp -a找到网关IP所在的那一行记住它显示的MAC地址。这个MAC分为两种情况如果显示的是ff-ff-ff-ff-ff-ff或者一堆00-00-00-00-00-00说明刚开机还没获取到有效的映射重新ping一下再看如果显示的是一个具体的MAC把这个地址抄下来。第三步去路由器后台或者网络设备管理界面查一下网关设备真实的MAC地址。把抄下来的地址和后台显示的一对比不一致基本就能判定有人撒谎。第四步隔几分钟再执行一次arp -a。如果发现同一个IP对应的MAC在不停地变化或者一个MAC对应了很多个IP地址那几乎可以确定网络里存在ARP欺骗。这套方法有个前提你得先知道网关的真实MAC。我建议在网络刚装好、确定没问题的时候就把所有关键设备的IP-MAC对应关系记录成一张表后面再排查就方便多了。2.2 Linux下的排查思路和简易监测脚本Linux下的排查逻辑和Windows一致只是命令不同。先用ip neigh show | grep 192.168.1.1这条命令会输出网关IP对应的MAC地址和状态标志把MAC和网关设备真实地址比对即可。如果想更直观地观察MAC是否频繁变化可以写一个简单的bash循环每两秒记录一次while true; do echo $(date %H:%M:%S) $(ip neigh show 192.168.1.1 | awk {print $5}) /tmp/gw_mac_watch.log sleep 2 done跑个五分钟后查看日志sort -k2 /tmp/gw_mac_watch.log | awk {print $2} | uniq -c如果日志里出现了两个不同的MAC地址说明网关MAC在变化基本可以实锤存在ARP欺骗。我当年排查的时候就是用这个思路把日志甩到老板面前后面采购防御设备就顺畅多了。2.3 Wireshark抓包定位攻击源头命令排查能确认“有内鬼”但抓包才能告诉你“内鬼是谁”。把笔记本接到受害网络中打开Wireshark在过滤框里输入arp然后观察ARP报文。正常情况下局域网里ARP流量很少主要是广播查询。如果看到某个MAC地址在疯狂发送who-has或者is-at的应答报文而且应答内容一直在宣称自己是网关IP那这个MAC就是攻击者的设备。几个常用的过滤表达式可以记一下arp.opcode 2只看ARP应答报文arp.src.proto_ipv4 192.168.1.1只看声称自己是指定IP的应答eth.src与arp.src.proto_ipv4的组合用来观察同一来源MAC在冒充多少IP拿到攻击者的MAC之后再用交换机的display mac-address命令就能反查出它接在哪个端口、对应哪个IP接下来该清理机器还是做人前教育就看你的心情了。3. 防御不能只靠“骂内鬼”三档防御按网络规模选型3.1 第一档静态绑定与网关ARP防护适合家庭/小办公室20台终端以内防御ARP欺骗的第一档方案核心思路就四个字强行绑定。你把IP和MAC的对应关系写死别人再怎么发伪ARP应答接收方也不认。在Windows终端上可以用管理员身份执行arp -s 192.168.1.1 00-11-22-33-44-55这个命令会把网关IP固定到指定MAC上。但我必须提醒一句在多数Windows版本上重启后静态ARP条目是会被清理掉的你需要在开机后重新绑定。所以小网络里更常做的实际上是两件事一是到路由器后台把DHCP改成静态分配给每台设备按MAC分配固定IP。这样网关设备会对IP和MAC做一一对应本身就有了一层过滤能力。二是在路由器或网关设备的“安全设置”里找到“IP-MAC绑定”或“ARP防欺骗”选项把当前局域网里的合法设备全部绑定进去。家用路由器时代这个功能被无视的概率非常高但其实它就在设置界面的某个角落。这套方案在小规模网络里相当有效但维护成本会随着设备增加而迅速上升——每加一台新手机新电脑你就要在DHCP、网关防欺骗、终端静态绑定三个地方同步更新超过20台设备以后属于自虐。3.2 第二档arpwatch自动监测 DHCP静态分配适合中小办公网络50台终端以内比全网静态绑定更聪明的思路是不强行禁止只监控异常告警。arpwatch就是干这个的经典工具它监听网络中的ARP广播建立一张IP-MAC对应关系数据库一旦发现某个IP的MAC地址发生了变化或者出现了一个全新的IP-MAC组合就会实时记录并可以通过邮件或者日志的方式通知管理员。在Debian/Ubuntu上安装apt install arpwatch启动后在/var/lib/arpwatch/arp.dat里会记录它学习到的所有IP-MAC对应关系在/var/log/messages里会看到类似下面的日志arpwatch: changed ethernet address 192.168.1.100 00:11:22:33:44:55 (00:aa:bb:cc:dd:ee) arpwatch: new station 192.168.1.101 00:aa:bb:cc:dd:eenew station代表出现了一台从未见过的设备changed ethernet address代表同一个IP换了MAC地址——后者基本就是ARP欺骗现场。第二档方案的正确落地姿势是先用arpwatch跑上一周把正常终端的基线建立起来再回到网关设备上开启ARP防欺骗策略同时把DHCP改成静态分配。这一档比较适合50台以内、没有专业网络设备的中小办公网络。但我必须说句实在话如果arpwatch只装不看那它和白装没有区别这个后面我会单独讲。3.3 第三档交换机联动DHCP Snooping与DAI适合园区/正规办公网络如果你管理的网络里接入了网管型交换机那防御方案可以再上一个档次利用交换机的DHCP Snooping和DAIDynamic ARP Inspection功能。原理其实不复杂。DHCP Snooping会监听网络里的DHCP交互过程建立一张“合法IPMAC端口VLAN”的绑定表。DAI则基于这张表对非信任端口收到的每一个ARP报文做校验检查报文中声明的IP、MAC是否与绑定表完全一致不一致的直接丢弃。换句话说DAI是把ARP协议从“谁都能应答”变成了“只有经过DHCP分配并且从正确端口进来的报文才被接受”。防御效果比我前面说的所有手工方案都要强。以思科风格的交换机为例核心配置如下华为/H3C等品牌命令略有差异请以官方文档为准! 全局开启DHCP Snooping ip dhcp snooping ip dhcp snooping vlan 1,10,20 ! 上联口配置为信任口 interface GigabitEthernet0/1 ip dhcp snooping trust ! 开启DAI并验证ARP报文的合法性 ip arp inspection vlan 1,10,20 ip arp inspection validate src-mac dst-mac ip ! 面向终端的接口全部保持非信任状态默认DAI只处理非信任口配置完以后即使攻击者物理接入到某个端口他用静态IP方式发过来的ARP欺骗报文也会被DAI直接拦截因为他的IP根本没有经过DHCP Snooping的绑定表认证。这一档方案还要搭配IP Source Guard效果才好——它在交换机端口上进一步限制只有绑定表内登记的IP和MAC才能从这个端口发出报文连伪造源IP给其他主机发流量都不行。这个三层联动基本是当前有线局域网的防御天花板了。4. 一次真实事故复盘从“十分钟断一次网”到“锁定内鬼”的全过程下面这个案例是我之前帮一家20人左右的小公司处理的故障时间线很典型你可以照着这个思路去排查类似问题。现象描述公司网络从某天开始频繁断网全办公室同时掉线大概持续一两分钟后自动恢复每天能发作十多次。老板说运营商有问题但运营商来测过三次光猫和出口链路全都正常。第一阶段排查我远程连到路由器发现WAN口拨号正常但ping公网IP时有时无。把路由器的日志打开看到大量的ARP冲突告警。这时候我心里已经有七八分怀疑是内网ARP欺骗了。第二阶段确认让现场同事在断网发作时执行arp -a把网关IP对应的MAC记下来。连续记了三次之后发现同一个网关IP挂着两个不同的MAC地址其中一个是我们网关设备本身的另一个是某台Windows电脑的。接着用Wireshark抓包过滤条件arp.opcode 2 arp.src.proto_ipv4 网关IP很快就看到这台电脑的源MAC在疯狂广播“我就是网关”。第三阶段定位到核心交换机上查display mac-address找到这个MAC对应的物理端口顺藤摸瓜定位到财务室的一台办公电脑。这台机器开着代理服务和某款来路不明的“加速”软件杀掉了相关进程然后卸载再全网做了一次全盘扫描。从那天开始断网问题再没出现过。第四阶段加固故障虽然解决了但谁也不敢保证下次不会再有人乱装软件。随后我帮他们做了两件事一是把核心交换机的DHCP Snooping和DAI以及IP Source Guard全部配置上线二是下载了NWAP的监控工具类似arpwatch定期自动比对IP-MAC变化并推送告警。防御策略上线后跑了整整两周再没有出现异常。说句实话这类事故的处理难点从来不是技术本身而是“找不到肇事者”和“防御不落地”。很多公司装了一堆安全软件却连DAI都没开等于锁住了大门却把窗户敞开。5. 防御配置完以后才是真正开始几个容易忽略的细节5.1 不要忘了IPv6环境下的NDP欺骗我在帮上面那家公司做完IPv4的防御之后回头检查了一次网络配置发现交换机和终端默认都在跑IPv6而IPv6环境下对应的**NDP邻居发现协议**同样存在邻居欺骗问题。攻击者用IPv6把欺骗攻击重新做一遍监控IPv4的arpwatch根本看不到整个防御体系等于缺了一块。如果你的网络是双栈运行需要看交换机/路由器是否支持IPv6 Snooping或RA Guard这类功能能限制终端自行广播路由器通告是IPv6网络里对抗NDP欺骗的基础手段。很多中端交换机的IPv6防御特性默认是关闭的建议手工检查一遍。5.2 无线网络里的ARP威胁不能靠交换机解决有线接入可以用DAI兜底但无线终端是通过AP接入的普通交换机的DAI管不到它们经过WLAN控制器之后的ARP报文。无线的防御思路通常是这样的在AC或AP侧开启无线网络隔离/客户端过滤同时把访客网络、办公网络、IoT设备划分到不同的VLAN这样即使有终端被攻破威胁范围也被限制在一个广播域内。我知道无线网络隔离这个功能很多网络管理员嫌麻烦不开但在经历过一次“打印机变成跳板”的事件之后我会很建议大家认真对待它。5.3 告警日志没人看防御等于白做无论你用arpwatch、商用监控软件还是交换机的Syslog告警日志都会在最初几天刷屏。原因很简单手机休眠唤醒、DHCP租约重新分配、会议室临时接入新设备都会触发IP-MAC变化告警。如果天天被这些正常告警折磨很快就会进入“狼来了”状态真正攻击发生时的告警也会被一带而过。我的习惯做法是上线监测后的第一周每天看一遍第二周开始每周固定花10分钟过一遍。同时把确认过的正常设备整理成一张白名单放进监控系统里后续告警量会下降非常多。5.4 防御上线要“先监后堵”避免误杀正常终端这一点最容易被忽视。有人一听说DAI能防ARP欺骗第二天直接在核心交换机上开了DAI结果全网断网原因是没有预先让DHCP Snooping学习完所有合法终端的绑定关系导致DAI把所有终端都当成非法报文拦了。正确顺序一定是先开DHCP Snooping跑一段时间让绑定表建立起来再开DAI先在接入层测试端口验证再逐步扩大范围。如果你管理的网络规模比较大千万别在核心设备上直接动刀尽量选择接入层交换机先做试点验证。还有一个实操层面的提醒配置DAI之前一定要确认交换机上配置了DHCP服务器或者有静态绑定的合法租约否则没有绑定表的DAI就是一座没有地基的楼。我见过不少同行折腾半天找不到原因结果是自己把DAI开在了一台没开DHCP Snooping的旧交换机上所有合法ARP报文被当异常清掉了。所以每次配置完之后拿一台刚接入的新设备测试一次能不能正常获取IP和访问网关这十秒钟的验证比你后来排查一整天都值。