【问题标题】:Python Scapy nfqueuePython Scapy nfqueue
【发布时间】:2014-04-02 23:44:04
【问题描述】:

我正在编写 python 代码来与 linux 系统上的 iptables nfqueue 交互。我能够检索队列数据包并根据需要修改它们,但是我无法通过队列接受它们。

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

据我了解,这是允许它通过队列的行。 p 是我创建的新数据包,payload 是原始队列数据包。

这方面的文档确实不多,因此我们将不胜感激。 谢谢

这就是我创建数据包的方式

def queue_callback(i, payload)

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

这是我创建数据包的地方。我做了一点数据包操作,这就是我返回它的地方

    packet[TCP].payload = after;

    return packet;

返回数据包后,我尝试使用上一个命令更新 iptables 中的 nfqueue

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

修改功能是我创建一个新数据包并返回它的地方。

【问题讨论】:

  • 您能否提供有关该问题的更多信息,以及您创建p 的代码?
  • 我更新了帖子。顺便说一句,感谢您的帮助,在线上确实没有此文档。我看过不少。问题是数据包正在按照我想要的方式进行修改。 tcp 有效负载是正确的,但是我不知道如何重新接受新数据包。数据包在 iptables 防火墙中排队,然后我想更新数据包,然后允许它通过。谢谢

标签: python linux iptables scapy


【解决方案1】:

我不明白你在哪里修改数据包。通常你的数据包操作应该在回调函数中:

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

【讨论】:

  • 您是否设法修改了有效载荷¿?因为我做不到,如果我这样做了,我将得不到任何答复。我需要更改任何其他 TCP/IP 标头来完成它吗?
  • 我认为如果你改变了payload,你应该重新计算校验和。这可以通过使用 no p.checksum 删除旧的校验和来完成,然后 scapy 将自动重新计算新的校验和。
猜你喜欢
  • 2015-03-03
  • 1970-01-01
  • 1970-01-01
  • 2015-08-29
  • 2012-03-19
  • 1970-01-01
  • 2015-12-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多