亚马逊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/

本篇作者

李伟

亚马逊云科技解决方案架构师,负责基于亚马逊云科技的云计算方案架构的咨询和设计。有丰富的移动互联网、大型平台类应用系统研发和架构设计实践经验,目前主要致力于 DevOps、安全、容器技术领域的研究和推广。