ARP欺骗实验全解析:从断网攻击到Scapy检测与防御
2026/9/20 6:15:42 网站建设 项目流程

简介:ARP欺骗是网络攻击中的经典手法,通过伪造网关MAC地址可实现对局域网通信的监听与篡改。西南科技大学网络攻防与对抗课程将此设为验证型实验,本资料是围绕该实验三整理的一份完整实验报告,面向正在学习网络协议、网络安全或需要完成同类课程设计的高校学生及安全爱好者。报告涵盖实验背景与目的、两台虚拟机(攻击者与受害者)的环境搭建、Cain和Winpcap工具的使用、ARP欺骗规则配置、telnet和ftp服务开启,以及抓包结果与ARP缓存对比分析;同时记录了实验者初次操作时遇到的常见问题与排错思路,便于读者对照复现。资源共1个文件,为doc格式文档,整体约1.99MB,图文结合、步骤清晰,适合直接参考。已有2379人学习下载;阅读后可掌握Cain在局域网内的嗅探方法,学会识别网关MAC异常替换,并深入理解ARP欺骗带来的敏感信息泄露风险,为后续网络攻防技术学习打下基础。

1. ARP欺骗实验:整垮局域网只要一个包

网络攻防课做到实验三,很多人会第一次在 Wireshark 里眼睁睁看着网关“消失”——前一秒还能 ping 通外网,后一秒全部请求超时。这一节课的内容叫 ARP 欺骗实验,它不依赖任何高深漏洞,靠的是链路层协议设计里一个朴素的信任缺陷。西南科技大学网络攻防与对抗实验三把 ARP 欺骗单拎出来作为独立实验,目的不是教人搞破坏,而是让实验者亲手制造一起“全网断网”事故,再顺着抓包结果把原理、危害和防御一次看透。适合刚学完 TCP/IP 协议栈、准备从理论转向动手的本科生,也适合想在企业内网里排查 ARP 攻击的运维人员。接下来从协议本身出发,沿着环境搭建、断网攻击、流量劫持、防御与检测这条线,把整套实验完整复现一遍。

2. ARP协议原理与实验环境:为什么局域网这么容易被骗

2.1 ARP 的工作模型:广播问路与无脑应答

ARP(Address Resolution Protocol)解决的核心问题是:已知目标 IP,如何找到对应的 MAC 地址。主机 A 要向主机 B 发包,发现本地 ARP 缓存里没有 B 的 MAC 地址,就往整个广播域发一条 ARP 请求:“谁是 192.168.1.100?请把你的 MAC 告诉我。”局域网内所有主机都会收到这条广播,但只有 IP 匹配的主机才会回复“我是 192.168.1.100,我的 MAC 是 aa:bb:cc:dd:ee:ff”。

问题出在回复环节:ARP 应答是单播发送,但接收方不会去验证这条应答是否真的来自被询问的那台机器。只要主机 A 收到一条声称“192.168.1.100 的 MAC 是 xx:xx:xx”的应答,它就会直接更新缓存,完全不检查发送者的真实来源。网络攻防里大量链路层攻击,根子都在这个“先信任、后校验”的机制上。

用 Linux 系统可以快速查看自己的 ARP 缓存,养成实验前先观测的习惯:

ip neigh show arp -n

ip neigh输出里会看到类似192.168.1.1 dev eth0 lladdr 00:0c:29:1a:2b:3c REACHABLE的记录。lladdr后面就是网关的 MAC 地址,REACHABLE表示该条目处于可用状态。实验前记下这个 MAC,攻击后再次执行同样的命令,对比结果,就能直观感受到 MAC 地址被替换的过程。

2.2 实验拓扑与选型:两台虚拟机就够了

ARP 欺骗实验对硬件几乎没有要求,最常见的实验环境是一台 Kali Linux 攻击机、一台 Windows 或 Linux 靶机,加上一个虚拟化软件自带的 NAT 网卡。以 VMware 为例,把攻击机、靶机都挂在VMnet8(NAT 模式)下,它们和物理机处在同一个广播域里,攻击机发广播时其他两台都能收到。这种拓扑最接近校园网里一台真实主机与网关的关系,实验现象明显,排查简单。

