AWS VPC in Action

VPC 是什么

AWS VPC(Virtual Private Cloud)是一种虚拟的网络服务,它可以让用户在 AWS 云上建立自己的私有网络,提供安全、扩展性和自定义的网络控制。
AWS VPC 可以让用户在一个私有且隔离的区域内构建和运行 AWS 云中的资源,如 Amazon EC2 实例、数据库实例以及其他服务资源。用户可以自定义 VPC 的 IP 地址范围、子网、路由表、网络网关等,以达到更好的网络控制和安全性。

CIDR

CIDR(Classless Inter-Domain Routing 无类域间路由)是一种 IP 地址的编址方法,它将一个IP地址看做由两部分组成: 网络地址和子网掩码。IPv4中,CIDR 编址方法用于取代了分类编址方法(A、B、C类地址),分类编制方法指按照约定 IP 地址中固定位数的方式来编址,如下:

分类前缀码最大地址
A0127(0b01111111).255.255.255
B10191(0b10111111).255.255.255
C110223(0b11011111).255.255.255

CIDR 采用“前缀长度”表示法,用一个斜线(/)后面跟着一个数字来表示,用于指定了网络地址中的子网位(或者叫做网络前缀位)的数量。例如,用 CIDR 表示 192.168.1.0 和子网掩码 255.255.255.0 的网络,可以简写为:192.168.1.0/24,它表示网段为 192.168.1.0 ~ 192.168.1.255

AWS 关于 Subnets CIDR 的约定

对于某个子网的 CIDR,AWS 有如下约定(假如 CIDR 是 10.0.0.0/24):

  • 10.0.0.0:网络地址
  • 10.0.0.1:VPC Router 的保留地址
  • 10.0.0.2:AWS DNS Server 保留地址
  • 10.0.0.3:AWS 应对可能未来被占用的保留地址
  • 10.0.0.255:网络广播地址(虽然 AWS VPC 不支持网络广播,但是还是保留了该地址)

虽然 CIDR 也可以表示 IPv6 地址,但如果不特殊说明,我们这里统一指 IPv4 地址。

Subnet

通常一个合法的 CIDR 对应一个子网单元,AWS 要求每个子网不可跨可用区(Availability Zone)。AWS 中,一个可用区在逻辑上代表一个独立的机房,而地区(Region)和可用区没有直接的关系,通常一个地区会包含一个或多个可用区。
同时,AWS 要求 VPC 中的每个子网的 CIDR 不可重叠,且不可超越 VPC 本身的 CIDR 的范围
子网按照是否被分配 Internet Gateway 或 NAT Gateway 可被分为公有子网私有子网

Route Tables

AWS 的路由表负责声明子网中,网络路由的解析规则。
每个子网有且只能和一张路由表绑定,如果子网没有显式地与任何路由表绑定,则会隐式地与 VPC 中默认的路由表绑定。
某些组件会拥有自己的路由表,如 Internet Gateway,Transit Gateway 等,这种情况下,路由表所关联的对象不再是子网,而是这些组件,AWS 在解析路由时,只会针对经过这些组件的流量进行解析。
在路由表中声明解析规则时,Target 除了可以写 CIDR 之外,还可以直接引用 AWS VPC 中的组件 id,通过这些 id 前缀的语义就可以区分该组件是什么组件,比如:

  • igw-xxx:Internet Gateway
  • vpce-xxx:VPC Endpoint
  • nat-xxx:NAT Gateway
  • local:VPC CIDR 的别名

Gateway

Internet Gateway

互联网网关是一个水平扩展、冗余且高度可用的 VPC 组件,它允许您的 VPC 与 Internet 之间进行通信。 它支持 IPv4 和 IPv6 流量。 它不会对您的网络流量造成可用性风险或带宽限制。
VPC 的流量方向从互联网网关的角度说是可进可出(Inbound and Outbound)

NAT Gateway

NAT 网关是一种网络地址转换 (NAT) 服务。 您可以使用 NAT 网关,以便私有子网中的实例可以连接到 VPC 外部的服务,但外部服务无法启动与这些实例的连接。
VPC 的流量方向从 NAT 网关的角度说是可出不可进(Outbound Only)。

其他网关

除了上面两种,AWS 还提供其他网关以支持更多元化的网络通信场景,如 Transit Gateway, Egress-only Internet Gateway 等等,但这些网关都是针对某个具体的场景而设计的,最常用的还是上面两种网关。

Network

Elastic Network Interface(ENI)

VPC 中的每个网络单元都对应一个弹性网络接口,ENI 在逻辑上可以将它理解为一张虚拟网卡,因此,所有与网络相关的概念,实际上都与这种虚拟网卡直接关联而非 AWS 服务(如 EC2)。
同时,ENI 是独立于 AWS 服务而存在的,这也是弹性二字的含义,对于任何 AWS 服务,ENI 都可以动态地插拔(绑定两个以上的 ENI 设备时),但每个服务至少要求绑定一个 ENI 设备。

