Scapy实现ARP欺骗时网页无法加载,IP转发配置无效问题排查
看起来你遇到的问题大概率是几个容易忽略的小细节导致的,咱们一步步拆解排查:
1. 脚本缺少time模块导入,直接崩溃
你的主代码里用了time.sleep(2)来控制欺骗包的发送间隔,但开头完全没导入time模块!运行脚本时会立刻抛出NameError: name 'time' is not defined的错误,脚本直接终止。这时候要么ARP欺骗包根本没发出去,要么只发了一次就停了,目标设备的ARP表被污染后没有持续的包维持欺骗状态,再加上流量路径被打断,网页自然就加载不出来了。
修复方法:在脚本开头加上import time。
2. scan函数没处理目标无响应的情况
你的scanner.py里的scan函数直接取ans[0][1].hwsrc,如果目标设备暂时没响应ARP请求(比如网络延迟),ans会是空列表,这时候会触发IndexError,脚本直接崩掉。虽然你用arpspoof能正常工作,但还是得给scan加个安全判断:
import scapy.all as scapy def scan(ip) : arp_request = scapy.ARP(pdst=ip) broadcast = scapy.Ether(dst = "ff:ff:ff:ff:ff:ff") arp_request_broadcast = broadcast/arp_request ans, unans = scapy.srp(arp_request_broadcast, timeout=1, verbose=False) if not ans: raise Exception(f"没收到目标IP {ip} 的ARP响应") mac = ans[0][1].hwsrc return mac
3. 没指定Scapy发送包的网卡接口
你用arpspoof时指定了-i eth0网卡,但Scapy的send函数默认可能会选错网卡(比如你的攻击机同时有有线和无线网卡)。如果欺骗包从错误的接口发出去,路由器和受害者根本收不到,直接导致流量中断。
修复方法:在scapy.send里加上iface参数,指定你实际用的网卡(比如eth0或wlan0):
scapy.send(packet, verbose=False, iface="eth0")
4. IP转发配置可能没真正生效
你用的echo命令有时候会因为权限问题没生效,建议用更可靠的方式开启IP转发:
sudo sysctl -w net.ipv4.ip_forward=1
执行完后用下面的命令验证是否真的开了:
cat /proc/sys/net/ipv4/ip_forward
如果输出是1就没问题,输出0的话说明权限还是有问题,再检查一下你的sudo权限。
5. 必须用root权限运行Scapy脚本
Scapy发送原始网络包需要root权限,如果你直接用python3 your_script.py运行,大概率发不出ARP欺骗包,或者只能发一部分,导致欺骗完全失效,流量直接断了。
修复方法:用sudo启动脚本:
sudo python3 your_script.py
最后再确认ARP包构造
你的ARP包参数是对的:op=2表示ARP响应包,pdst/hwdst指定目标设备的IP和MAC,psrc设置成要伪装的源IP(给受害者发的包用路由器IP,给路由器发的包用受害者IP),这部分没问题。
把这些问题都修复后,重新运行脚本试试,应该就能和arpspoof一样正常工作了!
备注:内容来源于stack exchange,提问作者Sereen Taleb

