如何在Iptables中重新注册数据包?

我有一个数据包内的数据包又名隧道。 所以基本上是这样的:
[IP HEADER 1][IP HEADER 2][PAYLOAD]
读完第一个标题(由一个库完成)后,我将得到数据包:
[IP HEADER 2][PAYLOAD]
iptables的INPUT链。 我想重新将数据包注入到iptables的起始位置,即在PREROUTING链中。 最终的目标是将数据包转发到远程主机(这就是为什么我希望数据包在PREROUTING链中)。 我已经阅读了有关libipq的一些信息,但我不确定这是否是最好的方法。 任何野生的build议也将有所帮助。

我已经在“stackoverflow”发布了这个问题,但由于没有答复,所以我认为它更适合'serverfault'。

我同意舒斯先生的回答。 使用libnetfilter_queue 。 要使用它,您将需要一个Linux内核版本2.6.14或更高版本与nfnetlink_queue支持构build。 有两个部分要设置:

  1. 你的iptables / netfilter规则发送数据包到用户地,和
  2. 你的用户程序,它将根据需要处理数据包,然后将它们返回给netfilter。

iptables规则可能看起来像这样:

 IN_INTERFACE=eth0 SOURCE_NETWORK=192.168.66.0/24 QUEUE_NUM=1 iptables -t raw -A PREROUTING -i $IN_INTERFACE -s $SOURCE_NETWORK -j NFQUEUE --queue-num $QUEUE_NUM 

这将发送从特定networking通过特定接口进入的所有数据包到正在侦听队列编号为1的用户登陆进程。

您的程序可能必须用C或C ++编写,将使用libnetfilter_queue API 。 对不起,我不打算在这里写任何代码(在我链接的API文档中有示例代码),但基本的想法是,你的程序将:

  • 读取发送到队列的每个数据包,
  • 对数据包进行所需的修改,
  • 最后,给netfilter指定一个“判决”,说明是否接受或丢弃数据包。 据推测,你将被大部分时间接受。

我没有亲自使用这个API,但是我对文档的阅读是接受一个数据包实际上意味着将它重新注入到netfilter中,继续遍历iptables规则集。 在这一点上我可能是错的,所以你可能要在进行这个发展之前进一步调查。

IIRC,重新开始(尽pipe!),使用NF_REPEAT作为判决。

似乎libipq已被libnetfilter_queue 弃用 。 该文件指出:

向内核nfnetlink_queue子系统发出判决和/或重新发送更改的数据包

好像你在找什么