我有一个 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。
楼主暗示系统是接收流量的最终节点,而不是路由器。那么所有这些甚至达不到目的的复杂设置都是不需要的。
删除所有先前的更改(iptables,ip 规则,路由...)并且只做这样的事情:
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 套接字选项来使用此范围的地址作为源:路由很重要,而不是在任何地方添加了地址的事实(事实并非如此)。