背景
条件
物理服务器、Linux 操作系统、多网口 ens33、ens36,网段分别为 192.168.172.0/24、172.16.20.0/24。
需求
如何实现当访问 https://172.16.20.132:19200 时访问的是 https://192.168.172.131:9200。
方案
通过服务器系统 iptables 实现 NAT 端口映射。
步骤
启用 IP 转发
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p
设置 DNAT(目的地址转换)
将 172.16.20.132 的某个端口(如 19200)映射到 192.168.172.131 的服务端口(如 9200)
iptables -t nat -A PREROUTING -i eth0 -d 172.16.20.132 -p tcp --dport 19200 -j DNAT --to-destination 192.168.172.131:9200
# 注意:eth0 是 172.16.20.132 的网络接口名
设置 SNAT 或 MASQUERADE(源地址转换)
确保从 172 段返回的流量能够正确路由回 192 段
iptables -t nat -A POSTROUTING -o eth1 -d 192.168.172.131 -p tcp --dport 9200 -j MASQUERADE
# 注意:eth1 是 192.168.172.131 的网络接口名
防火墙配置(可选)
iptables -A FORWARD -i eth0 -o eth1 -p tcp --dport 9200 -j ACCEPT
iptables -A FORWARD -i eth1 -o eth0 -p tcp --sport 9200 -j ACCEPT
保存配置
service iptables save
流量工作流程
- 客户端 (172 段) 向
172.16.20.132:19200
发起请求。 - 服务器的
eth1
接收到请求,通过 DNAT 将流量转发到192.168.172.131:9200
。 192.168.172.131
的响应通过服务器返回给 172 段客户端,经过 SNAT,源地址会被替换为172.16.20.132
。
验证
测试连接
在 172 段客户端访问 curl http://172.16.20.132:19200
如果无法访问,检查以下内容:
-
iptables
NAT 规则是否生效iptables -t nat -L -n -v
-
确保服务器的
eth0
可以访问192.168.172.131
。 -
日志调试(可以启用日志查看数据流是否经过)
iptables -A FORWARD -j LOG --log-prefix "NAT_FORWARD: "
这种方式无需修改网络互通设置,只需通过 NAT 规则即可实现跨网段访问。
实验
环境
-
产品:VMware® Workstation 16 Pro
-
版本:16.2.4 build-20089737
-
虚拟机/服务
主机 服务 端口 备注 192.168.172.131/24 elasticsearch 9200 部署 es 服务 172.16.20.132/24 - 19200 NAT 映射、验证
步骤
创建虚拟网络
点击下图【添加网络】按钮,并添加仅主机模式的 VMnet9,VMnet1 默认存在,可不用改动。
虚拟机添加双网卡
分别添加 VMnet9、VMnet1 仅主机模式的虚拟网卡。
如下会多出一个网络 ens36,下面静态我已经配置过了。
如何配置静态IP?
ens33:
vim /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=b1684e7b-7e07-4a97-aab3-deaf26b8d82b
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.172.131
NETMASK=255.255.255.0
GATEWAY=192.168.172.2
DNS1=114.114.115.115
DNS2=61.139.2.69
ens36:
获取 ens36 的 UUID
cp /etc/sysconfig/network-scripts/ifcfg-ens33 /etc/sysconfig/network-scripts/ifcfg-ens36
vim /etc/sysconfig/network-scripts/ifcfg-ens36
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens36
UUID=89d5e81a-d9d3-4ef7-8f10-fd82b4fc707d
DEVICE=ens36
ONBOOT=yes
IPADDR=172.16.20.132
NETMASK=255.255.255.0
GATEWAY=172.16.20.2
DNS1=114.114.115.115
DNS2=61.139.2.69
部署 ES 服务
部署过程略。
https://192.168.172.131:9200/
此时 https://172.16.20.132:9200/ 是无法访问的,因为网络不同
启用 IP 转发
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p
设置 DNAT - 目标地址转换
将 172.16.20.132 的某个端口(如 19200)映射到 192.168.172.131 的 9200 端口
iptables -t nat -A PREROUTING -i ens36 -d 172.16.20.132 -p tcp --dport 19200 -j DNAT --to-destination 192.168.172.131:9200
# 此规则的作用是将到达 172.16.20.132 的 TCP 流量,端口为 19200 的请求,转发到 192.168.172.131 的 9200 端口。
设置 DNAT - 源地址转换
确保从 192 段返回的流量能够正确路由回 172 段
iptables -t nat -A POSTROUTING -o ens33 -d 192.168.172.131 -p tcp --dport 9200 -j MASQUERADE
# 此规则的作用是,当返回流量从 192.168.172.131:9200 发往客户端时,源IP会被伪装成出接口 ens33 的IP地址。
查看 iptables 规则:
iptables -t nat -L -n -v
访问验证
https://172.16.20.132:19200/
证明了我们的 NAT 转换效果。
思考?
以上讨论的是单服务器多网口、网口不同网段情况下的 NAT 配置,那如果是多服务器的情况下呢?又如何配置呢?其实还是一样的。
物理服务器、Linux 操作系统
A 服务器 ens33、192.168.172.131/24
B 服务器 ens36、172.16.20.132/24;ens40、192.168.172.132/24
A 服务器为单网口接入网线,B 服务器为多网口接入网线,B 服务器的 ens40 与 A 服务器的 ens33 处于同个网络。
如何实现当访问 https://172.16.20.132:19200 时访问的是A服务器的 https://192.168.172.131:9200。
步骤:
-
B 服务器上配置端口转发(DNAT)
sudo iptables -t nat -A PREROUTING -i ens36 -d 172.16.20.132 -p tcp --dport 19200 -j DNAT --to-destination 192.168.172.131:9200
-
B 服务器上配置源地址转换(SNAT)
sudo iptables -t nat -A POSTROUTING -o ens40 -j MASQUERADE
—END
B 服务器上配置端口转发(DNAT)
sudo iptables -t nat -A PREROUTING -i ens36 -d 172.16.20.132 -p tcp --dport 19200 -j DNAT --to-destination 192.168.172.131:9200
-
B 服务器上配置源地址转换(SNAT)
sudo iptables -t nat -A POSTROUTING -o ens40 -j MASQUERADE
—END