我正在使用Linux 4.13.x.我正在考虑在内核中发送数据包响应。
考虑在用户空间中运行的echo TCP或UDP服务器,还有另一个运行TCP或UDP客户端的节点。客户端正在向服务器发送请求。我想将数据包响应发送回客户端,而不需要在用户空间运行服务器应用程序。
以下是我对此问题的看法:
我开始考虑如何做到这一点,并且我遇到了像 netfilter 这样的解决方案。如果我可以捕获 NF_INET_PRE_ROUTING 中的数据包,然后尝试交换IP头的源和目标IP地址,并交换TCP头中的端口,那么根据this answers和{{ 3}}大概修改后的数据包应该通过路由系统转发给发起人。
实际上,我试过这个场景,似乎不可能从netfilter钩子这样做,但是,我不确定。我认为它没有工作,因为它有校验和问题,因为我操纵数据包所以我做了另一个实验来解决这个问题。我只是更改了数据包数据,一切运行良好。我认为校验和没有任何问题,因为他们将在接收时检查NIC并且同样的情况,同时发送之间的操作并不会造成任何错误。我还在服务器主机(sysctl.config)上激活IPv4转发,但仍然没有任何变化。
我不想创建新数据包,我只想更改此数据包并将其发回。还有另一个类似的this正在创建另一个数据包。而且,我只是在想为什么这种情况不起作用?但是基于netfilter的架构它应该可以工作。
谢谢
答案 0 :(得分:0)
我也在做这个,实际上内核在NF_HOOK的ip_rcv函数之后验证了源ip地址,该功能检查了源ip地址。因此,只需尝试以下命令:-
sudo sysctl -w "net.ipv4.conf.all.rp_filter=0"
执行完此操作后,还将禁用您发送和接收数据包的界面,如下所示:-
sudo sysctl -w "net.ipv4.conf.enp2s0.rp_filter=0"