【问题标题】:Respond to a Packet Received in The NetFilter at Kernel响应在内核的 NetFilter 中接收到的数据包
【发布时间】:2018-08-18 13:05:20
【问题描述】:

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

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

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

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

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

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

谢谢

【问题讨论】:

  • 只是猜测;尝试设置skb->pkt_type = PACKET_OTHERHOSTskb->_skb_refdst = 0。我还没有通读所有的路由代码,但这可能会解决它。这可能会也可能不会破坏您的路由堆栈;我不知道。
  • @JoelC 感谢您的评论,我尝试了您的想法,但没有成功。只是一个问题,您在哪里准确检查内核中的路由代码?!

标签: linux kernel hook kernel-module netfilter


【解决方案1】:

我也在做这个,实际上内核在 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"

【讨论】:

    猜你喜欢
    • 2022-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多