我有两个这样的 iptables 规则:
# vmbr0 - WAN bridge, vmbr1 - LAN bridge
iptables -t nat -A PREROUTING -i vmbr0 -p tcp --dport 3306 -j DNAT --to-destination 10.5.0.250
iptables -t nat -A POSTROUTING -o vmbr1 -p tcp --dport 3306 -d 10.5.0.250 -j SNAT --to-source 10.5.0.1
当同一网络中的一台计算机(例如 10.5.0.10)连接到另一台计算机(例如 10.5.0.11)时,由于这些规则,地址会被转换为 10.5.0.1,这是真的吗?
如何避免这种情况并保持本地流量不变?
我正在使用虚拟化(Proxmox)。虚拟化主机有一个与网桥 vmbr0 连接的物理网络 eth0。虚拟机和容器仅连接到 vmbr1。因为有单个公共 IP(网桥 vmbr0) - 我必须在 vmbr0 和 vmbr1 之间创建 NAT,以将服务从“LAN”公开到公共网络。
答案1
iptables -t nat -A PREROUTING -i vmbr0 -p tcp --dport 3306 -j DNAT --to-destination 10.5.0.250
任何发送至 TCP 端口 3306 的传入流量vmbr0
都将其目标地址更改为 10.5.0.250。
iptables -t nat -A POSTROUTING -o vmbr1 -p tcp --dport 3306 -d 10.5.0.250 -j SNAT --to-source 10.5.0.1
目标 IP 为 10.5.0.250 且目标 TCP 端口为 3306 的任何传出流量的vmbr1
源 IP 地址都将更改为 10.5.0.1。
您的“本地交通”连接到哪座桥?
无论哪种方式,根据这些规则,只有目标端口为 3306/TCP 的流量才会被 NAT 处理:任何其他目标端口都将保持不变。
如果 10.5.0.* 网络连接到网桥vmbr1
(如配置所示),那么这些规则应该具有完全没有效果10.5.0.10 和 10.5.0.11 之间的任何流量。