2. VPC网络基础回顾

在讨论 VPC Endpoint 之前,必须先把 VPC 内部“数据包从哪来、往哪走、被谁放行”这条链路重新梳理清楚。VPC Endpoint 并不是一个独立于 VPC 网络之外的魔法开关,它本质上是在子网中创建的一块弹性网卡(ENI),拥有自己的私有 IP 地址,并依附于所在子网的路由表、安全组和网络 ACL 规则。因此,如果对 VPC 基础组件的职责边界认识模糊,后续排查“Endpoint 建好了却访问不通”这类问题时就会无从下手。

一、VPC:私网接入的边界与地址空间

VPC(Virtual Private Cloud)是一个逻辑隔离的虚拟网络,它定义了整张网络的地址范围。创建 VPC 时必须指定 IPv4 CIDR 块,例如 10.0.0.0/16,这个范围决定了后续所有子网、ENI、Endpoint 的地址都只能从中切分。VPC 层面还承载着几个关键属性:DNS 解析开关(enableDnsSupport 与 enableDnsHostnames)、DHCP 选项集、以及是否启用 IPv6。对于私网接入而言,DNS 解析尤其重要——因为 Interface 类型 Endpoint 依赖 Route 53 Resolver 将服务域名解析为 Endpoint 的私有 IP,如果 VPC 的 DNS 解析被关闭,域名就无法正确指向 Endpoint。

可以把 VPC 理解为“一栋大楼的总体用地范围”,它本身不决定某个房间怎么走,但决定了所有房间的坐标必须落在这个范围内。

二、子网:Endpoint 落地的物理位置

子网(Subnet)是从 VPC CIDR 中切分出的一段地址范围,并且绑定在某个具体可用区(AZ)上。例如在 10.0.0.0/16 中切出 10.0.1.0/24 放在 ap-southeast-1a,切出 10.0.2.0/24 放在 ap-southeast-1b。子网分为公有子网和私有子网,判断标准不是名字,而是它的路由表中是否存在指向 Internet Gateway 的 0.0.0.0/0 路由。

创建 Interface 类型 VPC Endpoint 时,必须明确选择“在哪些子网中创建 ENI”。这一步直接决定了 Endpoint 的可用性和高可用性:如果只在一个子网创建,那么该 AZ 故障时私网访问就会中断;生产环境通常会在多个 AZ 的子网中各创建一个 Endpoint ENI,让不同 AZ 的资源就近访问。此外,子网的可用 IP 数量也需要注意,每个 Endpoint ENI 会占用一个子网 IP。

三、路由表:决定“往哪走”

路由表(Route Table)是子网级别的转发决策依据,它由一条条路由条目组成,每条条目包含目标网段(Destination)和目标(Target)。私网接入中涉及两类完全不同的路由逻辑:

  • Gateway 类型 Endpoint(如 S3、DynamoDB):需要在子网关联的路由表中添加一条“前缀列表(Prefix List)”路由,目标为 vpce-xxxx 网关端点。例如目标 pl-63a5400a(S3 的托管前缀列表),下一跳为 vpce-0abc123。这条路由让原本要走向 NAT 或 IGW 的 S3 流量改为走 Endpoint。
  • Interface 类型 Endpoint:不需要手动加路由,因为 Endpoint ENI 就在子网内,访问其私有 IP 属于同子网或同 VPC 内通信,走的是 VPC 本地路由(local route)。真正起作用的是 DNS 解析把域名指向了 ENI 的私有 IP。

这里有一个常见误区:以为 Interface Endpoint 也要加路由。实际上它依赖的是 DNS 和本地路由,而不是自定义路由条目。理解这一点,就能解释为什么“路由表里看不到 Endpoint 条目,但访问却成功了”。

四、安全组与网络 ACL:两道不同层级的门

