2013-03-14 50 views
0

编写python代码来与Linux系统上的iptables nfqueue进行交互。我能够检索队列数据包并修改它们,但是我无法通过队列接受它们。Python Scapy nfqueue

  payload.set_verdict_modified(nfqueue.NF_ACCEPT, str(p), len(p)) 

这是我的理解将允许它通过队列的路线。 p是我创建的新数据包,有效载荷是原始队列数据包。

真的没有太多的文档,所以任何帮助将不胜感激。 感谢

这是我如何创建包

def queue_callback(i, payload) 

    data = payload.get_data() 
    packet = IP(data) 

这是我创建的包。我做的包处理的一点点,这是我回吧

packet[TCP].payload = after; 

    return packet; 

后,我回到了包我尝试使用以前的命令

  p = modify(packet) 
      print p[TCP].payload 
      payload.set_verdict_modified(nfqueue.NF_ACCEPT, str(p), len(p)) 

的修改功能是更新iptables中的nfqueue我在哪里创建一个新数据包并将其返回。

+0

你能提供有关该问题的更多信息,以及你在哪里创建'p'的代码? – 2013-03-14 18:51:07

+0

我更新了帖子。感谢帮助顺便说一句,真的没有这个在线文档。我看了很多。问题是,数据包正在得到修改,我想要的。 tcp有效负载是正确的,但我不知道如何重新接受新的数据包。数据包在iptables防火墙中排队,然后我想更新数据包,然后允许它通过。谢谢 – CBaker 2013-03-14 19:11:24

回答

0

我不明白你在哪里修改数据包。通常情况下你的数据包处理应该在回调函数:

def cb(payload): 
    data = payload.get_data() 
    p = IP(data) 
    #Here you can manipulate the packet and modify it as you want 
    p[IP].src = "10.2.0.2" #change the src address for exemple 

    payload.set_verdict_modified(nfqueue.NF_ACCEPT, str(p), len(p)) 

然后调用回调函数创建队列后:

q.set_callback(cb) 
    q = nfqueue.queue() 
    q.open() 
    q.create_queue(0) #Same queue number of the iptables rule 
+0

你是否设法修改了有效载荷?因为我不能,如果我这样做,我收不到答案。我是否需要更改任何其他TCP/IP头来完成它? – aDoN 2014-12-04 12:20:16

+0

我想如果你改变有效载荷,你应该重新计算校验和。这可以通过使用'no p.checksum'去除旧的校验和来完成,scapy会自动重新计算新的校验和。 – HaTiMuX 2014-12-05 15:04:01