角色IP 地址作用
攻击机(Kali)192.168.1.10发送伪造 ARP 应答
靶机(Ubuntu)192.168.1.20被欺骗的目标主机
网关192.168.1.1被冒用的“合法设备”

选型建议:如果只是想快速验证断网,直接拿物理机当靶机也可以,但一定要在隔离的实验网络里操作,避免影响宿舍或公司其他设备的正常通信。Kali 自带arpspoof(dsniff 套件)和 Wireshark,省去编译安装的步骤;Ubuntu 作为靶机则方便用ip neigh实时查看缓存变化。

实验开始前,先让靶机主动 ping 一次网关,让靶机的 ARP 缓存里正常记录网关地址。这一步非常关键,否则靶机一开始就不知道网关是谁,后续攻击现象会和预期不一致:

ping -c 3 192.168.1.1 ip neigh show | grep 192.168.1.1

ping -c 3表示只发 3 个 ICMP 请求包,够建立缓存即可。执行后观察输出,如果能看到一个lladdr不为00:00:00:00:00:00的条目,说明靶机已经正确缓存了网关的 MAC 地址。

2.3 用 tcpdump 观察正常 ARP 交互

在动手攻击之前,先在靶机上抓一次正常 ARP 流量,建立“正常长什么样”的基线。使用以下命令监听所有 ARP 报文:

sudo tcpdump -i eth0 arp -nn -e

参数拆解:-i eth0指定网卡,arp表示只抓 ARP 协议,-nn不做 IP 和端口反向解析(显示速度快且不产生额外流量),-e显示链路层 MAC 地址。正常交互会看到这样的报文:

08:00:27:5a:1b:2c > ff:ff:ff:ff:ff:ff, ARP, Request who-has 192.168.1.1 tell 192.168.1.20

ff:ff:ff:ff:ff:ff是广播地址,说明 ARP 请求是广播发送的。Request who-has后面的 IP 就是要查询的目标。观察几次后按Ctrl+C停止抓包,此时建立的基线数据,会在第 4 章和攻击后的抓包形成鲜明对比。

3. 用 arpspoof 完成真实 ARP 欺骗:从断网到双向劫持

3.1 开启 IP 转发:让受害者“看不见”自己被劫持

直接发送伪造的 ARP 应答,可以让靶机把网关的 MAC 地址改成攻击机的 MAC,此时靶机发往网关的所有流量都会先到达攻击机。如果攻击机不开启 IP 转发,这些数据包会被直接丢掉,靶机表现为断网——这是断网攻击;如果开启 IP 转发,攻击机把收到的数据包再转给真正的网关,靶机完全感知不到异常,而攻击者已经实现了中间人劫持。这个差异是整个实验的分水岭。

在 Kali 攻击机上执行:

sudo echo 1 > /proc/sys/net/ipv4/ip_forward

Linux 下更规范的写法是:

sudo sysctl -w net.ipv4.ip_forward=1

sysctl -w是运行时修改内核参数,等号后面的1表示开启转发功能。用sysctl -w的好处是它同时会写/proc/sys/net/ipv4/ip_forward,且大部分发行版会自动加载配置。验证命令:

cat /proc/sys/net/ipv4/ip_forward

输出1则表示开启成功。本实验里先开启转发再做欺骗,可以一次实验同时观察“在线劫持”的完整过程;如果故意把该值设为0,则会立刻变成断网攻击,两种现象的对比对理解转发环节很有帮助。

3.2 单边欺骗:一句话让靶机“以为”网关变了

arpspoof是 dsniff 工具套件里最常用的命令。先查看攻击机自己的网卡信息,确认接口名和 IP:

ifconfig

假设 Kali 的网卡名是eth0,IP 为192.168.1.10,靶机 IP 为192.168.1.20,网关 IP 为192.168.1.1。要欺骗靶机,让它相信网关的 MAC 是攻击机的 MAC,执行:

sudo arpspoof -i eth0 -t 192.168.1.20 192.168.1.1

参数含义如下表:

参数取值说明
-ieth0指定攻击机的网卡接口
-t192.168.1.20被欺骗的靶机 IP
最后一个参数192.168.1.1要冒用的主机 IP(本场景即网关)

命令运行后,arpspoof 会持续向靶机发送伪造的 ARP 应答,内容是“192.168.1.1 的 MAC 地址是 00:0c:29:xx:xx:xx”(即攻击机的 MAC)。它默认每隔 2 秒重发一次,以保证靶机的 ARP 缓存一直处于被污染状态。

