0Pricing
AWS Solutions Architect · 课时

NAT 网关与私有子网

借助托管 NAT 网关,让私有子网中的资源访问互联网,同时避免被互联网直接访问。

NAT 网关与私有子网 是 CoddyKit 上的免费 AWS Solutions Architect 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 AWS Solutions Architect 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 AWS Solutions Architect 课程共包含 4 节课。

私有 subnet 的互联网访问问题

私有 subnet 中的资源只有私有 IP 地址,且没有通往 Internet Gateway 的 route,因此无法向互联网发起出站连接。但它们通常需要访问互联网,例如下载 OS 补丁、拉取 Docker 镜像、调用第三方 API 或更新软件。解决方案是将私有 subnet 的流量通过一个具有互联网访问能力并执行 NAT(网络地址转换)的设备进行路由,由公有 IP 隐藏私有 IP。AWS 提供两种选项:托管的 NAT Gateway,以及自行管理的NAT Instance(旧方案)。

NAT Gateway:托管式出站 NAT

NAT Gateway 是一项完全托管且高度可用的服务,可让私有 subnet 中的实例发起到互联网的出站连接,同时阻止未经请求的入站流量。它位于公有 subnet 中,拥有一个 Elastic IP,并会自动扩展到最高 100 Gbps 的带宽。您无需修补、扩展或管理底层基础设施。NAT Gateway 会将出站数据包的私有源 IP 转换为自身的 EIP,然后将响应返回给原始私有 IP。

# Create a NAT Gateway in the public subnet
aws ec2 allocate-address --domain vpc  # Get an EIP
aws ec2 create-nat-gateway \
  --subnet-id subnet-public-1a \
  --allocation-id eipalloc-12345678 \
  --tag-specifications 'ResourceType=natgateway,Tags=[{Key=Name,Value=nat-gw-1a}]'

通过 NAT 路由私有子网流量

创建 NAT Gateway 后,请在私有子网的路由表中添加一条路由:目标 0.0.0.0/0 → NAT Gateway ID。这会将私有子网实例发往互联网的所有流量发送到 NAT Gateway,再由 NAT Gateway 通过 Internet Gateway 转发到互联网。路由表中仍会保留用于内部流量的本地 VPC 路由(例如 10.0.0.0/16 → local)。如果没有这条路由,即使已经部署了 NAT Gateway,私有子网实例仍然无法访问互联网。

# Add route in private subnet's route table pointing to NAT gateway
aws ec2 create-route \
  --route-table-id rtb-private-app-1a \
  --destination-cidr-block 0.0.0.0/0 \
  --nat-gateway-id nat-12345678

多 AZ NAT Gateway 架构

NAT Gateway 具有特定 AZ的属性,只处理来自同一 AZ 中子网的流量。为实现高可用,请在每个 AZ 中部署一个 NAT Gateway,并创建特定于 AZ 的私有路由表:AZ-a 中的私有路由表将 0.0.0.0/0 路由到 AZ-a 中的 NAT-GW;AZ-b 中的私有路由表则路由到 AZ-b 中的 NAT-GW。这样可以避免跨 AZ 数据传输费用,并确保 AZ-a 发生故障时,AZ-b 中的实例仍可通过各自的 NAT 访问互联网。

# Architecture: two NAT gateways, two private route tables
# NAT-GW-1a in subnet-public-1a  --> rtb-private-1a
# NAT-GW-1b in subnet-public-1b  --> rtb-private-1b

# Associate private-1a subnets with rtb-private-1a (NAT-GW-1a)
aws ec2 associate-route-table \
  --route-table-id rtb-private-1a \
  --subnet-id subnet-private-app-1a

NAT Gateway 与 NAT Instance

NAT Instance 是运行 NAT AMI 的自行管理 EC2 实例,是 NAT Gateway 出现之前采用的传统方案。使用 NAT Instance 时,您需要:禁用 EC2 实例上的源/目标检查、管理带宽和扩展、修补 OS,以及处理故障。对于带宽需求极低的场景,NAT Instance 的成本更低,也可以用作堡垒主机。对于生产环境,推荐使用 NAT Gateways:它们完全由 AWS 管理,可自动扩展,在单个 AZ 内提供 99.99% 的可用性 SLA,并且无需修补。考试过去经常考查这两者的对比。

# For NAT Instance: disable source/dest check (required!)
aws ec2 modify-instance-attribute \
  --instance-id i-nat-instance-id \
  --no-source-dest-check

NAT Gateway 定价

NAT Gateway 的定价由两部分组成:按每个 NAT Gateway 收取的小时费用(在 us-east-1 中约为每小时 0.045 美元,即每月约 32 美元),以及按 GB 收取的数据处理费用(在 us-east-1 中约为每 GB 0.045 美元)。对于通过 NAT 传输大量数据的工作负载(例如拉取大型容器映像或批量下载),数据处理费用可能占主要部分。您可以通过以下方式优化 NAT 成本:将 S3 和 DynamoDB 流量通过 VPC Gateway Endpoints 路由(完全绕过 NAT,且免费),并通过 VPC Interface Endpoints 路由 AWS API 调用,而不是通过 NAT 路由。

