linux - 响应在内核的 NetFilter 中接收到的数据包

标签 linux kernel hook kernel-module netfilter

我正在使用 Linux 4.13.x。我正在考虑在内核中发送数据包响应。

考虑在用户空间中运行的回显 TCP 或 UDP 服务器,还有另一个节点运行 TCP 或 UDP 客户端。客户端正在向服务器发送请求。我想将数据包响应发送回客户端,而不涉及在用户空间运行的服务器应用程序。

以下是我对这个问题的看法:

我开始思考它是如何实现的,并且想到了像 netfilter 这样的解决方案。如果我可以在 NF_INET_PRE_ROUTING 中捕获数据包,然后尝试交换 IP header 的源和目标 IP 地址以及交换 TCP header 中的端口,那么根据 this answersthis据推测,修改后的数据包应该通过路由系统转发给发起者。

实际上,我尝试过这种情况,似乎无法通过 netfilter Hook 来实现,但是,我不确定。我认为它不起作用,因为它有校验和问题,因为我正在处理数据包,所以我做了另一个实验来解决这个问题。我只是更改了数据包数据,一切正常。我认为校验和没有任何问题,因为它们将在接收时在 NIC 上进行检查,并且在发送时也会检查相同的情况,因此在两者之间进行操作不会造成任何错误。我还在服务器主机 (sysctl.config) 上激活了 IPv4 转发,但仍然没有任何变化。

我不想创建新数据包,我只想更改此数据包并将其发回。还有一个类似的question这是创建另一个数据包。而且,我只是在想为什么这种情况不起作用?但基于 netfilter 的架构,它应该可以工作。

谢谢

最佳答案

我也在研究这个,实际上内核在检查源 ip 地址的 NF_HOOK 中的 ip_rcv 函数之后验证源 ip 地址。所以只需尝试以下命令:-

sudo sysctl -w "net.ipv4.conf.all.rp_filter=0"

在这样做之后还禁用您发送和接收数据包的接口(interface),如下所示:-

sudo sysctl -w "net.ipv4.conf.enp2s0.rp_filter=0"

关于linux - 响应在内核的 NetFilter 中接收到的数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49202571/

相关文章:

android - 频繁执行dumpsys对Android系统的影响

c - 内核驱动程序接收到结构体,但它仍然为空

c - sys_readlink 失败 EFAULT - 备选方案

c++ - SetWindowsHookEx 问题的文档

linux - 从 hdfs dfs -ls 命令的输出中打印文件名和文件修改日期

linux - 文件名实际上是指向它们各自存储的数据的指针吗?

c# - 发送带有套接字的字符串(不是那么容易!)

git - 如何安装/配置 Git::Hooks 以与 Gerrit 一起使用

linux - 如何找到处理 bash 管道的进程

linux - 如何检查进程是否仍在 c 中的内核中运行?