nfqueue 和 scapy 数据包处理
我正在尝试处理数据包,并根据数据包的内容进行一些特定的路由修改。
具体来说,我有三台机器:
我从第一台机器发送数据包。
我使用第二台机器来拦截这些数据包,并对它们进行修改。我的代码是:
import nfqueue, socket
from scapy.all import *
#Set the callback for received packets:
def cb(payload):
data = payload.get_data()
p = IP(data)
if(p.tos==3):
p[IP].src = "10.2.0.2" #SF2
payload.set_verdict_modified(nfqueue.NF_ACCEPT, str(p), len(p))
elif(p.tos==0):
print("Packet Accepted: logical routing")
payload.set_verdict(nfqueue.NF_ACCEPT)
else:
print("Packet Droped")
payload.set_verdict(nfqueue.NF_DROP)
#I'm using this iptables rule, I'm testing with icmp packets
#iptables -t filter -i eth1 -p icmp -A FORWARD -j NFQUEUE --queue-num 0
q = nfqueue.queue()
q.set_callback(cb)
q.open()
q.create_queue(0)
try:
q.try_run()
except KeyboardInterrupt, e:
print "interruption"
q.unbind(socket.AF_INET)
q.close()
我想在第三台机器上做同样的事情,但问题是我无法拦截到已经修改过的数据包。(这个数据包确实到达了第三台机器,我可以监测到它,但在程序中定义的nfqueue却无法拦截到它)
你能告诉我为什么会这样吗?
任何帮助都非常感谢。
谢谢!
1 个回答
0
这个问题发生是因为你的iptables规则被放到了FORWARD表里,所以它只会在流量是转发流量的时候,把流量重定向到你的脚本。你可以试着把iptables规则放到你第三台主机的INPUT链上。