xiaoxiao
发布于 2025-09-13 / 12399 阅读 / 0 评论 / 1111 点赞

[linux]偷偷上网(多服务器共享单外网出口的 NAT 配置方案)

前言:为什么需要配置 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

评论