节点 A 上已存在以下 iptables 规则:
$ iptables -t nat -nvL PREROUTING
Chain PREROUTING (policy ACCEPT 4 packets, 200 bytes)
...
64 3840 DNAT all -- * * 0.0.0.0/0 100.0.1.10 to:100.0.0.10
我又添加了一条 DNAT 规则:
$ iptables -t nat -I PREROUTING -d 100.0.2.10 -j DNAT --to-destination 100.0.1.10
$ iptables -t nat -nvL PREROUTING
Chain PREROUTING (policy ACCEPT 4 packets, 200 bytes)
...
3 252 DNAT all -- * * 0.0.0.0/0 100.0.2.10 to:100.0.1.10
64 3840 DNAT all -- * * 0.0.0.0/0 100.0.1.10 to:100.0.0.10
我希望节点 A 在收到目的地址为 100.0.2.10 的数据包时,进行两次 DNAT 转换为 100.0.0.10。但实际上,iptables 只做了一次 DNAT,将 100.0.2.10 转换为 100.0.1.10。如何实现这个目标?
也许你会问,为什么我不直接将 100.0.2.10 DNAT 到 100.0.0.10?因为获取 100.0.0.10 的逻辑比较复杂,所以这个规则是另一个应用程序创建的。如果你了解 kube-proxy,可能知道 iptables 模式下的 kube-proxy 会将 service IP DNAT 到 pod IP。我想创建一个 globalIP,先 DNAT 到 service ip,然后重用 kube-proxy 的规则,DNAT 到 pod IP。