此时切换到靶机上查看缓存:

ip neigh show | grep 192.168.1.1

会看到网关对应的lladdr已经变成攻击机的 MAC。目标若再 ping 网关,所有 ICMP 包都会先进入攻击机,若转发已开启则可继续到达网关;若未开启则产生 Destination Host Unreachable。

3.3 双向欺骗:把网关也骗一遍,实现全双工劫持

单边欺骗只能接收靶机发往网关的流量,但网关返回给靶机的应答会直接发送到靶机,攻击者看不到回程流量,只能保证“去”的方向经过自己。要实现完整的中间人劫持,必须同时对网关进行欺骗,让网关也把靶机的 MAC 地址错误解析成攻击机的 MAC。这样做的基本思路是:再开一条反向的欺骗命令。

新建第二个终端,执行:

sudo arpspoof -i eth0 -t 192.168.1.1 192.168.1.20

这条命令的作用与 3.2 恰好相反:向网关发 ARP 应答,告诉网关“192.168.1.20 的 MAC 是 00:0c:29:xx:xx:xx”,也就是攻击机的 MAC。现在网关发往靶机的数据也会先经过攻击机,再被转发到真正的靶机。配合上面第一条命令,双向的流量都汇聚到攻击机,形成标准的 man-in-the-middle 拓扑。

运行后的典型状态:

arpwhois 192.168.1.20 → MAC 为攻击机 MAC arpwhois 192.168.1.1 → MAC 为攻击机 MAC

验证双向欺骗是否生效的简单方法:在攻击机上执行:

sudo tcpdump -i eth0 icmp

然后让靶机持续 ping 网关ping 192.168.1.1。如果 tcpdump 能抓到大量 ICMP 请求和应答,说明流量确实经过了攻击机,双向欺骗成功。

3.4 三个常见翻车点及排查方法

实验最常见的错误有三种。第一种是忘记开启ip_forward,导致靶机断网现象特别剧烈,新手容易误以为实验没做完;排查方法是查/proc/sys/net/ipv4/ip_forward是否为1。第二种是网卡选择错误,比如 Kali 机器有多块网卡,-i指定成了非活动网卡,导致包发不出去;对策是以ifconfig中带实际 IP 的接口为准。第三种是防火墙拦截了转发流量,某些 Linux 发行版默认启用了ufwiptables,需要临时放行:

sudo iptables -P FORWARD ACCEPT

这条命令把 FORWARD 链默认策略改为 ACCEPT,避免防火墙丢包。注意该操作只影响当前会话,重启后失效。若实验完成后要追求安全,建议还原默认策略。

4. 用 Wireshark 验证攻击结果:伪造应答与流量重定向的具体特征

4.1 抓包准备:用过滤条件把干扰降到最低

攻击跑通后,Wireshark 的验证环节不能省。它既能确认伪造报文的格式,也为后续写检测脚本提供特征依据。在攻击机上打开 Wireshark,选择eth0网卡开始抓包,应用过滤表达式:

arp

只看 ARP 报文,避免 TCP/UDP 大量刷屏。为了让攻击现象更明显,建议先停止上一章里的 arpspoof 进程,让攻击机回到正常状态;然后在 Wireshark 里清空当前显示,再重新启动 arpspoof 命令,这样抓包结果里出现的 ARP 应答就全部来自攻击行为本身。

4.2 识别伪造应答的两个硬指标

正常 ARP 应答应当满足:操作码(opcode)为2(reply),且发送方 MAC 与发送方 IP 真实对应。伪造应答最大的破绽是——发送方 IP 与发送方 MAC 的组合不一致。

在 Wireshark 里点击任意一条 ARP 应答帧,展开 Address Resolution Protocol(request/reply)部分,重点看三个字段:

字段正常值(以网关为例)伪造值
Sender MAC address网关真实 MAC,如 00:0c:29:11:22:33攻击机 MAC,如 00:0c:29:aa:bb:cc
Sender IP address192.168.1.1192.168.1.1
Target MAC address靶机 MAC靶机 MAC

