ICMP TTL 超出来自 NAT 路由器的目标 IP 回复

ICMP TTL 超出来自 NAT 路由器的目标 IP 回复

我正在玩 nftables 并观察到一些我无法解释的奇怪行为。

我有三台虚拟机,sourcerouterdestination全部运行最新的 Oracle EL 8.5 并通过 nft 进行配置。

  • source具有单个网络接口enp0s8,IP 为 10.111.111.1,位于 /24 子网中。
  • router有两个网络接口:enp0s8IP 为 10.111.111.2(位于 /24 子网)和enp0s9IP 为 10.100.100.2(位于 /24 子网)。
  • destination具有单个网络接口enp0s8,IP 为 10.100.100.1,位于 /24 子网中。

我的目标是隐藏destinationsourceNAT 后面,IP 为 10.200.200.1。我所做的是:

  1. 已启用 IP 路由router
  2. 阻止从 10.111.111.0/24 到 10.100.100.0/24 的直接访问router
  3. 通过 10.111.111.2(router)添加了静态路由 10.200.200.0/24 source
  4. 配置 NATrouter如下:
        chain prerouting {
                type nat hook prerouting priority dstnat; policy accept;
                iifname "enp0s8" ip daddr 10.200.200.1 dnat to 10.100.100.1
        }

        chain postrouting {
                type nat hook postrouting priority srcnat; policy accept;
                ip saddr 10.100.100.1 oifname "enp0s8" snat to 10.200.200.1
        }

一切都按预期工作,只能destination从 10.200.200.1 访问,而不能从 10.100.100.1 访问source(当然,我知道在 root 下工作不好,这只是实验性的虚拟机):

[root@source ~]# ping 10.100.100.1
PING 10.100.100.1 (10.100.100.1) 56(84) bytes of data.
^C
--- 10.100.100.1 ping statistics ---
15 packets transmitted, 0 received, 100% packet loss, time 14320ms

[root@source ~]# ping 10.200.200.1
PING 10.200.200.1 (10.200.200.1) 56(84) bytes of data.
64 bytes from 10.200.200.1: icmp_seq=1 ttl=63 time=0.554 ms
64 bytes from 10.200.200.1: icmp_seq=2 ttl=63 time=1.80 ms
64 bytes from 10.200.200.1: icmp_seq=3 ttl=63 time=1.84 ms
^C
--- 10.200.200.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2043ms
rtt min/avg/max/mdev = 0.554/1.397/1.836/0.598 ms

但是当我执行 traceroute 或发送 TTL=1 的 ping 时,回复的 IP 是 10.200.200.1,而不是router的 IP 10.111.111.2:

[root@source ~]# traceroute 10.200.200.1
traceroute to 10.200.200.1 (10.200.200.1), 30 hops max, 60 byte packets
 1  10.200.200.1 (10.200.200.1)  0.752 ms  0.679 ms  0.984 ms
 2  10.200.200.1 (10.200.200.1)  1.181 ms  1.130 ms  1.070 ms
[root@source ~]# ping 10.200.200.1 -c 1 -t 1
PING 10.200.200.1 (10.200.200.1) 56(84) bytes of data.
From 10.200.200.1 icmp_seq=1 Time to live exceeded

--- 10.200.200.1 ping statistics ---
1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms

如果我对 10.200.200.0/24 子网中的任何其他地址执行相同操作,则回复具有正确的 IP:

[root@source ~]# ping 10.200.200.2 -c 1 -t 1
PING 10.200.200.2 (10.200.200.2) 56(84) bytes of data.
From 10.111.111.2 icmp_seq=1 Time to live exceeded

--- 10.200.200.2 ping statistics ---
1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms

有人能解释一下为什么在第一种情况下 ICMP TTL 超出答复具有最终目的地的 IP,而在第二种情况下它具有路由器的 IP?

相关内容