![无需 NAT 的多跳路由](https://linux22.com/image/721663/%E6%97%A0%E9%9C%80%20NAT%20%E7%9A%84%E5%A4%9A%E8%B7%B3%E8%B7%AF%E7%94%B1.png)
我最近开始研究 iptables 和路由,遇到了以下问题:
我有四台服务器 A、B、C、D,它们都启用了 ip_forwarding,我的目标只是通过链路由 icmp echo 请求,同时保留原始 IP。不幸的是,转发不能正常工作。
(A = 192.168.0.1 = eth0)<--->(B = 192.168.0.2 = eth0,192.168.1.2 = eth1)<--->(B = 192.168.1.3 = eth0,192.168.2.3 = eth1)<--->(D=192.168.2.4 = eth0)
此外,我还有以下路线:
- 答:192.168.2.4 通过 192.168.0.2
- B:192.168.2.4 通过 192.168.1.3
- C: -
- D:-
因此,我这个小例子的意图是,请求根据静态路由通过链进行路由。当然,我知道 ping 不会成功,因为 D 和 C 没有到 A 的路由。但我的意图只是用 tcpdump 检测流量。
总的来说,我认为数据包只需在路由表中查找路由即可转发,然后发送到相应的目的地或网关。但是,如果不使用 NAT,这似乎行不通。icmp 请求由 C 在 eth0 上接收,但是 C 不会将它们转发给 D。
当然,我可以在 B 上使用一些伪装/snat(我还没有测试过),但我很确定 D 会收到来自 B(“而不是” A)的请求。
一般情况下,不使用 NAT 就可以执行“多跳”路由吗?还是只缺少一些 iptables FORWARD 规则,让我可以这样做?
是否有可能调试/查找 iptables 对数据包的操作?目前,我只找到了 LOG 目标,但说实话,两次创建所有规则真的很烦人。
答案1
Linux 实现RFC1704 的反向路径转发/过滤,大多数发行版默认启用该功能。也就是说,仅当反向路径(由路由表定义)使用与数据包进入的接口相同的传出接口时(或使用松散模式,如果有任何接口可以为此数据包提供路由)才允许接收/转发数据包。这样做是为了防止欺骗。
要进行非对称路由测试或其他非常规设置,只需禁用rp_过滤器在每个节点上的两个涉及的接口(“全部”)上(这里 C 和 D 就足够了,其他节点有足够的路由):
for i in /proc/sys/net/ipv4/conf/{eth[01],all}/rp_filter; do echo 0 > "$i"; done
这样做可以让服务器 D 接收 icmp ping(但当然它不能回复)。