华为云VPC NAT网关完全配置指南:从零搭建公网访问架构
1. NAT网关:VPC公网访问的枢纽
在华为云VPC(虚拟私有云)中,云服务器默认处于隔离的内网环境,无法直接访问公网,公网客户端也无法直接访问内网服务。解决这一问题的核心组件就是NAT网关(Network Address Translation Gateway)。NAT网关能够为VPC内的弹性云服务器提供网络地址转换服务,使多个云服务器可以共享使用弹性公网IP访问互联网,或使云服务器对外网提供服务。
NAT网关的核心价值体现在两个层面:一是节约公网IP资源,当VPC内存在大量云服务器时,为每台服务器单独分配弹性公网IP不仅管理效率低下,还会增加公网暴露面,带来安全风险;二是隐藏内网拓扑,通过NAT网关作为统一的公网出入口,VPC内云服务器的私有IP不会对外暴露,有效防止了网络部署信息的泄露。
华为云NAT网关分为公网NAT网关和私网NAT网关两大类。公网NAT网关用于VPC与公网之间的地址转换,是实现公网访问的核心组件;私网NAT网关则用于VPC与VPC之间、VPC与云下IDC之间的私网地址转换,主要解决网段冲突下的互通问题。本文聚焦于公网NAT网关的配置,帮助读者从零开始搭建VPC的公网访问能力。
需要先登录华为云控制台,点击:华为云控制台,还没有账号,点击:注册并关联,已有账号点击:登录后关联
2. SNAT与DNAT:NAT网关的两大核心功能
理解NAT网关的配置,首先要分清SNAT和DNAT这两个核心功能。它们分别对应了两种截然不同的流量方向。
2.1 SNAT:让内网服务器主动访问公网
SNAT(源网络地址转换)的功能是将VPC内云服务器的私有IP地址转换为弹性公网IP地址,使得内网服务器能够主动发起对外网的访问。当VPC内的多台云服务器需要访问外网时,可以使用NAT网关的SNAT功能,通过共享一个或多个弹性IP的方式访问外网。SNAT规则的核心要素包括:使用场景(通常选择\"虚拟私有云\")、关联的子网或网段、以及绑定的弹性公网IP。
一条SNAT规则可以绑定最多20个弹性公网IP,同一NAT网关下的多条SNAT规则可以共享同一个弹性公网IP。SNAT的性能受两个因素制约:NAT网关的规格决定了SNAT最大连接数和每秒新建连接数,而弹性公网IP的带宽决定了实际的数据吞吐量。
2.2 DNAT:将内网服务暴露给公网用户
DNAT(目的网络地址转换)的功能正好与SNAT相反,它是将弹性公网IP的特定端口映射到VPC内云服务器的私有IP和端口上,使得公网客户端能够访问内网中部署的服务。同一个VPC内的一个或多个云服务器需要面向公网提供服务时,就需要为公网NAT网关配置DNAT规则。
DNAT规则支持两种映射模式:端口映射模式将EIP的特定协议+端口转发到目标服务器的指定端口;IP映射模式则将EIP的所有流量全部转发到一台目标服务器。每台服务器只能配置一条DNAT规则。一个NAT网关下最多支持添加200条DNAT规则。
3. 配置前的资源规划与前提条件
在动手配置之前,需要做好以下资源规划和确认工作。
3.1 确认VPC与子网
NAT网关必须归属于某个VPC,且创建后VPC不可更改。每个VPC只能创建一个公网NAT网关。因此,在创建NAT网关之前,需要先确认目标VPC以及NAT网关所在的子网。子网至少需要一个可用的IP地址供NAT网关占用。
3.2 准备弹性公网IP
NAT网关本身不持有公网IP,必须绑定弹性公网IP(EIP)才能实现公网通信。根据使用场景,可能需要准备一个或多个EIP:SNAT规则需要绑定EIP用于出公网访问;DNAT规则需要绑定EIP用于入公网提供服务。如果既要让服务器访问公网,又要让公网访问服务器,可以分别为SNAT和DNAT绑定不同的EIP,也可以共用同一个EIP。
3.3 账户与权限准备
使用NAT网关服务前,需要完成华为云账号的注册、实名认证并充值账户。操作者需要拥有VPC和NAT网关的相关操作权限,建议使用IAM子账号并授予最小权限原则。
4. 配置公网NAT网关的完整步骤
本章按照实际操作顺序,从创建VPC到配置完成,逐步拆解整个配置流程。
4.1 第一步:创建VPC与子网
如果还没有VPC,需要先创建一个。登录华为云控制台,进入\"网络 > 虚拟私有云\",点击\"创建虚拟私有云\"。填写VPC名称和CIDR网段(如192.168.0.0/16),同时创建至少一个子网(如192.168.1.0/24)。如果已有VPC,可以跳过此步,直接使用现有VPC和子网。
4.2 第二步:购买弹性公网IP
进入\"网络 > 弹性公网IP\",点击\"购买弹性公网IP\"。选择区域(需与VPC所在地域一致)、计费模式(按需或包年包月)、带宽大小等参数。一个EIP可以后续绑定到NAT网关、弹性云服务器或弹性负载均衡上。
4.3 第三步:创建公网NAT网关
进入\"网络 > NAT网关\",点击\"创建公网NAT网关\"。关键配置项包括:
- 规格:小型、中型、大型、超大型四种,根据预期的并发连接数和新建连接数选择
- 名称:自定义,最大64个字符
- 虚拟私有云:选择目标VPC,创建后不可更改
- 子网:选择VPC内的一个子网,NAT网关会占用该子网的一个IP地址
- 高级配置:可添加描述和标签(可选)
确认信息后点击\"立即创建\"并提交。
关键机制:在创建第一个公网NAT网关时,系统会自动在VPC的默认路由表中添加一条目的地址为0.0.0.0/0、下一跳类型为NAT网关的默认路由。这条路由会将所有访问公网的流量引向NAT网关。如果在创建NAT网关前VPC的默认路由表中已经存在0.0.0.0/0的默认路由,则自动添加会失败,此时需要在NAT网关创建成功后手动添加路由。
4.4 第四步:添加SNAT规则
NAT网关创建完成后,进入NAT网关详情页,选择\"SNAT规则\"页签,点击\"添加SNAT规则\"。
- 使用场景:选择\"虚拟私有云\",表示对VPC内的子网生效
- 网段:选择需要访问公网的子网,也可以选择整个VPC网段
- 弹性公网IP:从已购买的EIP中选择一个或多个绑定
配置完成后,该子网内的所有云服务器即可通过NAT网关共享EIP访问公网。VPC内的每个子网只能添加一条SNAT规则。
4.5 第五步:添加DNAT规则(可选)
如果需要将内网服务暴露给公网,进入NAT网关详情页,选择\"DNAT规则\"页签,点击\"添加DNAT规则\"。
- 使用场景:选择\"虚拟私有云\"
- 弹性公网IP:选择用于对外提供服务的EIP
- 协议:TCP或UDP
- 公网端口:EIP上对外开放的端口
- 私网IP:目标云服务器的私有IP地址
- 私网端口:目标云服务器上服务监听的端口
配置完成后,公网客户端即可通过EIP:公网端口访问内网服务器上的服务。
5. 路由表的核心作用与配置要点
路由表是NAT网关能够正常工作的关键环节。很多公网访问失败的问题,根源都在路由表配置上。
5.1 默认路由的自动添加
如前所述,创建公网NAT网关时系统会自动在VPC的默认路由表中添加一条0.0.0.0/0指向该NAT网关的路由。这条路由的作用是:当VPC内云服务器发出的数据包的目的IP不是VPC内部网段时,数据包会被路由到NAT网关,由NAT网关进行地址转换后转发到公网。这条路由非常重要,不能随意删除。
5.2 手动添加路由的场景
在以下情况下需要手动配置路由:
- 创建NAT网关前VPC默认路由表已存在0.0.0.0/0路由,导致自动添加失败
- 使用了自定义路由表而非默认路由表,需要手动在关联子网的路由表中添加指向NAT网关的路由
- 需要实现更精细的流量控制,例如只将特定目的网段的流量指向NAT网关
手动添加路由时,目的网段可以配置为0.0.0.0/0(所有公网流量),也可以配置为具体的公网网段。但需要注意的是,如果VPC内的云服务器同时绑定了弹性公网IP,则会在云服务器内部增加默认网段的策略路由,且优先级高于NAT网关的路由,此时流量会优先走EIP直通而不会经过NAT网关。
5.3 路由表配置的约束
华为云路由表有以下约束需要注意:自定义路由表的目的网段不能被包含在local类型路由的网段内;同一个路由表中路由的目的网段不能相同;一次下发的路由条目数不能超过5条。
6. 通过OpenAPI自动化创建NAT网关(Python示例)
对于需要批量创建或基础设施即代码(IaC)的场景,可以通过华为云OpenAPI来编程式地创建NAT网关并配置规则。以下是一个使用Python和requests库调用NAT网关API的完整示例。
6.1 获取认证Token
import requests
import json
# IAM认证信息
IAM_ENDPOINT = \"https://iam.myhuaweicloud.com/v3/auth/tokens\"
PROJECT_ID = \"your_project_id\"
USERNAME = \"your_username\"
PASSWORD = \"your_password\"
DOMAIN_NAME = \"your_domain_name\"
def get_token():
payload = {
\"auth\": {
\"identity\": {
\"methods\": [\"password\"],
\"password\": {
\"user\": {
\"name\": USERNAME,
\"password\": PASSWORD,
\"domain\": {\"name\": DOMAIN_NAME}
}
}
},
\"scope\": {
\"project\": {\"name\": \"cn-north-4\"}
}
}
}
response = requests.post(IAM_ENDPOINT, json=payload)
token = response.headers.get(\"X-Subject-Token\")
return token6.2 创建公网NAT网关
NAT_ENDPOINT = \"https://nat.cn-north-4.myhuaweicloud.com\"
def create_nat_gateway(token, vpc_id, subnet_id, name=\"my-nat-gateway\", spec=\"small\"):
url = f\"{NAT_ENDPOINT}/v2/{PROJECT_ID}/nat_gateways\"
headers = {\"X-Auth-Token\": token, \"Content-Type\": \"application/json\"}
payload = {
\"nat_gateway\": {
\"name\": name,
\"description\": \"Created by Python API\",
\"spec\": spec,
\"router_id\": vpc_id,
\"internal_network_id\": subnet_id
}
}
response = requests.post(url, headers=headers, json=payload)
return response.json()创建公网NAT网关的API接口URI格式为POST /v2/{project_id}/nat_gateways。
6.3 添加SNAT规则
def add_snat_rule(token, nat_gateway_id, subnet_cidr, eip_id):
url = f\"{NAT_ENDPOINT}/v2/{PROJECT_ID}/snat_rules\"
headers = {\"X-Auth-Token\": token, \"Content-Type\": \"application/json\"}
payload = {
\"snat_rule\": {
\"nat_gateway_id\": nat_gateway_id,
\"cidr\": subnet_cidr,
\"floating_ip_id\": eip_id,
\"description\": \"SNAT rule for subnet\"
}
}
response = requests.post(url, headers=headers, json=payload)
return response.json()6.4 添加DNAT规则
def add_dnat_rule(token, nat_gateway_id, private_ip, protocol, public_port, private_port, eip_id):
url = f\"{NAT_ENDPOINT}/v2/{PROJECT_ID}/dnat_rules\"
headers = {\"X-Auth-Token\": token, \"Content-Type\": \"application/json\"}
payload = {
\"dnat_rule\": {
\"nat_gateway_id\": nat_gateway_id,
\"private_ip\": private_ip,
\"protocol\": protocol,
\"floating_ip_id\": eip_id,
\"internal_service_port\": private_port,
\"external_service_port\": public_port
}
}
response = requests.post(url, headers=headers, json=payload)
return response.json()6.5 完整调用示例
if __name__ == \"__main__\":
token = get_token()
vpc_id = \"vpc-xxxxxx\"
subnet_id = \"subnet-xxxxxx\"
eip_id = \"eip-xxxxxx\"
# 创建NAT网关
nat_result = create_nat_gateway(token, vpc_id, subnet_id)
nat_gateway_id = nat_result[\"nat_gateway\"][\"id\"]
# 添加SNAT规则
snat_result = add_snat_rule(token, nat_gateway_id, \"192.168.1.0/24\", eip_id)
# 添加DNAT规则(将80端口映射到内网服务器的8080端口)
dnat_result = add_dnat_rule(token, nat_gateway_id, \"192.168.1.10\", \"tcp\", 80, 8080, eip_id)API调用要求NAT网关的状态为ACTIVE时才能成功添加规则。在实际生产环境中,建议增加状态轮询逻辑,等待NAT网关创建完成后再添加规则。
7. 高级场景:跨VPC共享NAT网关
在某些场景下,多个VPC希望共享一个NAT网关来实现公网访问,以节省资源和管理成本。华为云支持通过VPC对等连接实现这一目标。
7.1 场景描述
假设在同一区域有两个VPC:VPC A(网段192.168.0.0/16,子网subnet A为192.168.1.0/24)和VPC B(网段192.168.0.0/16,子网subnet B为192.168.2.0/24)。在VPC A中创建公网NAT网关并配置SNAT和DNAT规则,然后通过对等连接将VPC A的subnet A与VPC B的subnet B连通,使subnet B也能使用VPC A的NAT网关访问公网和对外提供服务。
7.2 配置要点
实现跨VPC共享NAT网关的关键配置在于SNAT规则的使用场景选择:
- 为subnet A添加SNAT规则时,使用场景选择\"虚拟私有云\",子网选择subnet A
- 为subnet B添加SNAT规则时,使用场景选择\"云专线/云连接\",网段填写subnet B的CIDR(192.168.2.0/24)
DNAT规则的配置同理:为subnet A中的服务器添加DNAT规则时使用场景选择\"虚拟私有云\";为subnet B中的服务器添加DNAT规则时使用场景选择\"云专线/云连接\"。
前提条件:两个VPC的网段不能重叠,否则对等连接无法建立。
8. 高级场景:云专线混合云中的NAT网关
对于混合云场景,用户本地数据中心(IDC)通过云专线接入华为云VPC,IDC中的大量服务器也需要访问公网或为公网提供服务。
8.1 场景架构
假设用户IDC网段为172.18.0.0/24,通过云专线接入华为云\"华北-北京四\"区域的VPC(子网网段172.16.0.0/24)。在VPC中创建公网NAT网关,并通过SNAT和DNAT规则为IDC服务器提供公网访问能力。
8.2 配置步骤
首先创建VPC及子网,然后配置云专线将IDC与VPC连通。专线开通后,需要在IDC侧配置路由:静态路由模式下在IDC侧添加0.0.0.0/0的默认路由指向专线;BGP模式下通过BGP自动学习默认路由。接着购买EIP并创建公网NAT网关。最后添加SNAT规则,使用场景选择\"云专线/云连接\",网段填写IDC的网段172.18.0.0/24,并绑定EIP。如需对外提供服务,再添加DNAT规则,将IDC内服务器的私有IP和端口映射到EIP上。
8.3 方案优势
云专线单线路最大支持10Gbps带宽连接,配合NAT网关的SNAT和DNAT功能,可实现多个IDC服务器共享EIP访问公网,有效降低成本。NAT网关规格和绑定的EIP均可随时调整,配置简单即开即用。
9. 安全加固:安全组与网络ACL的配合
NAT网关解决了公网连通性问题,但安全问题同样不容忽视。华为云推荐通过安全组和网络ACL来实现访问控制。
9.1 安全组配置
安全组是一个逻辑上的分组,为具有相同安全保护需求并相互信任的云服务器提供访问策略。对于通过NAT网关访问公网的服务器,安全组的出方向规则需要放行到公网的流量;对于通过DNAT对外提供服务的服务器,安全组的入方向规则需要放行来自公网的访问请求。特别注意:对于部分运营商判断的高危端口(如22、3389等),建议谨慎开放或更换为其他端口。
9.2 最小权限原则
在身份认证和权限管理方面,建议使用IAM子账号进行操作,并为不同角色授予最小权限。妥善管理身份认证信息,减小因凭证泄露导致的数据泄露风险。
10. 常见问题排查与故障诊断
配置NAT网关后遇到公网访问失败,可以按照以下清单逐一排查。
10.1 路由表检查
这是最常见的问题根源。检查VPC中与子网关联的路由表是否包含指向NAT网关的路由。如果缺少该路由,需要手动添加,目的地址至少应包含要访问的公网IP地址。同时检查路由表中是否存在0.0.0.0/0的默认路由且下一跳正确指向NAT网关。
10.2 安全组与网络ACL检查
确认云服务器所属安全组的出方向和入方向规则是否正确放行了所需的流量。对于SNAT场景,重点检查出方向规则;对于DNAT场景,重点检查入方向规则。
10.3 DNAT规则状态检查
如果DNAT规则不生效,检查DNAT规则列表中该规则的状态是否为正常。同时确认NAT网关本身的状态为ACTIVE。
10.4 SNAT连接数超限
如果通过NAT网关访问公网时出现丢包或连接失败,可以通过云监控服务查看SNAT连接数。如果当前连接数超过了NAT网关规格所支持的上限,就会出现丢包或连接失败。此时需要升级NAT网关规格或优化应用减少并发连接数。
10.5 EIP绑定检查
确认SNAT规则或DNAT规则中绑定的EIP状态正常且未被解绑。如果更换了EIP,需要同步更新NAT网关上的规则。
11. 计费模式与规格选型建议
合理选择NAT网关的规格和计费模式,可以在保障业务性能的同时有效控制成本。
11.1 计费模式
华为云NAT网关提供\"包年/包月\"和\"按需计费\"两种计费模式。包年/包月是先付费再使用,适用于对资源需求稳定且希望降低成本的用户,通过预付费可以获得一定程度的价格优惠。按需计费则更加灵活,按实际使用时长计费,适合业务量波动较大的场景。私网NAT网关仅支持按需计费模式。
11.2 规格选择
公网NAT网关共有小型、中型、大型、超大型四种规格。不同规格影响SNAT最大连接数和SNAT每秒新建连接数,但不会影响DNAT的性能。选择规格时应根据预期的并发连接数和新建连接数进行评估。如果按需计费模式下变更了规格,将按照当日使用的最大规格进行计费。
11.3 成本优化建议
通过NAT网关让多台服务器共享EIP,本身就比每台服务器单独绑定EIP更加经济。如果对带宽有更高要求,可以将EIP加入共享带宽以节省带宽资源。同时,根据业务实际需要选择合适的规格,避免规格过高造成资源浪费。
12. 总结
华为云VPC NAT网关是实现VPC内云服务器公网访问的核心组件,通过SNAT和DNAT两大功能分别解决出方向和入方向的公网通信需求。配置流程清晰:创建VPC和子网、购买EIP、创建公网NAT网关、添加SNAT/DNAT规则,路由表会自动添加0.0.0.0/0默认路由指向NAT网关。对于跨VPC共享NAT网关和混合云等高级场景,通过对等连接和云专线可以实现更灵活的架构设计。在运维层面,路由表配置、安全组放行、SNAT连接数监控是保障稳定性的关键。规格选型和计费模式的选择则需要结合实际业务量进行权衡。掌握以上内容,即可从容应对各类VPC公网访问的配置与运维需求。
常见问题与解答
问1:一个VPC可以创建多个公网NAT网关吗?
不可以。每个VPC只能创建一个公网NAT网关。如果需要更高性能,可以选择更大规格的NAT网关,而不是创建多个。
问2:创建NAT网关后,子网内的云服务器立即就能访问公网吗?
不一定。创建NAT网关后还需要添加SNAT规则,并将规则关联到具体的子网或网段。只有添加了SNAT规则的子网内的云服务器才能通过NAT网关访问公网。
问3:NAT网关创建后可以更换VPC吗?
不可以。公网NAT网关的VPC和子网仅在创建时可以选择,创建后不支持修改。如果选错了VPC,需要删除后重新创建。
问4:SNAT规则和DNAT规则可以使用同一个EIP吗?
可以。同一个NAT网关下的多条SNAT规则可以共享一个弹性公网IP,SNAT和DNAT规则也可以共用同一个EIP。但需要注意的是,如果共用EIP,该EIP既要承载出方向流量又要承载入方向流量,需要评估带宽是否充足。
问5:为什么配置了NAT网关后,云服务器仍然无法访问公网?
最常见的原因是路由表配置问题。请检查VPC中与子网关联的路由表是否包含指向NAT网关的路由。此外,还需要检查安全组的出方向规则是否放行了公网访问。
问6:NAT网关的规格会影响哪些性能指标?
NAT网关的规格主要影响SNAT最大连接数和SNAT每秒新建连接数,但不会影响DNAT的性能。数据吞吐量则由绑定的弹性公网IP的带宽决定。如果出现丢包或连接失败,可以检查云监控中的SNAT连接数是否超过了规格上限。



