有没有什么办法可以获取接收到的 nat 流量?
iptables -t nat -A POSTROUTING -o eth18 --src 123.123.123.123/32 --jump SNAT --to-source 66.66.66.66
返回流量仍然使用 123.123.123.123 作为源(参见时间戳 21:17:07.207832)
21:17:07.207786 IP 10.193.92.120 > 123.123.123.123: ICMP echo request, id 1, seq 41622, length 40
21:17:07.207832 IP 123.123.123.123 > 10.193.92.120: ICMP echo reply, id 1, seq 41622, length 40
[root@Rats ~]# route -n | grep 10.193.88.0
10.193.88.0 10.193.88.1 255.255.248.0 UG 0 0 0 eth18
10.193.88.0 0.0.0.0 255.255.248.0 U 0 0 0 eth18
RT 的样子如下
[root@Rats ~]# ip route get 123.123.123.123
local 123.123.123.123 dev lo src 123.123.123.123
cache <local> mtu 16436 advmss 16396 hoplimit 64
[root@Rats ~]# ip route get 10.193.92.120
10.193.92.120 via 10.193.88.1 dev eth18 src 10.193.92.126
cache mtu 1500 advmss 1460 hoplimit 64
[root@Rats ~]# route -n | grep 10.193.88.0
10.193.88.0 10.193.88.1 255.255.248.0 (<</21) UG 0 0 0 eth18
10.193.88.0 0.0.0.0 255.255.248.0 U 0 0 0 eth18
除了 IPtable 命令之外,我还尝试了其他一些方法
for f in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 0 > $f; done
echo 1 > /proc/sys/net/ipv4/ip_forward
但还是没有运气,有什么想法吗?
谢谢
答案1
入站的、本地目的地的数据包永远不会经过 NAT 表的 POSTROUTING 链:
(https://www.garron.me/images/2012-04/Netfilter-packet-flow.svg)
但阅读精细手册揭示了:
源地址转换
此目标仅在 nat 表、POSTROUTING 和 INPUT 链中有效 [...]
2.6.36-rc1 之前的内核不具备在 INPUT 链中进行 SNAT 的能力。
因此,您应该使用以下方法:
iptables -t nat -A INPUT -i eth18 --src 123.123.123.123/32 -j SNAT --to-source 66.66.66.66
请注意,这不仅会将链更改为 INPUT,而且还会更正规则以eth18
用作输入接口。您可以通过查看以下数据包计数器来验证是否有任何内容符合您的规则:iptables -t nat -L INPUT -v -n