nfqueue和scapy数据包操作

时间:2014-04-02 15:42:06

标签: python packet scapy

我正在尝试处理数据包并修改它们以根据数据包内容强制执行某种特定路由。 具体来说,我有3台机器:

我从第一个发送数据包。

我使用第二个来拦截nfqueue中的数据包并修改它们。 我正在使用这段代码:

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 :(得分:0)

当您的iptables规则插入到FORWARD表中时会发生这种情况,因此如果流量只是转发流量,它只会将流量重定向到您的脚本。尝试将iptables规则插入第三台主机上的INPUT链。