VPC Peering:地址冲突、双向路由与互联边界
验证:未记录
- 适用版本
- 未记录
- 验证范围
- 尚未登记验证记录。
VPC Peering(VPC 对等连接)在两个 VPC 间提供私有 IP 路径。连接 active 只表示连接已建立,不表示路由、安全规则和 DNS 已经配置。
1. 建立前先检查什么#
| 检查 | 设计决策 |
|---|---|
| 两端全部 CIDR(无类别域间路由地址块) | 任意 IPv4 地址块重叠都不能建立 Peering;只想使用其中不重叠的子网也不行 |
| 账号、区域与所有者 | 支持跨账号、跨区域;接收方同意连接,两边分别管理自己的路由与权限 |
| 通信矩阵 | 写清源子网、目标服务、端口与发起方向;不要默认整个 VPC 任意互通 |
| 回程路由 | 必须覆盖实际源地址;仅配置请求方向会超时 |
| DNS(Domain Name System,域名系统) | 地址可达与名字可解析分开验证 |
| 规模与治理 | VPC 数量增加后,逐对维护连接和路由的成本快速增长 |
例如 A=10.64.0.0/18,B=10.64.80.0/20 可以互联;B 若为 10.64.32.0/20,虽然 B 只用一小部分地址,仍与 A 重叠。多 CIDR VPC 必须检查 primary 和所有 secondary。Peering 规则
2. 一条真实请求如何走#
A 的应用子网 10.64.0.0/21 访问 B 的服务子网 10.64.80.0/24,服务端口为 TCP 443:
| 位置 | 必要配置 |
|---|---|
| Peering | A 请求、B 接受,状态 active |
| A 应用子网实际使用的路由表 | 10.64.80.0/24 → pcx-ab |
| B 服务子网实际使用的路由表 | 10.64.0.0/21 → pcx-ab |
| A 的 SG(Security Group,安全组) | 允许到 B 服务 TCP 443 的出站 |
| B 的 SG | 允许来自 A 应用的 TCP 443 入站 |
| 两端 NACL(网络访问控制列表) | 若有限制,放行服务端口及客户端临时端口的往返流量 |
Peering 不做 NAT(Network Address Translation,地址转换),B 看到 A 的原始私网源 IP。安全组有状态,允许建立的连接回包不需要反向新增一条入站规则;但B 主动调用 A 是新的连接,需要另行授权。路由是选择路径,不能代替端口与身份授权。
同区域 Peering 可按支持规则引用对端 SG;跨区域不能照搬这种引用,应按目标架构使用明确 CIDR 等规则。不要把“已引用对端 SG”理解为自动继承对端 SG 中的所有规则。
3. Peering 不提供中转或共享出口#
A ← Peering → B ← Peering → CA 不会因此到达 C;B 不能成为隐式中转路由器。A 也不能通过 Peering 借用 B 的 IGW(互联网网关)、NAT Gateway 或 S3 Gateway Endpoint 上网/访问 S3。不支持的拓扑
| 需求 | 通常考虑 |
|---|---|
| 少量 VPC 直接互通 | Peering;每条连接都维护双向路由 |
| 多 VPC 中心互联、分段与集中出口 | Transit Gateway,显式设计 attachment、路由域和回程 |
| 只向其他团队提供一个服务 | PrivateLink,暴露服务入口,避免建立整个网络的互通关系 |
| 已存在重叠地址 | 长期重新编址;或按服务使用 PrivateLink,复杂场景专门设计 NAT 与互联 |
TGW 不会自动解决重叠地址,PrivateLink 也不是任意 IP 双向互通。集中 NAT 出口涉及出口 VPC 和 TGW 的多张路由表,不能把 Peering 默认路由改成 0.0.0.0/0 来替代。
4. DNS 与跨账号细节#
Peering DNS resolution 选项用于让对端 EC2 公共 DNS 主机名按规则解析为私有 IP,不会自动共享所有私有域名。Route 53 Private Hosted Zone(私有托管区)还需相应 VPC 关联,或通过 Resolver 端点/规则实现所需解析;跨账号关联需要授权。两端 VPC DNS 属性也要符合要求。Peering DNS 配置
跨账号分别管理 requester/accepter 以及两端 routes,Terraform 使用各自短期身份与 provider alias。避免双方同时管理同一连接配置;新增 CIDR 后重新审查两端路由与访问范围,不能假定旧路由自动包含扩展地址。
5. Hands-on:审核一条既有 Peering#
前置:批准的测试源主机、服务域名/私网 IP、端口、两个账号的只读身份;不要向陌生地址探测。下面在每端对应账号/区域分别执行,变量替换为实际值:
export AWS_REGION='us-east-1'
export VPC_ID='REPLACE_THIS_SIDE_VPC'
export PCX_ID='REPLACE_PEERING_ID'
aws sts get-caller-identity
aws ec2 describe-vpcs --vpc-ids "$VPC_ID" --query 'Vpcs[].{Vpc:VpcId,CIDRs:CidrBlockAssociationSet,DhcpOptions:DhcpOptionsId}'
aws ec2 describe-vpc-peering-connections --vpc-peering-connection-ids "$PCX_ID"
aws ec2 describe-route-tables --filters "Name=vpc-id,Values=$VPC_ID" --query 'RouteTables[].{Table:RouteTableId,Associations:Associations,Routes:Routes}'上面的 DhcpOptionsId 只是 DHCP(动态主机配置协议)选项关联,不能证明 DNS 开关已开启;分别检查:
aws ec2 describe-vpc-attribute --vpc-id "$VPC_ID" --attribute enableDnsSupport
aws ec2 describe-vpc-attribute --vpc-id "$VPC_ID" --attribute enableDnsHostnames
# 在批准的 A 侧应用主机上运行;域名必须有有效 TLS 证书。
# FQDN:Fully Qualified Domain Name,完整域名。
export SERVICE_HOST='REPLACE_APPROVED_SERVICE_FQDN'
export SERVICE_IP='REPLACE_PEER_PRIVATE_IP'
getent ahostsv4 "$SERVICE_HOST"
curl --connect-timeout 5 --max-time 15 --resolve "${SERVICE_HOST}:443:${SERVICE_IP}" "https://${SERVICE_HOST}/health"
curl --connect-timeout 5 --max-time 15 "https://${SERVICE_HOST}/health"--resolve 保留 TLS(传输层安全)主机名验证并单独测试指定 IP 路径;前者成功、后者失败时优先调查 DNS。使用企业 CA(证书颁发机构)时加入可信 CA 文件,不使用 -k。
验收记录包括:两端全部 CIDR 无冲突、正确的子网路由关联、双向路径、合法业务请求成功、批准的未授权测试源请求被拒绝。只测 ping 不能验证 HTTPS 服务。超时时按路由 → SG/NACL → 服务监听排查;VPC Flow Logs(流日志)可提供 accept/reject 线索,但不能替代完整路径分析。
变更与恢复:先保存路由、SG 与 DNS 配置,逐条发布最小变更;失败只回退本次新增项。删除连接前排查依赖并清理两端指向它的路由,避免留下 blackhole;不要清空整张共享路由表。