注意看,Sender IP 和 Target 部分都能对上,唯独 Sender MAC 是错的。这正是 ARP 欺骗的本质:IP 地址没变,MAC 被偷换了。利用 Wireshark 的显示过滤,可以直接锁定所有应答包:

arp.opcode == 2

结合上文提到的抓包基线,对比正常回复与伪造回复,后者会出现高频次、成对的应答刷屏现象。正常情况下,同一 IP 的 ARP 应答只在询问时出现一次;而 arpspoof 每 2 秒一轮循环发送,抓包界面上会看到同一 IP-MAC 组合反复出现,间隔均匀,这也是自动化检测最容易识别的特征。

4.3 验证流量劫持:用 ICMP 与 HTTP 双重确认

仅仅看到 ARP 应答异常还不够,还要证明数据真的经过了攻击机。方法有两层。

第一层用 ICMP 验证转发链路。攻击机开 tcpdump 监听icmp,靶机ping 192.168.1.1持续发包,观察攻击机上能否看到 echo request。能看到就说明“靶机 → 网关”方向的流量已经被劫持。

第二层用 HTTP 验证内容可见性。在靶机上用 curl 访问一个 http 站点:

curl http://example.com

攻击机的 Wireshark 里过滤 HTTP 协议(http),如果能看到完整的 GET 请求,说明攻击者已经能完整读取明文流量。这个实验的意义在于提醒读者:ARP 欺骗后,HTTP 这类明文协议完全没有隐私。HTTPS 场景下虽然看不到明文内容,但面对后续章节提到的中间人证书劫持,依然有被解密的风险。

4.4 基于抓包结果的检测规则

这一节的内容直接为第 6 章脚本埋下伏笔。从抓包中可以归纳出三条规则:同一 IP 在短时间内出现多个不同的 MAC 地址,这是中毒的直接证据;某个 MAC 发出的 ARP 应答频率远超正常水平,说明发报者在持续广播伪造信息;Sender IP、Sender MAC 的组合与交换机/网关上的真实 ARP 表不一致。第 6 章的检测脚本就是围绕规则一设计的。

5. 从欺骗到防护:交换机端口安全与 Dynamic ARP Inspection

5.1 端口安全:在交换机上禁止 MAC 地址“漂移”

ARP 欺骗的本质是让同一端口出现多个 MAC 地址,或者同一 MAC 在不同端口间跳变。交换机上的端口安全(Port Security)可以从源头上限制一个物理端口允许学习的 MAC 数量。以常见的 Cisco 交换机命令为例:

interface FastEthernet0/1 switchport mode access switchport port-security switchport port-security maximum 2 switchport port-security violation shutdown

逐行说明:进入接口配置模式后,switchport mode access把端口设为接入模式,switchport port-security开启端口安全功能,maximum 2表示该端口最多学习 2 个 MAC 地址,violation shutdown则表示超过限制时直接将该端口置为 error-disable 状态。此配置适合连接单人主机的接入端口;若端口连接的是一台交换机或 AP,则需要调大 maximum 值或用 sticky 方式动态学习。

端口安全能缓解“MAC 地址漂移”类攻击,但对纯软件层面的 ARP 欺骗效果有限——攻击机可以不断伪造不同 MAC。所以它只能作为基础防线,不能单独依赖。

5.2 DAI:让交换机学会“校验”每一份 ARP 应答

Dynamic ARP Inspection(DAI)是目前对抗 ARP 欺骗最有效的手段。它的核心思想是:交换机拦截所有 ARP 报文,并与 DHCP Snooping 绑定表(IP ↔ MAC ↔ 端口 ↔ VLAN 的对应关系)进行比对,不匹配的报文直接丢弃。启用 DAI 前的必要条件是已配置 DHCP Snooping。

ip dhcp snooping ip dhcp snooping vlan 10 interface FastEthernet0/1 ip dhcp snooping trust interface FastEthernet0/2 ip arp inspection trust

配置含义:前两条开启 DHCP Snooping 并作用于 VLAN 10,第三条把连接 DHCP 服务器或上行口的端口设为信任口,防止伪造 DHCP 应答;第四条把连接攻击者/终端的端口配置为不信任口,对其上送的 ARP 报文进行 DAI 校验。不信任口上送的所有 ARP 应答都必须命中 DHCP Snooping 绑定表,否则丢弃。

