无需 NAT 的多跳路由

无需 NAT 的多跳路由

我最近开始研究 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(但当然它不能回复)。

相关内容