ARP欺骗原理与防御实战:从协议拆解到GNS3实验复现
做网络运维这些年我在群里被问得最多的一个场景是这样的某天办公室里有人喊“上不了网了”你过去一看所有人 ping 网关都通但打开网页就是转圈邮箱也连不上最后抓包一看全网PC的ARP表里网关MAC变成了同一个不认识的地址。这就是典型的 ARP 欺诈攻击也叫 ARP 欺骗。这类问题从协议层面看并不复杂但它的危害和排查难度往往超乎想象——因为攻击者伪装得和正常的网关一模一样你的网络设备、终端甚至安全软件都很难察觉异常。写这篇东西的初衷是想把 ARP 从原理到报文、从攻击到防御、从理论到 GNS3 实验复现完整地串一遍。不管你是刚接触网络的在校生还是工作中经常处理局域网故障的网工、运维甚至是做“以太网与ARP协议分析”这类实验题做到头大的同学这篇文章都会给你一条可以直接照着做的完整路径。我自己在 GNS3 里反复搭过环境、抓过包、也亲手发起过欺骗攻击下面这些内容全部是基于真实实验得来的经验不是照抄文档。1. ARP协议原理与报文结构拆解1.1 ARP为什么存在IP地址与MAC地址之间的“翻译官”先说一个最基本的认知在同一个以太网内两台主机通信时真正决定数据帧发给谁的不是IP地址而是MAC地址。IP地址是逻辑地址它负责跨网段的寻址MAC地址是物理地址负责在同一个二层广播域内的精确投递。交换机转发数据帧时只看帧头里的目标MAC不看IP。也就是说虽然你配置的 IP 是 192.168.1.100但当你要和 192.168.1.1 通信时你的网卡必须知道对方网卡的MAC地址才能把帧封装出来发出去。ARPAddress Resolution Protocol地址解析协议解决的就是这个映射问题给定目标的IP地址如何获取它的MAC地址。整个过程可以类比成快递配送IP地址是“城市街道门牌号”MAC地址是“具体到楼栋的收货人手机号”。快递员交换机派件时只看面单上的收货人信息目标MAC来分拣而系统从门牌号找到手机号的过程就是ARP干的活。每台主机内部维护一张 ARP 缓存表里面记录了 IP 地址与 MAC 地址的对应关系。你可以在 Windows 上执行arp -a在 Linux 上执行ip neigh show查看这张表。正常通信时主机先查缓存表命中就直接封装发送没命中才会发起 ARP 请求。1.2 ARP报文头部字段逐项拆解ARP 报文是整个 ARP 协议的核心它长度固定为 28 字节直接封装在以太网帧里。很多人做“以太网与ARP协议分析”实验时对着 Wireshark 抓包一头雾水其实把字段结构搞清楚后每个字节都能对上。字段长度典型值含义硬件类型 HTYPE2字节0x0001链路层类型1表示以太网协议类型 PTYPE2字节0x0800高层协议类型0x0800表示IPv4硬件地址长度 HLEN1字节0x06MAC地址长度以太网固定为6协议地址长度 PLEN1字节0x04IP地址长度IPv4固定为4操作码 OPER2字节0x0001请求 / 0x0002应答报文类型发送方硬件地址 SHA6字节如 00:0c:29:xx:xx:xx发送方MAC发送方协议地址 SPA4字节如 192.168.1.1发送方IP目标硬件地址 THA6字节请求时全0目标MAC目标协议地址 TPA4字节如 192.168.1.100目标IP以太网帧头里还有两个关键信息当主机发起 ARP 请求时帧头的目标 MAC 是ff:ff:ff:ff:ff:ff广播地址帧类型字段是0x0806。ARP 应答则是单播发送直接发给请求方的 MAC。整体来看一个完整的 ARP 请求帧在以太网上的长度是 14字节帧头 28字节ARP报文 4字节FCS不足64字节时会自动补齐填充。拆解报文时有一个很容易忽略的点ARP 请求报文虽然只有 28 字节但它的发送方IP和目标IP在请求阶段就已经填好了。你可以把请求理解成“我是192.168.1.100MAC是aa:bb:cc:dd:ee:ff请问谁是这个IP请回话到我的MAC”。而应答报文则把 SHA/SPA 填成被询问方的信息THA/TPA 填回请求方的信息相当于“我就是192.168.1.1我的MAC是11:22:33:44:55:66回复给你”。1.3 免费ARPIP冲突探测与网关冗余的秘密武器除了常规的请求和应答ARP 还有一种特殊形式叫免费 ARPGratuitous ARP。它的特点是发送方IP和目标IP都填自己的IP地址目标MAC是广播地址。主机开机、网络配置变更、或者IP地址重新获取后协议栈一般都会主动发一个免费ARP作用有两个。第一探测IP冲突。主机发出免费ARP后如果收到某个设备的应答或者收到另一个设备也宣告同一IP的免费ARP说明网络里已经有人用了这个IP设备会在屏幕上提示“网络地址冲突”。这也是“免费ARP可以用来探测IP地址是否冲突”这句话的原理所在。第二主动刷新网络中其他设备的ARP缓存。比如网关设备重启后会立刻发送免费ARP告诉全网“网关的MAC是这个”这样所有终端不用等ARP缓存老化就能立即更新。在VRRP等网关冗余场景中主备切换后新主设备也会马上发免费ARP来抢占流量。理解了免费ARP后面再聊 ARP 欺骗攻击就会非常顺。2. ARP欺诈攻击的完整逻辑数据是怎么被“带偏”的2.1 无状态应答——攻击到底利用了哪个漏洞ARP 协议设计于上世纪七八十年代当时完全没考虑认证问题。它最致命的缺陷就是“无状态”主机收到一个 ARP 应答报文时不会验证这条应答是否对应一条自己主动发起的请求。更直接地说哪怕你从来没有问过“网关的MAC是谁”只要有人主动告诉你“网关的MAC是00:11:22:33:44:55”你的主机会直接信任并更新ARP缓存表。这就是整个ARP欺骗能被实施的基础。攻击者不需要欺骗交换机也不需要破解什么密码只需要在局域网里持续发送伪造的ARP应答报文就能把所有终端的ARP缓存“毒化”。我见过有人把ARP欺骗叫作“局域网里的替身攻击”因为攻击者做的事情就是冒充别人——声称自己是网关然后所有原本发给网关的流量就被送到了攻击者手里。这里还要补充一个机制ARP缓存表不是永恒不变的每条记录都有老化时间。Windows 上静态ARP之外的动态记录一般在几十秒到几分钟内老化而新的ARP应答随时可以覆盖旧记录。所以攻击者往往需要持续广播或周期性地发送伪造应答才能维持毒化效果。2.2 双向欺骗与中间人一条流量两条毒化路径简单骗一个人还不够如果要做中间人攻击攻击者必须同时欺骗通信的双方。以最常见的“欺骗终端与网关之间通信”为例对受害主机发送伪造应答告诉它“网关192.168.1.1的MAC是攻击者的MAC”。对网关发送伪造应答告诉它“受害主机192.168.1.100的MAC是攻击者的MAC”。这样一来受害主机的ARP表里网关对应的MAC是攻击者的网关的ARP表里受害主机对应的MAC也是攻击者的。受害主机发出的数据帧先到交换机交换机根据目标MAC此时已被改成攻击者MAC转发给攻击者端口攻击者开启 IP 转发后再把数据发给真正的网关。返回流量也同样经过攻击者中转。数据流变成了受害主机 - 攻击者 - 网关 - 互联网。攻击者处在这条链路中间可以看到所有明文流量也可以任意修改内容再转发。如果攻击者不做转发直接把帧丢掉那受害主机就会完全断网这又演变成了拒绝服务攻击。实际操作中还有一个细节ARP欺骗不影响IP层的连接状态。受害主机与网关的TCP连接可能还在持续只不过底层的MAC地址已经换了人。所以攻击可以做到“悄悄旁路”让用户感觉不到明显异常但密码、会话信息全被嗅探走了。2.3 为什么说ARP欺骗“隐蔽又危害大”第一无日志。ARP协议本身没有审计和日志机制交换机不会记录“谁向谁发了ARP应答”只有在开启DAI的交换机上才能看到丢弃记录。第二不破坏连通性。只要攻击者正确开启转发所有业务都是通的用户无感知。很多运维排查时发现 ping 通、端口通、ARP表看似完好就忽略了背后数据被截获的问题。第三影响范围可以扩大到全网。攻击者不需要在受害主机和网关之间物理串联接入只需要在同一个广播域内的任意端口上发送帧交换机就会把所有目标MAC为攻击者MAC的帧送过来。这个特性意味着办公室里任何一台被植入恶意程序的PC都能变身监听设备。正因为如此避免ARP欺骗绝不是一个终端上的软件能解决的问题必须从接入交换机层面做防护这也是后面讲 DHCP Snooping 和 DAI 的原因。3. GNS3环境下的完整复现与抓包验证3.1 实验拓扑与节点准备理论讲再多不如动手抓一次包。我推荐用 GNS3 搭一个最小拓扑两台路由器分别连接一台主机路由器之间再互联模拟两个网段之间的通信。这个场景非常经典因为它能清楚地展示“跨网段通信时ARP在每一跳上如何被使用”。拓扑规划如下PC1 属于 192.168.10.0/24网关是 R1 的 G0/0 接口192.168.10.1R1 与 R2 通过互联链路连接网段 10.0.0.0/30PC2 属于 192.168.20.0/24网关是 R2 的 G0/0 接口192.168.20.1具体连接可以按照 GNS3 里云桥接的方式处理也可以用 VPCS 作为终端。VPCS 是 GNS3 自带的轻量级虚拟终端模拟器虽然功能比真实系统弱一些但它支持arp、ping、ip等命令做实验足够。如果条件允许我更推荐用 QEMU 跑一个真实的 Linux 镜像因为后面可以用arpspoof和tcpdump做攻击复现效果更真实。3.2 路由器与主机配置路由器我习惯用思科 IOS 镜像GNS3 中通常使用 IOU 或 dynamips 引擎配置命令如下。先配置 R1configure terminal interface GigabitEthernet0/0 ip address 192.168.10.1 255.255.255.0 no shutdown exit interface GigabitEthernet0/1 ip address 10.0.0.1 255.255.255.252 no shutdown exit ip route 192.168.20.0 255.255.255.0 10.0.0.2R2 的配置configure terminal interface GigabitEthernet0/0 ip address 192.168.20.1 255.255.255.0 no shutdown exit interface GigabitEthernet0/1 ip address 10.0.0.2 255.255.255.252 no shutdown exit ip route 192.168.10.0 255.255.255.0 10.0.0.1终端使用 VPCS 时配置命令是ip 192.168.10.10 255.255.255.0 192.168.10.1PC2 同理ip 192.168.20.20 255.255.255.0 192.168.20.1配置完成后在 PC1 上 ping 192.168.20.20正常情况下可以通。这里我强烈建议在 R1 的接口下加一句no ip proxy-arp原因我在后面“实验坑位”部分详细说现在你先知道如果不关掉代理ARP实验现象会非常混乱你甚至看不到标准的“终端请求网关MAC”流程。3.3 正常通信下的ARP抓包分析配置完成后在 GNS3 里右键 R1 和 R2 之间的链路选择“Start Capture”用 Wireshark 抓互联链路的数据包。然后在 PC1 上执行ping命令。你会看到非常干净的两个阶段。第一阶段PC1 想发数据给 192.168.20.20它发现目标IP不在自己网段于是必须先把帧发给网关 R1。但因为 ARP 缓存为空PC1 会先发一个广播的 ARP 请求内容大致是“谁是192.168.10.1我是192.168.10.10MAC是xx”。R1 的 G0/0 接口收到后单播回复一个 ARP 应答。整个请求/应答过程只发生在 PC1 所在的 192.168.10.0/24 广播域内你在 R1-R2 之间那条链路上是看不到这组报文的。第二阶段R1 收到 PC1 的 IP 数据包后查路由表发现下一跳是 10.0.0.2必须通过 G0/1 接口转发。此时 R1 需要知道 10.0.0.2 的MAC于是它会在 10.0.0.0/30 这条链路上发起一轮新的 ARP 请求。你抓包看到的正是这轮请求和应答R1 广播问“谁是10.0.0.2”R2 单播回复接着 R1 封装新的以太网帧把 IP 包发往 R2。这才是你在 R1-R2 链路上抓到的第一个 IP 数据包它的源MAC是 R1 的 G0/1 接口MAC目标MAC是 R2 的 G0/1 接口MAC而不是 PC1 的MAC。整个过程把“逐跳转发”和“ARP只工作在本地链路”两个概念展示得非常清楚。初学者常有的误区是以为源MAC永远是 PC1 的MAC实际上经过路由器后MAC地址在每一跳都会重新封装IP地址不变MAC地址变。这就是路由器和交换机的本质区别路由器终结二层帧交换机只做帧的转发。3.4 实施一次ARP欺骗攻击并观察链路变化为了让攻击看得见摸得着我建议在 GNS3 中加一台 Kali Linux 虚拟机作为攻击者通过 Cloud/VMnet 桥接到 PC1 所在的 192.168.10.0/24 网络IP 设置为 192.168.10.100。在攻击机上开启 IP 转发然后执行双向欺骗。开启转发的命令echo 1 /proc/sys/net/ipv4/ip_forward双向欺骗我通常用 dsniff 套件里的 arpspoofarpspoof -i eth0 -t 192.168.10.10 192.168.10.1 arpspoof -i eth0 -t 192.168.10.1 192.168.10.10第一条命令的意思是向受害主机持续发送伪造的ARP应答告诉它“网关的MAC是攻击者的MAC”第二条是向网关持续发送伪造应答告诉它“受害主机的MAC是攻击者的MAC”。两条命令要同时跑。等十几秒后回到受害主机的终端执行arp -a你会看到网关 192.168.10.1 对应的 MAC 变成了 Kali 的MAC。此时再用 Wireshark 在攻击机或者R1的G0/0口上抓包你能看到受害主机发往网关的流量全部变成了目标MAC指向攻击者的帧。为了验证中间人效果可以在 PC1 上开一个 HTTP 请求或者在 Kali 上执行tcpdump -i eth0 port 80 -A你会发现原本应该通过网关转发的 HTTP 明文请求全都经过了 Kali。如果你不用 arpspoof 而是想手动体验协议细节也可以写一个简单的 Scapy 脚本循环发送伪造应答代码更直观from scapy.all import * import time victim_ip 192.168.10.10 gateway_ip 192.168.10.1 attacker_mac 00:0c:29:xx:xx:xx arp_packets [] while True: # 欺骗受害主机网关的MAC是攻击者MAC pkt1 ARP(op2, pdstvictim_ip, psrcgateway_ip, hwsrcattacker_mac) # 欺骗网关受害主机的MAC是攻击者MAC pkt2 ARP(op2, pdstgateway_ip, psrcvictim_ip, hwsrcattacker_mac) send(pkt1, verboseFalse) send(pkt2, verboseFalse) time.sleep(2)这个脚本特别适合课堂演示每一次 sleep 周期内发送两帧就能持续维持毒化状态。攻击结束后用arp -d清除受害主机上的错误缓存即可恢复通信。4. 检测与防御实战从巡检到DHCP SnoopingDAI4.1 交换机视角的异常发现方法先说没有防御设备的排查路径。当怀疑局域网有ARP欺骗时第一步是登录核心交换机查看网关接口的 MAC 表和 ARP 表。正常情况网关 IP 对应的 MAC 应该是指定设备的接口MAC而且这个 MAC 在 MAC 地址表中对应的端口是固定的。如果你看到网关 MAC 对应当前端口发生变化或者在多个端口上反复漂移那基本可以断定网络中有人在伪装网关。第二检查终端 ARP 缓存。找一台正常的 PC 执行arp -a看网关 IP 对应的 MAC 是不是设备真实MAC。思科路由器可以用show interface查看接口MAC华为设备看接口的MAC同样方便。我做实验时最直接的判断方法就是对比先抓包看一次正常的ARP应答的源MAC再把ARP表中的MAC拿来对比不一样就是有问题。第三观察流量特征。开启 ARP 欺骗的攻击者一般会持续发送大量 ARP 应答这些报文源IP和源MAC的配对是异常的。在没有 DAI 的交换机上可以用 SPAN 镜像 Wireshark 抓包分析过滤条件为arp统计有多少个不同的源IP在宣告同一个IP或者同一个IP对应了多少个不同MAC。4.2 DHCP Snooping为什么“必须要配置”很多教材和实验题都会说“ARP detect 通过 DHCP Snooping 必须要配置”很多人不理解我明明可以直接在交换机上做ARP检测为什么非要依赖DHCP Snooping原因一句话就能解释交换机需要一本“可信账本”来判断谁是对的。DHCP Snooping 的作用是建立并维护一本账本每个动态获取IP的终端对应的 MAC、IP、VLAN、端口、租约时间。交换机通过监听 DHCP 交互报文Discover、Offer、Request、Ack把这些信息记录到绑定数据库里。有了这个数据库交换机才知道“端口 G0/1、MAC aa:bb:cc:dd:ee:ff、IP 192.168.10.10”这条绑定关系是真实存在的。没有这本账本交换机面对一个ARP报文时根本无法判断它是合法的还是伪造的——因为都是源IP、源MAC的组合长得一模一样。所以 DAIDynamic ARP Inspection动态ARP检测必须依赖 DHCP Snooping 产生的绑定表这就是“必须要配置”的根本原因。另外DHCP Snooping 还有一个基础功能控制端口的信任状态。接终端、接DHCP客户端的端口设置为非信任接DHCP服务器、接上联交换机的端口设置为信任。非信任端口上交换机只允许特定类型的 DHCP 报文通过并且会把超出速率的 DHCP 报文丢弃这也能顺便防一波 DHCP 饿死攻击。4.3 DAI动态ARP检测的原理与配置示例DAI 的原理就是让交换机检查每个非信任端口收到的 ARP 报文把报文里的源IP源MAC目标IP目标MAC和绑定数据库比对。比对不通过就丢弃并记录日志、增加计数。从主机角度一切照旧——合法终端发送ARP请求或应答都会通过从攻击者角度他发出任何一条不在绑定表里的ARP报文都会被交换机直接掐掉。思科交换机上的最小化配置以 Catalyst 3850 为例ip dhcp snooping vlan 10 ip dhcp snooping interface GigabitEthernet1/0/1 ip dhcp snooping trust ip arp inspection vlan 10 interface GigabitEthernet1/0/1 ip arp inspection trust配置逻辑分两部分先把 DHCP Snooping 和 DAI 都全局开启再分别指定 VLAN。上联口和连接路由器的口要配置 trust不能对信任口做检测否则会误伤正常的上联ARP报文。华为设备上类似的命令是arp anti-attack check user-bind原理相同也是基于 DHCP Snooping 的用户绑定表做校验。具体配置dhcp enable dhcp snooping enable interface GigabitEthernet0/0/1 dhcp snooping trusted arp anti-attack check user-bind enable interface GigabitEthernet0/0/1 arp anti-attack check user-bind enable我实测下来的经验开启DAI后一定要先观察一段时间再全局下放。先在实验环境或非关键VLAN里开启看日志里告警的数量和来源如果告警来自正常终端比如某些设备开了网卡节能模式导致ARP表更新行为异常你需要针对性地放行特定信任端口而不是直接全开导致全网瞬断。4.4 终端侧与静态兜底方案对于交换机层面没有DAI、或者网络规模很小比如家庭组网、办公室三五台电脑的场景可以做一些传统但有效的兜底。终端侧可以手动绑定地址。Windows 上把网关IP和正确的MAC做静态绑定netsh interface ipv4 set neighbors 本地连接 192.168.1.1 00-1d-aa-bb-cc-ddLinux 上可以用arp命令设置arp -s 192.168.1.1 00:1d:aa:bb:cc:dd但这个方法维护成本非常高一旦网关设备更换或VRRP切换所有终端都要改一遍。所以我只建议用它做特定主机的应急保护。正规一点的做法是使用接入交换机的port-security。端口安全能限制一个端口上最多出现多少个MAC地址防止攻击者把伪造MAC的流量大量灌进交换机。但它不能解决“合法主机上肉鸡后被用作攻击源”的情况因为攻击者来自真实端口只是伪造了报文内容。所以端口安全最多算辅助手段核心解决方案还是 DHCP Snooping DAI。5. 常见问题、排查技巧与实验坑位盘点5.1 五个经典故障现象与对应排查路径故障现象可能原因排查路径局域网内部分终端间歇性断网攻击者伪造网关MAC后未开转发查看终端ARP表对比网关真实MAC所有网页跳证书错误或内容被篡改中间人劫持了HTTPS或插入恶意内容抓包检查DNS响应、证书链流量延迟高、大小包延迟波动大中间人转发能力不足对比正常时段与攻击时段的延迟交换机日志出现大量ARP丢弃计数DAI已开启并拦截了伪造ARP查看show ip arp inspection statistics主机开机提示IP冲突有设备宣告了相同IP抓包抓服务器免费ARP报文来源排查总原则是先看ARP表再抓包最后上交换机检查绑定关系。顺序不要倒过来否则很容易在海量告警里迷失方向。5.2 抓包分析时的几个关键判断点用 Wireshark 分析 ARP 问题时过滤条件arp是基础。进阶操作是添加统计条件例如arp.opcode 1只看请求arp.opcode 2只看应答。一个非常实用的判断技巧网页打开失败时抓包过滤arp后重点看通告网关IP的应答报文来源MAC。正常情况下网关IP的ARP应答来源MAC应该是路由器接口的MAC。如果看到多个不同MAC都在响应同一个IP或者某个应答的源MAC在MAC地址表上对应的是终端端口那十有八九就是欺骗。另外注意免费ARP频率。如果某个MAC周期性发免费ARP宣告自己是网关这基本可以认定为攻击。免费ARP用于网关冗余切换时是低频动作正常设备不会每几秒就广播一次。5.3 我在实验中踩过的几个具体的坑第一个坑代理ARP导致抓包结果完全变形。我在GNS3里第一次做跨网段实验时发现PC1直接发ARP请求问“谁是192.168.20.20”而不是问网关抓到包后我一度以为配置错了。后来才意识到Cisco路由器默认开启了proxy-arpR1 收到一个不属于直连网段的ARP请求时会主动代答告诉对方“我就是192.168.20.20”。这会导致跨网段实验无法展示标准的“先问网关再逐跳转发”过程。解决办法就是给每个接口加上no ip proxy-arp。第二个坑攻击机的 IP 转发没开导致断网而不是中间人。很多人第一次跑 arpspoof 时会发现通信彻底中断这是因为攻击机虽然收到了流量但没有把包转发出去。务必先执行echo 1 /proc/sys/net/ipv4/ip_forward。在真实企业网络里如果攻击脚本没有开转发表现就是“大范围断网”这也解释了为什么ARP欺骗有时候会被当成网络环路故障处理。第三个坑GNS3 里抓不到 ARP 包。如果 Wireshark 开了监听却看不到任何 ARP检查两件事一是监听接口是否正确选择GNS3 链路右键后的“Start Capture”是针对特定链路的别选错链路二是 Wireshark 的抓包模式必须是Promiscuous Mode混杂模式否则只能看到发给本机的帧。用真实网卡抓包时同理混杂模式不开启会漏掉大量广播帧。如果是在做“以太网与ARP协议分析”这类实验题并卡住了的朋友。我的建议是先把上面那张28字节ARP报文结构表背熟然后在 Wireshark 里抓一个真实请求和应答自己把每个字段填一遍。操作码是1还是2HTYPE是不是0x0001PTYPE是不是0x0800发送方硬件地址和协议地址分别是什么填完一遍这些知识点才会真正变成你自己的。我个人在反复实验中的体验是ARP欺骗攻击这件事难点不在“发起攻击”——几行命令就能做到——而在于深刻理解“为什么ARP协议会被欺骗”以及“如何让网络从信任协议变成信任数据”。DHCP Snooping 加 DAI 之所以能防住攻击不是因为它增强了某个终端的安全性而是因为交换机拥有了一个“谁该在哪个位置、用哪个IP和MAC”的权威账本让所有标注“合法”的包装都再也无法冒充。这种“从信任身份到信任数据”的思路其实也适用于局域网里很多其他安全问题。最终要记住一句话局域网的信任边界永远是二层二层不设防三层再多的安全产品都白搭。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →