【发布时间】:2014-03-28 01:15:30
【问题描述】:
我有一个使用 netfilter 钩子的内核模块。目标是将数据包转发到另一个目的地。正如我所看到的,来自外部的设计数据包,daddr 设置为我的服务器 IP 通过 NF_INET_PRE_ROUTING,然后假设排队等待本地应用程序。在 NF_INET_PRE_ROUTING 上,我更改特定数据包(检测我自己的协议)并将daddr 替换为远程服务器 IP,将saddr 替换为我的服务器 IP。我想从内核模块本身执行此操作,但找不到将现有数据包移动到另一个路由点(NF_INET_FORWARD 或NF_INET_LOCAL_OUT 甚至NF_INET_POST_ROUTING)或创建新数据包并将其插入 TCP 的方法/IP 堆栈,就好像它是从服务器本身发送的一样。目前,数据包只是在第一次钩子后进入黑洞。我不认为它会以某种方式进入任何其他钩子。我怎么能这样做?
我当前的代码(远程服务器与客户端相同的测试代码):
#include【问题讨论】:
-
你不能用 iptables 达到同样的效果吗?
-
@rakib 不,因为
iptables只路由数据包,它不会改变它们。也许您的意思是 netfilter_queue 用户空间库?我可以使用它,但我首先在内核模块中寻找解决方案。
标签: c sockets tcp linux-kernel netfilter