我正在玩 nftables 并观察到一些我无法解释的奇怪行为。
我有三台虚拟机,source
和router
。destination
全部运行最新的 Oracle EL 8.5 并通过 nft 进行配置。
source
具有单个网络接口enp0s8
,IP 为 10.111.111.1,位于 /24 子网中。router
有两个网络接口:enp0s8
IP 为 10.111.111.2(位于 /24 子网)和enp0s9
IP 为 10.100.100.2(位于 /24 子网)。destination
具有单个网络接口enp0s8
,IP 为 10.100.100.1,位于 /24 子网中。
我的目标是隐藏destination
在source
NAT 后面,IP 为 10.200.200.1。我所做的是:
- 已启用 IP 路由
router
。 - 阻止从 10.111.111.0/24 到 10.100.100.0/24 的直接访问
router
。 - 通过 10.111.111.2(
router
)添加了静态路由 10.200.200.0/24source
。 - 配置 NAT
router
如下:
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?