亚马逊AWS官方博客
使用安全组和 NACL 动态管控私有子网互联网访问
![]() |
安全是企业业务创新和可持续发展的关键保障。AWS 提供了强大的 VPC 相关组件及安全服务,可以帮助客户实现主机级、网络级和应用级边界的精细化保护。最近笔者客户希望用较小的成本,对私有子网内资源的互联网访问进行动态管控。未授权的资源(如 EC2 实例)禁止访问互联网,只允许指定的资源(如特定 IP 的 EC2 实例)访问互联网,且有临时调整允许/禁止互联网访问的需求。
采用 NFW 和 NAT 网关来管理和控制出站流量是标准方案,它可以实现对域名/URL、IP 地址和内容过滤的精细化控制,其部署形态可参考出站流量检查分布式部署模型 ,适合较大业务规模的应用场景。本文介绍了通过仅变更 SG,NACL 动态调整私有子网中资源(如特定 IP 的 EC2 实例)允许/禁止互联网访问的轻量级解决方案。
架构说明
图 1 展示了 VPC 的网络架构示意图,VPC 跨越了两个可用区,每个可用区两个子网,分别为公有子网(Public subnet)、私有子网(Private subnet)。公有子网中包含了可以从互联网访问的资源,如 EC2 实例和 NAT 网关。私有子网中包含了无法从互联网访问的资源,Private subnet 1、Private subnet 2 中的资源可以使用 NATGW 访问互联网。
![]() |
图 1 网络架构图
Private subnet 1 的路由表为:
目标位置 | 目标 |
10.11.0.0/16 | Local |
0.0.0.0/0 | NATGW |
EC2 1 和 EC2 2 关联的安全组为 Allow-Internet-SG。
安全组入站规则:
来源 | 协议 | 端口范围 | 描述 |
10.11.0.0/16 | HTTPS | 443 | 允许来自 10.11.0.0/16:443 的入站流量 |
10.11.0.0/16 | SSH | 22 | 允许来自 10.11.0.0/16:22 的入站流量 |
安全组出站规则:
目标位置 | 协议 | 端口范围 | 描述 |
0.0.0.0/0 | All | All | 允许所有的出站 IPv4 流量。 |
当前 EC2 1 和 EC2 2 关联的安全组为 Allow-Internet-SG,出站规则为所有 IPv4(0.0.0.0/0)流量请求允许出站。EC2 实例发出所有非本地 IP 请求时,安全组出站规则允许出站,并路由至 NATGW,进而通过 Internet gateway 访问互联网。
安全组采用”默认全部拒绝、只能添加允许规则”的白名单机制,在配置出站规则时需要指定具体的目标 IP 或 CIDR 范围。基于此我们可以配置允许出站 CIDR 范围。我们新建安全组并命名为 No-Internet-SG,将安全组规则目标位置配置本地 VPC 网段,即私有子网内的资源到本地网段的请求允许出站。由于互联网目标位置访问不在 VPC 本地网段内,到互联网的访问被禁止出站。
安全组出站规则:
目标位置 | 协议 | 端口范围 | 描述 |
10.11.0.0/16 | All | All | 允许 10.11.0.0/16 的 IPv4 流量出站 |
*当 EC2 需要访问互联网上的各类服务(如 Docker Hub、GitHub)时,这些服务的 IP 地址通常是动态变化的,且可能分布在不同的 CDN 节点上。因此,仅通过在安全组中配置固定 IP 来精细化控制出站访问是不可行的。
自此,通过创建两个安全组,一个为默认的 Allow-Internet-SG 安全组允许所有 IPv4 流量出站,一个为 No-Internet-SG 安全组允许 10.11.0.0/16 的 IPv4 流量出站,针对私有子网中资源(如特定 IP 的 EC2 实例)关联不同的安全组即可实现访问/禁止访问互联网的动态调整需求。
同时,我们可以使用 NACL 在子网级别设定控制层,实现严格的网络隔离以增强安全性,可参考[1]。以 Private subnet 2 为例,新建的 NACL 如下:
NACL 的入站规则:
规则 # | 类型 | 协议 | 端口范围 | 源 | 允许/拒绝 |
100 | 所有 IPv4 流量 | 全部 | 全部 | 10.11.0.0/16 | 允许 |
200 | 所有 IPv4 流量 | 全部 | 全部 | 0.0.0.0/0 | DENY |
* | 所有 IPv4 流量 | 全部 | 全部 | 0.0.0.0/0 | DENY |
NACL 的出站规则:
规则 # | 类型 | 协议 | 端口范围 | 目的地 | 允许/拒绝 |
100 | 所有 IPv4 流量 | 全部 | 全部 | 10.11.0.0/16 | 允许 |
200 | 所有 IPv4 流量 | 全部 | 全部 | 0.0.0.0/0 | DENY |
* | 所有 IPv4 流量 | 全部 | 全部 | 0.0.0.0/0 | DENY |
以上 NACL 关联的私有子网内的所有资源允许与 10.11.0.0/16 网段的入站和出站通信请求,同时拒绝包括互联网访问的所有其他网络地址的通信请求。
实施与测试
我们按照上一节提及的 VPC 的网络架构图 1,准备测试环境如下:
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
安全组访问控制:
1. 测试 Allow-Internet-SG 安全组允许互联网访问
在私有子网 Private Subnet 1 中的 EC2 环境中通过 ping 访问互联网,验证互联网访问可达
![]() |
2. 新建禁止出站 No-Internet-SG 安全组
![]() |
3. 将 No-Internet-SG 安全组应用到 EC2 实例
![]() |
4. 测试 No-Internet-SG 安全组禁止互联网访问
在私有子网 Private Subnet 1 中的 EC2 环境中通过 ping 访问互联网,验证互联网访问不可达
![]() |
NACL 访问控制:
1. 测试默认 NACL 允许互联网访问
在私有子网 Private Subnet 2 中的 EC2 环境中通过 ping 访问互联网,验证互联网访问可达
![]() |
2. 新建禁止出站的 Private-Subnet-NAT-Control NACL
![]() |
![]() |
3. 将 Private-Subnet-NAT-Control NACL 与 Private Subnet 2 子网关联
![]() |
4. 测试 Private-Subnet-NAT-Control NACL 禁止互联网访问
在 Private Subnet 2 私有子网中的 EC2 环境中通过 ping 访问互联网,验证互联网访问不可达
![]() |
另外,AWS 于 2024 年 11 月推出增强的 Amazon VPC 阻止公共访问功能。该功能通过集中式声明性控制来管理 VPC 的互联网流量,支持双向和仅入站两种阻止模式,可以在组织、账户或 VPC 多个层级实施安全策略,并支持针对 VPC、subnet 创建特定例外。适用于需要集中管理多个 AWS 账户并实施严格网络访问控制的大型企业或安全敏感型组织,可参考[2]。
总结
在这篇文章中,我们向您介绍了一种通过配置安全组(SG)和网络访问控制列表(NACL)来动态管控 AWS VPC 私有子网互联网访问的轻量级解决方案。通过设置允许全部出站流量的 Allow-Internet-SG 和仅允许 VPC 内部流量的 No-Internet-SG 两种安全组,结合 NACL 的子网级别控制,可以实现对特定 EC2 实例互联网访问权限的灵活管理。
参考文档
[1] https://docs.aws.amazon.com/vpc/latest/userguide/vpc-network-acls.html
[2] https://aws.amazon.com/blogs/networking-and-content-delivery/vpc-block-public-access/