RDS 的私有子网设计

私有子网中的数据库实例不应通过 NAT Gateway 路由,因为它们不需要主动发起连接到互联网。数据库只需接收来自应用层(VPC 内部)的连接,并且可能需要通过 VPC endpoint 访问 S3 等 AWS 服务(用于导出或导入)。对于数据库修补和更新,RDS 是一项托管服务,因此您无需直接应用 OS 修补。对于 EC2 上自行管理的数据库,请使用系统管理器修补管理器;如果已配置 SSM VPC endpoint,它可以在无需访问互联网的情况下通过 SSM 执行修补。

NAT Gateway 与安全性

NAT Gateway 提供有状态、仅出站的 NAT:它允许主动发起的出站连接及其响应,但会阻止所有未经请求的入站流量。它不是防火墙,不会检查或过滤流量内容。若要过滤出站流量(例如只允许私有子网访问特定目标域名或 IP),您需要额外的控制措施:在 VPC 中部署 AWS 网络防火墙,或在 Gateway Load Balancer 后部署第三方防火墙设备。无论是否使用 NAT,安全组和 NACL 都仍适用于私有子网中的实例。

私有 NAT Gateway

除用于访问互联网且带有 EIP 的公有 NAT Gateway 外,AWS 还支持不带 EIP 的私有 NAT Gateway。私有 NAT Gateway 用于转换私有 IP 地址,以便处理 VPC 之间,或 VPC 与本地网络之间的流量,尤其适用于 CIDR 范围重叠的情况。例如,如果 VPC-A(10.0.0.0/16)需要与同样使用 10.0.0.0/16 的本地网络通信,VPC-A 中的私有 NAT Gateway 会先将源 IP 转换为不重叠的范围,然后再通过 Transit Gateway 路由到本地网络。

监控 NAT Gateway 指标

您可以通过 CloudWatch 指标监控 NAT Gateway 的运行状况和性能。关键指标包括:ActiveConnectionCount(当前通过 NAT 的活动 TCP 连接数)、BytesInFromDestination / BytesInFromSource(两个方向的数据传输量)、PacketDropCount(丢弃的数据包数量,表示可能存在带宽限制或错误),以及 ErrorPortAllocation(NAT 已耗尽端口分配,可能表示连接过多导致端口耗尽)。每个 NAT Gateway 对每个唯一目标最多支持 55,000 个同时连接;超过此数量后,连接可能会被丢弃。

# Get NAT Gateway active connection count
aws cloudwatch get-metric-statistics \
  --namespace AWS/NATGateway \
  --metric-name ActiveConnectionCount \
  --dimensions Name=NatGatewayId,Value=nat-12345678 \
  --start-time 2024-01-01T00:00:00Z \
  --end-time 2024-01-01T01:00:00Z \
  --period 300 --statistics Maximum

私有子网无需 NAT 的情况

并非所有私有子网工作负载都需要 NAT Gateway。请考虑访问模式:如果实例只需与其他 VPC 资源以及可通过 VPC endpoint 访问的 AWS 服务(S3、DynamoDB、SSM、ECR、Secrets Manager)通信,您可以完全移除 NAT Gateway,从而每个 AZ 每月节省约 32 美元以及数据处理费用。对于使用 VPC Interface Endpoints 访问所有 AWS 服务的完全私有微服务,这是理想模式。请评估实例调用的每项服务,并检查是否可以使用免费的 Gateway Endpoint 或付费的 Interface Endpoint 来替代 NAT。

快速检查

请测试您对本课 AWS Solutions Architect(SAA-C03)概念的理解。

课程回顾

本课介绍了:NAT Gateways 通过将私有子网实例的私有 IP 转换为 Elastic IP,使其能够访问出站互联网;您必须在私有子网路由表中添加指向 NAT Gateway 的 0.0.0.0/0 路由;以及每个 AZ 部署一个 NAT Gateway,可以实现高可用性并避免跨 AZ 数据费用。接下来,我们将比较 Network ACL 和 Security Group,了解分层 VPC 防护。

常见问题解答

「NAT 网关与私有子网」课时是免费的吗?

是的 — 「NAT 网关与私有子网」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 AWS Solutions Architect 课程的其余内容,请升级到 CoddyKit PRO。 AWS Solutions Architect 课程共包含 4 节课。

「NAT 网关与私有子网」这节课中我会学到什么?

借助托管 NAT 网关,让私有子网中的资源访问互联网,同时避免被互联网直接访问。 你通过在浏览器中直接运行的动手代码来练习 AWS Solutions Architect,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 AWS Solutions Architect 需要有经验吗?

无需任何先前经验。CoddyKit 上的 AWS Solutions Architect 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「NAT 网关与私有子网」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 AWS Solutions Architect 课中编写并运行代码吗?

能。每节 AWS Solutions Architect 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. VPC 架构与 CIDR 块
  2. 互联网网关与路由表
  3. NAT 网关与私有子网
  4. 网络 ACL 与安全组
← 返回 AWS Solutions Architect