阿里云实战:告别额外付费!利用有公网 ECS 免费实现无公网服务器上网
背景与痛点
最近在阿里云新开了一台 ECS 服务器(用学生券 300 元开的),但美中不足的是这台服务器没有任何外网访问权限(无公网 IP、无 EIP、无 NAT 网关),只有内网环境。

同时,账号下还有另外一台有公网 IP的 ECS 服务器。幸运的是,这两台机器在同一个 VPC、同一个虚拟交换机下,内网天然互通。
现在的核心需求是:让那台没有公网的服务器,借用有公网服务器的网络,实现正常的上网(上行与下行流量)。
在寻找方案时,很多教程会推荐购买阿里云的“NAT 网关”服务。但一问价格才发现,公网 NAT 网关是要按小时和流量额外收费的。 既然两台机器内网已经互通,难道不能直接利用现有的服务器做个“软路由”吗?
答案是可以的,而且完全免费。
核心原理
这其实就是经典的 NAT(网络地址转换) 和 IP 路由转发。
我们将有公网的那台 ECS 配置成一台 NAT 网关(软路由)。无公网的 ECS 将去往外网的流量通过 VPC 路由表扔给这台“软路由”,由它代替无公网机器访问互联网,并在收到回复后,再转发回无公网机器。
详细实操步骤
假设你的环境如下(请替换为你实际的值):
- 无公网 ECS 内网 IP:
172.16.0.20 - 有公网 ECS 内网 IP:
172.16.0.10(作为网关机) - VPC 内网网段:
172.16.0.0/16
第一步:在“有公网”的服务器上开启 IP 转发
登录到那台有公网的 ECS,修改系统内核参数,允许系统像路由器一样转发流量。
# 临时开启(重启失效)echo 1 > /proc/sys/net/ipv4/ip_forward
# 永久开启(写入配置文件)echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.confsysctl -p第二步:在“有公网”的服务器上配置 iptables
我们需要配置源地址伪装(SNAT 或 MASQUERADE),让内网机器发出的包,在出公网时被替换成有公网 ECS 的 IP。
# 配置 MASQUERADE 动态源地址伪装(推荐,自动适应网关机的内网 IP)iptables -t nat -A POSTROUTING -s 172.16.0.0/16 -j MASQUERADE
# 或者使用 SNAT 指定具体的网关机内网 IP(两者选其一即可)# iptables -t nat -A POSTROUTING -s 172.16.0.0/16 -j SNAT --to-source 172.16.0.10
# 允许转发流量(防止被防火墙 FORWARD 链拦截)iptables -A FORWARD -j ACCEPT⚠️ 配置持久化: 上述规则重启后会丢失。建议保存规则:
- CentOS:
service iptables save - Ubuntu/Debian:
apt install iptables-persistent然后执行netfilter-persistent save - 也可以将上述命令写入
/etc/rc.local等开机自启脚本中。
第三步:在阿里云控制台配置 VPC 路由表
既然已经内网互通,我们只需要在阿里云的路由表里加一条路由,告诉无公网机器怎么走。
- 登录阿里云,进入 VPC 控制台 -> 左侧导航栏 路由表。
- 找到无公网 ECS 实例关联的路由表(通常是默认路由表)。
- 点击 添加路由条目:
- 目标网段:
0.0.0.0/0(代表所有外网流量) - 下一跳类型:ECS 实例
- 下一跳:选择你那台 有公网 IP 的 ECS 实例。
- 目标网段:
- 保存。
第四步:检查安全组与网络 ACL
确保有公网 ECS 的安全组入方向规则,放行了来自内网服务器(如 172.16.0.0/16)的所有流量。如果这里没放行,流量会被阿里云的安全组直接拦截。
至此,无公网服务器已经可以通过有公网的 ECS 正常上网了。可以在无公网机器上执行 curl -I https://www.baidu.com 进行测试。
💡 避坑与注意事项(隐性成本)
虽然这个方案省下了购买官方 NAT 网关的钱,但用现有 ECS 自建网关也有它的代价,需要评估:
- 带宽瓶颈:有公网 ECS 的带宽(比如 5Mbps)会被这两台机器共享。如果无公网机器下载大文件,有公网机器的服务也会卡顿。
- 流量费:无公网机器产生的所有出网流量,都会记在有公网 ECS 的头上。如果你的公网 ECS 是按量付费,记得设置好带宽峰值或流量告警,以免产生高额账单。
- Docker 环境冲突:如果作为网关的机器上安装了 Docker,Docker 会自动修改 iptables 规则(如
DOCKER-USER链)。可能会与我们配置的转发冲突。建议将转发规则插入到 Docker 链之前,或暂时停用 Docker 进行测试。 - 单点故障:有公网的 ECS 宕机或重启,无公网 ECS 就会断网。生产环境如果有高可用需求,建议还是购买阿里云官方的 NAT 网关。
总结
对于个人开发者、测试环境或小规模业务,内网互通 = 天然的通道。利用现有的有公网 ECS 做 NAT 转发,是一个非常具有性价比的解决方案。只要理清 IP 转发、SNAT 和 VPC 路由表这三个环节,不需要多花一分冤枉钱,就能让内网机器丝滑上网。
支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或投喂支持!
无穷量?