前言:为什么需要配置 NAT 上网?
最近有一个系统迁移项目,需要将原本部署在腾讯云公网环境的系统,迁移到xx网的混合云环境(由腾讯云提供技术支持)。迁移后整个系统由 4 台服务器组成:1 台部署 Nginx 和中间件的服务器、2 台 Java 应用服务器,以及 1 台数据库专属服务器。
网络环境的特殊性制成了新的挑战:只有且 Nginx 服务器绑定了公网 IP,可自由访问外网;但两台 Java 应用服务器出于安全管控要求,被限制了直接访问外网的权限,只能通过严格的 IP 白名单机制对外通信。
这就带来了一个实际问题:系统中的 Java 程序需要调用微信等外部服务,但每次都要梳理具体需要访问的 IP 地址并提交给甲方添加白名单,流程繁琐且耗时。为了临时解决业务阻塞问题,我私下在服务器上配置了 NAT 转发来实现 Java 服务器对微信服务的访问(再次强调:这种绕过正规流程的操作存在安全风险,千万不要效仿!)。
当然nat上网方案也可以用来省钱,在购买公有云服务的时候可以只需要一台拥有外网ip的机器。公有云也有对应的nat产品,不过费用很高。
特殊申明
需要特别说明的是,本次实现的 NAT 配置并非传统意义上的直接 NAT 配置。由于该混合云环境基于腾讯云技术支持,腾讯云对网关流量存在特殊的处理机制,这就要求网关服务器必须处于另一个子网网段中。因此,本次实际采用的是 “VXLAN + NAT” 的组合方案,通过 VXLAN 技术先实现不同子网间的通信,再结合 NAT 完成外网访问的转发。
如果大家在非腾讯云的机器环境下进行类似实践,由于不存在这种特殊的网关流量处理限制,无需考虑子网网段的特殊隔离要求,实践时可以直接省去配置 VXLAN 的步骤,仅进行常规的 NAT 配置即可实现多服务器共享单外网出口的需求。
https://www.tencentcloud.com/zh/document/product/215/33404?lang=zh
网络拓扑说明
3 台服务器,网络结构如下:
服务器 A:弹性网卡,eth0 可以连接公网(IP:10.36.53.2)
服务器 B:仅内网网卡(IP:10.36.53.6)
服务器 C:仅内网网卡(IP:10.36.53.7)
配置vxlan
服务器 A
给A分配两个IP 192.168.100.2,192.168.200.2
这两个ip属于两个网段,指定了其它同网段的机器使用的原有ip
ip link add vxlan0 type vxlan id 100 remote 10.36.53.6 dstport 4789 dev eth0
ip link set vxlan0 up
ip addr add 192.168.100.2/24 dev vxlan0
ip link add vxlan1 type vxlan id 200 remote 10.36.53.7 dstport 4789 dev eth0
ip link set vxlan1 up
ip addr add 192.168.200.2/24 dev vxlan1服务器 B
ip link add vxlan0 type vxlan id 100 remote 10.36.53.2 dstport 4789 dev eth0
ip link set vxlan0 up
ip addr add 192.168.100.6/24 dev vxlan0服务器 C
ip link add vxlan0 type vxlan id 200 remote 10.36.53.2 dstport 4789 dev eth0
ip link set vxlan0 up
ip addr add 192.168.200.7/24 dev vxlan0配置网关服务器转发流量
服务器 A
配置服务器 A 的网络转发功能
echo 1 > /proc/sys/net/ipv4/ip_forward为了使配置永久生效,需修改 sysctl 配置:
# 编辑配置文件
vi /etc/sysctl.conf
# 添加或修改以下行
net.ipv4.ip_forward = 1
# 使配置生效
sysctl -p配置 iptables 实现 NAT 转换
iptables -t nat -A POSTROUTING -s 192.168.100.2/24 -o eth0 -j MASQUERADE
iptables -A FORWARD -s 192.168.100.2/24 -j ACCEPT
iptables -A FORWARD -d 192.168.100.2/24 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -t nat -A POSTROUTING -s 192.168.200.2/24 -o eth0 -j MASQUERADE
iptables -A FORWARD -s 192.168.200.2/24 -j ACCEPT
iptables -A FORWARD -d 192.168.200.2/24 -m state --state RELATED,ESTABLISHED -j ACCEPT配置其他机器的默认路由(按需)
需要特别说明的是,本次配置中包含了 169.254.0.0/16 和 192.168.0.0/24 网段的路由设置,这是因为内网堡垒机的 IP 地址正处于这些网段中。若不添加这些路由规则,堡垒机将无法正常访问系统。请根据实际网络环境中堡垒机的具体网段信息,按需进行配置。
服务器 B
ip route add 169.254.0.0/16 dev eth0
ip route add 192.168.0.0/24 dev eth0
ip route add default via 192.168.100.2 dev vxlan0服务器 C
ip route add 169.254.0.0/16 dev eth0
ip route add 192.168.0.0/24 dev eth0
ip route add default via 192.168.200.2 dev vxlan0