DAI 的局限在于:如果攻击者可以伪造 DHCP 请求,先抢占一个合法 IP 并从 DHCP 服务器获得绑定表条目,之后用该 IP 做 ARP 欺骗,DAI 依然可能被绕过。所以更严谨的做法是同时开启 IP Source Guard,它会让交换机检查每一个数据包的源 IP 是否与绑定表一致,从网络层彻底阻断伪造源地址。

5.3 主机侧防御:静态 ARP 绑定和 ARP 防护工具

如果环境里没有可管理的交换机,只能在主机上做对抗。Linux 主机可以把网关 MAC 写成静态条目:

sudo ip neigh replace 192.168.1.1 lladdr 00:0c:29:11:22:33 dev eth0 nud permanent

nud permanent表示该条目永远不老化,攻击者发来的 ARP 应答无法覆盖它。代价是网关换了网卡硬件地址后必须手动修改。Windows 下对应的命令是arp -s 192.168.1.1 00-0c-29-11-22-33,但 Windows 的静态 ARP 在某些版本上也会被部分驱动忽略,效果不如 Linux 稳定。

对于没有管理权限的办公主机,可以部署开源 ARP 防护软件。检测端的思路是:监听所有 ARP 报文,维护一张 IP → MAC 映射表,一旦发现同一 IP 出现两个不同 MAC,立即告警。第 6 章会实现一个最小可用的检测器,原理和它们完全一致。

6. 用 Scapy 写一个 ARP 欺骗检测器:把实验结论固化成脚本

实验做到最后,理论验证已经闭环,剩下最值得做的事是把“能发现问题”变成“能自动发现问题”。用 Scapy 监听局域网内的 ARP 报文,实时维护 IP 到 MAC 的映射关系,一旦发现冲突就告警。这个脚本可以直接在教学实验环境里运行,也可以挂到企业内网的服务器上做长期监控。

#!/usr/bin/env python3 from scapy.all import sniff, ARP import time # 存储已知的 IP -> MAC 映射,IP 是唯一键 ip_mac_map = {} def detect_arp(packet): # 只处理 ARP 应答报文(op=2),请求报文无欺骗判定价值 if packet[ARP].op != 2: return src_ip = packet[ARP].psrc src_mac = packet[ARP].hwsrc if src_ip in ip_mac_map: # 如果同一个 IP 出现了新的 MAC,触发告警 if ip_mac_map[src_ip] != src_mac: print(f"[ALERT] IP {src_ip} 发生 MAC 漂移:" f"{ip_mac_map[src_ip]} -> {src_mac}") # 更新映射,避免对同一次攻击连续告警 ip_mac_map[src_ip] = src_mac else: # 第一次观察到该 IP,先加入映射表 ip_mac_map[src_ip] = src_mac print(f"[LEARN] {src_ip} -> {src_mac}") if __name__ == "__main__": print("开始监听 ARP 应答,按 Ctrl+C 停止") sniff(filter="arp", prn=detect_arp, store=False)

代码逻辑:Sniff 拦截所有 ARP 包,op != 2跳过请求包;对每个应答包提取psrc(发送者 IP)和hwsrc(发送者 MAC);若 IP 已存在但 MAC 不一致,说明收到伪造应答或发生 MAC 漂移,输出告警。这里刻意跳过了请求包,因为正常情况下请求包不携带可信的 IP-MAC 对应关系,包含它容易产生误报。

运行方式:

sudo python3 arp_detector.py

验证脚本是否有效,可以开两个终端:一个运行检测脚本,另一个运行第 3 章的arpspoof命令。几秒内检测端就会打出[ALERT]信息,提示某 IP 的 MAC 发生变化。如果想让检测器更贴近实际防御场景,可以加一个--daemon参数把输出写入日志文件,或者对接企业微信/钉钉的 webhook 实现远程告警。

这个脚本只用了约 30 行代码,却完整复刻了商业防护软件的核心检测逻辑。输入侧可以继续扩展的点有两个方向:一是加入 ARP 报文频率统计,把 arpspoof 这类周期性发包工具的特征识别出来;二是接入交换机show mac address-table的定期巡检,从设备侧交叉验证主机侧的判断结果。做到这一步,ARP 欺骗实验就不仅仅是课上的一次断网演练,而是真正成了一个可以移植到生产环境里的安全检测能力。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询