us-east-1
我在(VPC1
和)中有 2 个 VPC,VPC2
并且是 VPC 对等的。我运行 openVPN 来VPC1
连接到这两个 vpc。现在我必须在ap-southeast-1
(VPC3
和VPC4
) 中再次创建 2 个新的 VPC,这两个 VPC 都是 VPC 配对。我遵循了此教程us-east-1
在和之间建立连接ap-southeast-1
(已连接VPC1
和VPC3
)。我现在能够连接到 中的所有实例VPC1
,VPC2
和VPC3
但无法连接到VPC4
。我只能VPC4
从 中的实例内部连接到 中的实例。我在 VPC1 中VPC3
有两个实例(和)。用于从我的办公室连接,并连接到中运行的第 3 个实例。我已经验证了中的路由表,它看起来不错。openvpn
ovpn1
ovpn2
ovpn1
ovpn2
openvpn
VPC3
VPC4
us-east-1
这是我在 ovpn 实例上的路由表VPC1
。
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default 10.0.0.1 0.0.0.0 UG 0 0 0 eth0
10.0.0.0 * 255.255.240.0 U 0 0 0 eth0
10.2.0.0 169.254.255.2 255.255.0.0 UG 0 0 0 tun0
10.3.0.0 169.254.255.2 255.255.255.0 UG 0 0 0 tun0
169.254.255.2 * 255.255.255.255 UH 0 0 0 tun0
VPC CIDR 块如下
VPC1 -> 10.0.0.0/16
VPC2 -> 10.2.0.0/16
VPC3 -> 10.3.0.0/24
VPC4 -> 10.1.0.0/16
我缺少什么来连接VPC4
答案1
对等连接不支持跨 VPC 传输路由 IP 流量。
对等连接无法为您提供您所熟悉的 VPN 或其他网络到网络互连所具有的同等级别的连接性。
考虑一下文档中的这个例子(为了清楚起见,进行了轻微的重新格式化),诚然,它并不能准确描述您的情况,但有助于理解当前的更大问题。
pcx-aaaabbbb
您在 VPC A 和 VPC B 之间 ( ) 以及 VPC A 和 VPC C 之间 ( )建立了 VPC 对等连接pcx-aaaacccc
。VPC B 和 VPC C 之间存在 VPC 对等连接。
您不能通过 VPC A 直接将数据包从 VPC B 路由到 VPC C。
这是 VPC 对等设计的一部分——它是一项仅影响实例在两个 VPC 中 - 它们可以互相访问。VPC 中的其他资源(例如 NAT 和 Internet 网关、VPC 服务端点(用于 S3)、Direct Connect 和硬件 VPN)不会通过对等连接公开。
总结:VPC 对等连接不支持直接对等 VPC 中的 EC2 实例之外的任何 IP 路由或连接。
因此,上述内容并不是一个完美的解释,因为在记录的示例中,所有三个 VPC 当然都位于同一区域,但类似的原则也适用于您的配置。
问题不在于 VPC-1 无法通过到 VPC-3 的隧道到达 VPC-4(流量可能到达,也可能不到达),而在于 VPC-4 根本无法发送回复。VPC-4 无法在到达 VPC-3 外部(VPC-1)的途中经过 VPC-3。
同样,这也是我提出有关 VPC-2 和 VPC-3 之间连通性问题的动机。VPC-2 无法在访问 VPC-3 中的地址时中转 VPC-1。
由于没有跨 VPC 传输的机制,因此发往远程网络的传入流量永远不会到达隧道服务器,而到隧道服务器的流量(尽管可能没有明确记录)仍然属于传输的情况。
如果您在 VPC-1 和外部公司数据中心之间有 VPC 硬件 VPN,您也会遇到同样的问题。无论是否存在对等连接,该 VPN 连接都不会提供从外部数据中心到 VPC-1 边界之外的任何内容的访问。AWS Direct Connect 也是如此。
仅从 API/控制台界面的角度分析这一点,考虑如何通过对等连接发送流量:通过创建使用对等连接 ID 作为目标的路由表条目,创建将外部 IP 前缀从一个 VPC 发送到另一个 VPC 的路由。
但是当流量到达对等 VPC 时会发生什么?哪个路由表适用于它?
这是一个陷阱问题,因为不公开的路由表适用于通过 VPC 对等连接传入的流量——传入流量唯一可用的路由是隐式本地路由,它使实例无障碍。
当到达对等 VPC 时,发往实例(或在实例上运行的服务,如 RDS)以外的其他对象的流量无处可去,因此会被丢弃。
逻辑上的解决方法是尝试通过对等连接将流量路由到充当路由器的实例...与将流量路由到 NAT 实例的方式非常相似——通过将路由表中的目的地设置为实例 ID 或其关联的弹性网络接口 (ENI)。
在上面提到的文档页面的底部,我们发现了这样一句话的限制:
类似地,如果 VPC A 具有 NAT 设备,该设备为 VPC A 中的私有子网中的实例提供 Internet 访问,则 VPC B 中的实例无法使用该 NAT 设备访问 Internet。
对于不熟悉典型 VPC 配置的人来说,这可能不太清楚,但这种限制实际上更准确地解释了为什么原始问题中提出的配置不起作用。
您可以通过在子网的路由表中创建路由来配置子网以使用 NAT 实例,以便通过 ID 将特定的外部前缀(通常为 0.0.0.0/0,但可以是子集)发送到实例本身或其弹性网络接口。
但是在该区域内,如果您尝试通过路由表将流量路由到对等 VPC 中实例的 ENI,则会失败:
Error: route table rtb-xxxxxxxx and interface eni-xxxxxxxx belong to different networks
(Service: AmazonEC2; Status Code: 400; Error Code: InvalidParameterValue;
Request ID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)
因此,直观的解决方法也不可用。
我能找到的唯一三个解决方案是:
更多的隧道,就像您已经在 VPC-1 和 VPC-3 之间构建的一样。您基本上需要在需要交换流量的所有 VPC(除了您已对等的 VPC)之间建立完整的 OpenVPN 网格(或其他隧道解决方案)。这是我实施的解决方案。在每个可用区域中,我都有一个 OpenVPN 服务器,它具有通往外部区域的所有其他可用区域的隧道。您不一定需要每个可用区域都有一个——每个 VPC 只需一个就可以满足要求,但每对可用区域之间的隧道将提供弹性,以防止由于一个可用区域的丢失而导致整个 VPC 被隔离。
来自隧道服务器的源 NAT。 这个非常混乱。您在 VPC-1 和 VPC-3 之间有一条隧道,而 VPC-3 与 VPC-4 对等,因此您可以通过 VPC-1 中的 VPC 路由表将流量从 VPC-1 路由到 VPC-1 中的隧道服务器,然后通过隧道将其发送到 VPC-3,在那里它可以通过配置假定 VPC-3 中隧道实例的源 IP 地址
iptables
。VPC-3 中的隧道机器可以在 VPC-4 中访问的任何内容,都可以被 VPC-1 中允许访问隧道服务器的任何内容访问。服务代理或 NAT 服务器在 VPC-3 中,可从 VPC-1 访问,要么执行 TCP 连接的第 4 层转发,要么在 VPC-1 地址和 VPC-4 地址之间同时执行流量的源和目标 NAT,这样 VPC-4 就会将流量视为来自 VPC-3 地址,而 VPC-1 则会将流量视为来自 VPC-3 地址。这与上面的类似,但通过安全组提供了更好的访问控制,因为它不是前一个选项所要求的全有或全无访问……但仍然是一个混乱的解决方案。
最干净的配置是所有 VPC(或所有可用区域,同一 VPC 内的可用区域或直接对等的可用区域除外)之间的全网格隧道。
答案2
2022 年更新:
正如@Michael-sqlbot所写:
tl;dr:VPC 对等连接不支持直接对等 VPC 中的 EC2 实例之外的任何 IP 路由或连接。
但是 AWS 现在除了 VPC 对等连接之外还有更多选项来解决此限制。OpenVPV 就是其中之一,完整说明请见软件站点到站点 VPN
查看所有其他选项Amazon VPC 到 Amazon VPC 连接选项