安全组(Security Group)作用于 ENI 级别,是有状态的(stateful):如果入站规则放行了某个请求,那么对应的出站响应会自动被允许,无需再写反向规则。对于 Interface Endpoint,需要关注的是 Endpoint ENI 自身的安全组——它必须放行来自客户端资源的入站流量(通常是 443 端口)。同时,客户端实例所在的安全组也要允许向 Endpoint 发起出站连接。很多“访问不通”的案例,问题就出在只改了客户端安全组,却忘了 Endpoint ENI 的安全组没有放行入站。

网络 ACL(Network ACL)作用于子网级别,是无状态的(stateless):入站和出站规则必须分别显式配置,且规则按编号从小到大依次匹配,一旦命中就停止。默认 ACL 允许所有流量,但自定义 ACL 常常只放行了部分端口,导致返回流量被丢弃。排查时如果发现“请求发出去了但没有响应”,就要检查子网 ACL 的出站临时端口范围(通常为 1024-65535)是否放行。

记忆要点:安全组管“谁能连我”,网络 ACL 管“这个子网能进出什么”;安全组有状态、ACL 无状态;安全组在 ENI 上,ACL 在子网上。

五、各组件在私网接入中的交互关系

把上述组件串起来看,一次从 EC2 实例访问 S3 的私网请求大致经历如下判断:数据包从实例的 ENI 发出,先经过实例安全组的出站规则;随后进入子网,经过网络 ACL 的出站规则;接着查路由表,若命中 S3 前缀列表路由,则转发到 Gateway Endpoint;若访问的是 Interface Endpoint 服务,则 DNS 已把域名解析为 Endpoint ENI 的私有 IP,数据包走本地路由到达该 ENI,再经过 Endpoint 安全组的入站规则。返回流量则按相反方向,但安全组因为有状态会自动放行,而 ACL 需要显式放行返回端口。

VPC 私网接入中各组件的交互关系 VPC 10.0.0.0/16 子网 A 10.0.1.0/24 (ap-southeast-1a) 网络 ACL(无状态 · 子网级) EC2 客户端 10.0.1.15 安全组 SG-App Endpoint ENI 10.0.1.88 SG-Endpoint 路由表 A 10.0.0.0/16 → local pl-63a5400a (S3) → vpce-gw-xxxx 子网 B 10.0.2.0/24 (ap-southeast-1b) 网络 ACL(无状态 · 子网级) EC2 客户端 10.0.2.20 安全组 SG-App Endpoint ENI 10.0.2.88 SG-Endpoint 路由表 B 10.0.0.0/16 → local pl-63a5400a (S3) → vpce-gw-xxxx Route 53 Resolver 将服务域名解析为 Endpoint ENI 私有 IP 443 443 Gateway Endpoint S3 / DynamoDB(前缀列表路由) Interface Endpoint 多数 AWS 服务(ENI + DNS) 数据流量 DNS 解析 网络 ACL Endpoint ENI + 安全组

六、一个可复用的排查顺序

当私网访问失败时,按下面的顺序逐层检查,可以快速定位问题所在层级:

  1. DNS 层:在客户端执行 nslookup s3.ap-southeast-1.amazonaws.com,确认解析结果是否为 Endpoint 的私有 IP(Interface 类型)或是否命中前缀列表(Gateway 类型)。若解析到公网 IP,说明 VPC 的 DNS 解析未开启或 Endpoint 未启用私有 DNS。
  2. 路由层:检查子网关联的路由表,Gateway Endpoint 是否有前缀列表条目;Interface Endpoint 是否与客户端在同一 VPC 内(本地路由可达)。
  3. 安全组层:确认 Endpoint ENI 的安全组入站放行了 443,客户端安全组出站放行了 443。
  4. 网络 ACL 层:确认子网 ACL 入站和出站都放行了 443 及返回的临时端口范围。

这个顺序遵循“从解析到转发、从状态化到无状态”的逻辑,能避免在错误的层级反复修改规则。掌握 VPC、子网、路由表、安全组、网络 ACL 各自的职责与交互方式,是后续正确创建和排障 VPC Endpoint 的基础。