在 Linux 中拥有多个本地表的情况下响应 ICMP

在 Linux 中拥有多个本地表的情况下响应 ICMP

我有一个 IP 范围,我想监听所有 IP 地址,假设使用10.0.0.0/8
TPROXY 和数据包标记,我可以响应 TCP 流量。此范围应该在本地表中,但我不希望本地响应出站流量,因此我创建了另一个表(例如表 10)并在该表中添加了本地路由。

ip route add local 10.0.0.0/8 dev lo table 10
ip rule add fwmark 1 lookup 10
iptables -t mangle -A PREROUTING -p tcp --dport 80 -d 10.0.0.0/8 -j TPROXY --on-port 80 --on-ip 127.0.0.1 --tproxy-mark 0x1/0x1

现在我需要响应这个范围的 ICMP 消息,所以我添加了这个 iptables 规则:

iptables -t mangle -A PREROUTING -p icmp -d 10.0.0.0/8 -j MARK --set-mark 0x1

但添加此规则后,机器收到 ICMP 数据包但没有响应,成为黑洞

我究竟做错了什么?

更新:
connect: Network is unreachable我尝试向此表发送出站流量,但ping 时 出现问题,我认为这些问题相关。
尝试使用这些命令来重现此问题

ip route add local 10.0.0.0/8 dev lo table 10
ip rule add to 10.0.0.0/8 lookup 10
ping 10.0.0.1

答案1

TPROXY 用于拦截路由交通(甚至在桥上修修补补)。它可以处理 TCP 或 UDP,但不处理 ICMP

楼主暗示系统是接收流量的最终节点,而不是路由器。那么所有这些甚至达不到目的的复杂设置都是不需要的。

删除所有先前的更改(iptablesip 规则路由...)并且只做这样的事情:

ip route add local 10.0.0.0/8 dev lo table local

结尾。

如果有人希望使用单独的表格,以避免更改当地的表,可以这样做:

ip route add local 10.0.0.0/8 dev lo table 10
ip rule add preference 10 lookup 10

或者只是这样(将其添加到主要的表格代替):

ip route add local 10.0.0.0/8 dev lo

只需小心稍后为其他功能添加的其他路由规则(特别是不使用关键字时preference),以便该路线保持首先评估。

无论在何处添加路线,如果接口关闭然后打开(这种情况很少发生),此路线将会消失,必须重新添加。`

到底:

  • 不需要TPROXY
  • 无需标记
  • 无需 NAT
  • 不必考虑如何严格反向路径转发,以及rp_filter在有标记的情况下如何表现
  • 应用程序无需使用任何 IP_TRANSPARENT 套接字选项来使用此范围的地址作为源:路由很重要,而不是在任何地方添加了地址的事实(事实并非如此)。

相关内容