很多人第一次把业务迁到阿里云专有网络(VPC)时,都会碰到同一个问题:服务器没有公网IP,却要访问外网拉依赖、调第三方接口。阿里云NAT网关就是为这类场景准备的托管服务,内网实例可以共用一个公网出口,内网服务也能通过它暴露到公网。先把两类规则讲清楚,再用三个案例过一遍配置方法和常见坑。

NAT网关管什么
NAT(网络地址转换)做的事,是改写数据包的源地址或目标地址。阿里云NAT网关在VPC和公网之间干这件事,主要靠两类规则。
- SNAT规则负责出网,没有公网IP的ECS访问互联网时,出口统一换成绑定的弹性公网IP(EIP)。
- DNAT规则负责入网,把EIP上的某个端口转发到内网ECS的某个端口,让外部用户能访问内网服务。
和给每台服务器单独绑EIP相比,好处很直接。出口IP集中,第三方做白名单只需要登记一个或几个地址,服务器本身也不必暴露在公网上。
案例一:固定出口IP对接支付渠道
某小型电商团队的订单服务跑在华东1地域的一组ECS上,这些实例都没有公网IP。支付渠道要求商户服务器的出口IP加入白名单,而且这个IP不能经常变。团队的做法是这样的。
- 创建公网NAT网关,绑定一个EIP。
- 新增SNAT条目,选择订单服务所在的交换机,关联这个EIP。
- 把EIP提交给支付渠道加白名单。
- 在任一ECS上用 curl 访问一个回显IP的接口,确认返回的确实是这个EIP。
上线后,订单服务的外呼都从同一个IP出去,白名单的问题就没再出现。有一点要留意,SNAT条目是按交换机配的。以后新增子网,要补一条对应的SNAT,否则新机器会出网失败,排查时容易误以为是安全组的问题。
案例二:连接数打满后怎么扩
另一个案例来自一家做数据采集的公司。采集程序分布在20台ECS上,高峰期大量请求同时打向几个第三方域名。某天下午,部分请求开始超时,监控里的连接失败数一路往上走。
查下来,问题出在源端口上。SNAT转换时,每个公网IP可用的源端口数量有限。如果大量并发连接都指向同一个目标IP和端口,它们会占用同一批端口,超过上限后,新连接就建不起来。团队的处理分三步。
- 在同一个NAT网关上多绑几个EIP,SNAT条目关联全部EIP。连接会分散到多个出口IP上,单个IP的端口压力随之下降。
- 程序侧对长连接启用HTTP Keep-Alive,减少短连接反复占用端口。这一项往往比加IP见效更快,也更省钱。
- 监控里加上SNAT连接数相关指标,接近阈值就告警,别等超时出现才发现。
调整之后,超时率明显回落。具体的端口上限和规格、目标地址有关,团队扩容前是查了官方文档确认配额的,没有凭经验估算。这一点值得照做。
案例三:用DNAT临时开放一个测试接口
一位后端工程师需要让合作方临时访问内网ECS上的接口服务,端口是8080。这台机器没有绑EIP,他用DNAT规则完成映射,步骤如下。
- 给NAT网关绑定一个EIP。手上没有可用的,就先申请一个。
- 新建DNAT条目,外部端口填8080,内网IP填ECS的私网地址,内网端口同样填8080,协议选TCP。
- 在ECS的安全组里放行8080,只允许合作方的IP段访问。
这里要注意,DNAT和安全组是两道关。只配DNAT、不收紧安全组,等于把这个端口开给了整个互联网。测试结束后,应该删除DNAT条目,光关掉服务不够,映射本身还在。
正式配置前要想清楚的三件事
- 可用区一般不能忽略。NAT网关部署在特定可用区,关键业务要结合容灾方案想清楚,是否需要多个网关分布在不同可用区。
- 费用方面,NAT网关按规格收费,公网流量另算,EIP和共享带宽也有单独的费用。上线前在费用中心试算一下,别等账单出来才意识到。
- 先在测试环境验证。SNAT和DNAT的影响范围不小,改动前先准备好回滚方案,比如记下原来的条目和EIP绑定关系。
如果你的场景是要统一出口,又不想给每台服务器都配公网IP,NAT网关基本就是合适的选择。把SNAT和DNAT两类规则弄清楚,再留意端口容量和安全组,大部分常见问题都能提前避开。