![在最近的内核中,某些 ICMP-Reply 消息不会到达用户空间](https://linux22.com/image/74992/%E5%9C%A8%E6%9C%80%E8%BF%91%E7%9A%84%E5%86%85%E6%A0%B8%E4%B8%AD%EF%BC%8C%E6%9F%90%E4%BA%9B%20ICMP-Reply%20%E6%B6%88%E6%81%AF%E4%B8%8D%E4%BC%9A%E5%88%B0%E8%BE%BE%E7%94%A8%E6%88%B7%E7%A9%BA%E9%97%B4.png)
我正在将应用程序从 2.6.23(是的,它很古老;这就是我们迁移的原因)迁移到 3.18LTS。该应用程序使用 ping 数据包监视到同一目标的多个网络链接。不同的链路由下一跳路由器(以太网)或网络接口(点对点链路,又称蜂窝数据)选择。为了强制不同的路由到达同一目标,传出数据包会被标记不同的防火墙标记。然后,我使用路由规则为同一目标选择具有不同路由的不同路由表。传出路径在 2.6.23 和 3.18 中都工作得很好。然而,对于传入的 ICMP 回复来说情况并非如此。他们正在到来;我用 tcpdump 看到它们。但在 3.18 中,某些数据包不会传递到用户空间。我不是 100% 确定,但我认为如果没有到 ping 目标的“正常”路由(例如 ICMP 回复的源地址),就会发生这种情况。这看起来像是某种误导性的入口过滤,如果正常的路由查找失败,就会将数据包排除在外。
我走在正确的轨道上吗?如果是这样,有没有办法禁用此过滤?如果不是,什么可能导致这种行为改变?
答案1
好吧,我自己找到了。
答案是/proc/sys/net/ipv4/conf/*/rp_filter
。该选项记录在Linux基金会。虽然这是一个旧的设置,但 Ubuntu 似乎在 07.04 和 14.04 之间的某个时间更改了默认值。将值从 1 改回 0 解决了我的问题。