Elastic IPs(EIP)

弹性 IP 地址是为动态云计算设计的静态 IPv4 地址。 一个弹性 IP 地址分配给某个 AWS 账户,在释放之前,该账户始终拥有该 IP 地址,但释放之后不一定能重新分配到相同的 IP 地址。
一些要求与互联网有交互的服务在未绑定 EIP 之前,AWS 会自动为其分配一个公网 IP,当绑定 EIP 时,绑定的 EIP 会取代自动分配的公网 IP 地址。

Endpoint

Endpoint 可以翻译为端点,在 VPC 场景下,有时候也被称作 AWS PrivateLink,是一种可以通过私有 IP 直接访问跨账户、跨网络资源的服务,工作原理如下图:

how vpc private link works


Endpoint 除了可以用于访问 VPC 之外的服务,也可以像 VPC 外部提供服务,这时被称作 Endpoint Service。
当无论是哪种使用方式,Endpoint 均代表一个 ENI 实体,该实体拥有自己的私有 IP,必要时还可以绑定公有弹性 IP 使其可以访问互联网。

Security

Security Group

安全组在逻辑上可以理解为针对 ENI 设备而实现的分布式无状态、基于 4 层网络模型的防火墙。
同时,安全组是根据 VPC 隔离的,这意味着绑定安全组的 ENI 设备需要处于同一个 VPC 内。
安全组在流量控制方向上是可进可出(Inbount and Outbound)

Network ACLs

Network ACLs 是基于 VPC 子网级别的防火墙,它也是无状态基于 4 层网络模型的,除此之外,和安全组没有任何区别。
Network ACLs 在流量控制方向上是可进可出(Inbound and Outbound)

Network Firewall

Network Firewall 是 AWS 提供的配套最为完整的防火墙解决方案,是基于 VPC 级别的,它可同时支持有状态无状态的过滤规则,所支持任何层级的网络模型
Network Firewall 在流量控制方向上是可进可出(Inbound and Outbound)

Web ACLs

Web ACLs 和 VPC 无关,它本身是 AWS 服务的一种,通常与 AWS Load Balancer 和 AWS CloudFront 配合使用,它有时也被称作 AWS WAF。它是一种 Web 应用程序防火墙,可让您监控转发到受保护 Web 应用程序资源的 HTTP(S) 请求,过滤规则是基于7 层网络模型的。
Web ACLS 在流量控制方向上是只进不出(Inbound Only)

DNS Firewall

DNS Firewall 与 AWS Route 53 相关的 DNS 防火墙解决方案。使用 DNS 防火墙,可以在与 VPC 关联的规则组中定义域名过滤规则,可以指定要允许或阻止的域名列表,并且可以自定义对阻止的 DNS 的查询响应。
DNS Firewall 在流量控制方向上是可进可出(Inbound and Outbound)

最佳实践

这里分享一些关于之前构建 dev 环境时,调查 VPC 相关问题的实际案例的思路和方向(仅列举一部分可能性)。 ECS Fargate 集群访问 ECR 公网端点超时

  • Fargate 集群启动的 task 所在的子网为私有子网,且未正确配置 NAT 网关或 Intenet 网关
  • NAT 网关未绑定公网 IP
  • NAT 网关所在子网的安全组 Inbound 规则未正确配置
  • Fargate 集群启动的 task 所在的子网的安全组 Outbound 规则未正确配置

ECS Fargate 集群访问 ECR 私网端点 DNS 解析失败

  • Fargate 集群启动的 task 所在的子网中不存在访问 ECR 服务的 endpoint
  • 指向 ECR 服务 endpoint 的路由表规则未正确配置
  • Fargate 集群启动的 task 所在的子网的安全组 Outbound 规则未正确配置

ECS Fargate 集群启动正常,ALB health check 却显示失败

  • ALB 所在的子网的安全组 Outbound 规则未正确配置
  • Fargate 集群启动的 task 所在的子网的安全组 Inbound 规则未正确配置
  • ALB health check listener 未正确配置,如路由、端口

Bridge EC2 在启用适配无状态规则的 Network Firewall 后,ssh tunnel 存在偶然性断开问题

  • 只添加了单条 InBound 或 OutBound 无状态规则
  • EC2 Bridge 的 sshd 配置设置了最大会话时长

配置 NAT 网关后,VPC 内的服务无法访问公网

  • NAT 网关未绑定公网 IP
  • 路由表未正确配置

课后作业

这里留两个课后作业,以达到抛砖引玉的目的:

  • 假如客户需要以 VPN 的方式连接运行在 VPC 私有子网内的服务,请问网络配置的大概思路是怎样的?
  • 如果两个不同 VPC 内的私有子网需要进行通信,请问完成通信所涉及的 VPC 概念会有哪些?

Reference