如何使用Scapy实时修改数据包?
这样做有可能吗?
from scapy.all import *
def action(packet):
print packet[0][1].src + "==>" + packet[0][1].dst
print "Rerouting to localhost"
packet[0][1].dst = '127.0.0.1'
print packet[0][1].src + "==>" + packet[0][1].dst
sendp(packet)
sniff(filter="dst host 203.105.78.163",prn=action)
类似这样的操作,但有没有办法把数据包发送到本地,同时丢掉发送到203.105.78.163的数据包?(不使用iptables)
1 个回答
2
这件事是做不到的,因为Scapy在嗅探数据包时不会干扰主机的IP协议栈。
你可以根据嗅探到的数据包发送另一个数据包,但用Scapy无法“丢弃”一个数据包。
我能想到的唯一解决方案是在Linux下使用iptables + libnfqueue及其Python绑定 + Scapy。不过,显然如果你只是想重新路由一个数据包,单靠iptables就足够了,而且效果更好。
在其他操作系统下,你无论如何都需要一些防火墙软件来将数据包传递给用户程序(像Linux下的libnfqueue,这里你可以施展Scapy的魔法)或者直接修改数据包。
也许你可以看看IPS软件(比如suricata?),因为根据某些标准修改数据包正是IPS的功能。