我的ARP request
数据包是从 PyQt5 GUI 应用程序运行的线程发送的。
当我
- 连接 WiFi
- 启动应用程序
- 发送数据包
packet = ARP(op='who-has', pdst='192.168.1.1')
packet.show()
输出:
###[ ARP ]###
hwtype = 0x1
ptype = IPv4
hwlen = None
plen = None
op = who-has
hwsrc = ......:aa:bb:cc <--- This is OK, the correct one (wlan0)
psrc = 192.168.1.112
hwdst = None
pdst = 192.168.1.1
并sr1(packet)
成功。
但当
- 断开 WiFi
- 启动应用程序
- 连接 WiFi
- 发送数据包
packet = ARP(op='who-has', pdst='192.168.1.1')
packet.show()
输出:
###[ ARP ]###
hwtype = 0x1
ptype = IPv4
hwlen = None
plen = None
op = who-has
hwsrc = ......:19:b6:dd <--- This is wrong one (eth0)
psrc = 0.0.0.0
hwdst = None
pdst = 192.168.1.1
并sr1(packet)
失败了。
请注意,hwsrc
现在已更改为我的wired ethernet
,其电缆已断开,并且psrc
设置为0.0.0.0
不是我的 WiFi IP。
事实上,我连接WiFi后,它并没有使用默认路由,而是使用了另一个接口而不是wlan0
(尽管默认路由是通过wlan0
)。
我的问题是:连接到 WiFi 后不应该scapy
使用默认路由(即 wlan0)发送 ARP 请求?
如果我退出并重新启动应用程序并保持 WiFi 连接,它就可以正常工作。
现在我需要一个解决方案,尽管我在应用程序启动后连接 WiFi,以便从 wlan0 接口发送 ARP 请求。
答案1
Scapy 会自行制作数据包头,因此它还需要自行执行路由表查找。不幸的是,它只读取整个操作系统路由表启动时并且从那时起始终使用缓存的信息。您可以在中查看表格conf.route
。
conf.route.resync()
每次切换连接时使用。