我在 ubuntu 上(IP 为 10.0.0.1)尝试从端口 9090 抓取数据包。我想将源 IP 更改为 10.0.0.2
我通过 iptables 添加了以下规则:
# iptables -t nat -A POSTROUTING -o eth0 --protocol TCP --source-port 9090 -j SNAT --to-source 10.0.0.2:9090
# sudo iptables -t nat -vL
Chain POSTROUTING (policy ACCEPT 2432 packets, 162K bytes)
pkts bytes target prot opt in out source destination
0 0 SNAT tcp -- any eth0 anywhere anywhere tcp spt:9090 to:10.0.0.2:9090
但是,这并没有改变源 IP 地址。通过 tcpdump,我可以看到传出的数据包上的源 IP 是 10.0.0.1。
请注意,10.0.0.2 被分配给不同的机器。
我的问题是:(1) 我不确定数据包是否符合此规则。有什么好方法可以验证数据包确实符合此规则。(2) 我还需要执行/启用其他任何操作才能使 SNAT 正常工作吗(也许是链接?)。
谢谢!
答案1
谢谢@DanielB。好吧,我有一个服务器(IP 10.0.0.1)在端口 9090 上运行。当它从客户端收到 SYN 时,我希望 SYN-ACK 以 src IP:port 为 10.0.0.2:9090 发出。通过 tcpdump,我看到 SYN-ACK 以 10.0.0.1:9090 发出
我不认为有办法通过 iptables NAT 实现你想要的效果(如果你这样做了,我认为它没用,因为客户端会拒绝来自意外 IP 的数据包)
iptables NAT 适用于連接,只有每个连接的第一个数据包受用户可见的 NAT 表约束。后续数据包将根据第一个数据包建立的连接跟踪条目进行转换(或不转换)。