我的服务器有几个公共 IP,并且运行一堆具有私有 IP 地址的虚拟机。
例如,我想将 232.21.23.23(公网)上的端口 80、443 和 8080 映射到 192.168.122.12(私网)。我尝试了几种不同的 NAT 映射,但似乎都不起作用:
# This doesn't work.
DNAT net loc:192.168.122.12 tcp 80,443,8080 - 232.21.23.23
# Neither does this.
DNAT $FW loc:192.168.122.12 tcp 80,443,8080 - 232.21.23.23
# Nor this.
DNAT net:232.21.23.23 loc:192.168.122.12 tcp 80,443,8080
# I have no idea what I'm doing.
DNAT $FW:232.21.23.23 loc:192.168.122.12 tcp 80,443,8080
有人能给我指出正确的方向吗?
答案1
你的第一条规则是正确的:
DNAT net loc:192.168.122.12 tcp 80,443,8080 - 232.21.23.23
所以问题肯定出在其他地方。你可以用以下命令查看创建的底层 iptables 规则:
iptables -t nat -nvL net_dnat
NAT 数据包仍需要穿过 FORWARD 链并被接受。尝试添加以下规则以接受这些端口上的虚拟机流量:
ACCEPT net loc:192.168.122.12 tcp 80,443,8080
答案2
作为对前面答案的补充评论,请确保放置规则的顺序。
例子:
假设你这样配置了规则:
DNAT 网络位置:172.17.20.25 tcp 80 0.0.0.0 DNAT 网络位置:172.17.20.47 tcp 80 200.xyz
如果您想通过端口 80 访问 172.17.20.47,那么您最终将始终到达 172.17.20.25,因为目标地址是默认的 0.0.0.0。
因此,如果您想通过公网 IP 地址 200.xyz 访问 172.17.20.47,则应修改规则的顺序:
DNAT 网络位置:172.17.20.47 tcp 80 200.xyz DNAT 网络位置:172.17.20.25 tcp 80 0.0.0.0
或者修改第一条规则的默认地址。
我希望它有帮助!