nfqueue 和 scapy 数据包处理

1 投票
1 回答
3495 浏览
提问于 2025-04-18 01:02

我正在尝试处理数据包,并根据数据包的内容进行一些特定的路由修改。

具体来说,我有三台机器:

我从第一台机器发送数据包。

我使用第二台机器来拦截这些数据包,并对它们进行修改。我的代码是:

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链上。

撰写回答