AWS EC2 上的 S2S VPN - VPC 的路由问题

AWS EC2 上的 S2S VPN - VPC 的路由问题

我正在尝试从头开始准备 VPN 设置。我使用了 Terraform + AWS + Strongswan。基本图表附在此处: AWS 图,S2S VPN

因此,我有 VPC_left: 172.32.0.0/16和 subnet_left: 以及172.32.10.0/242 个 ec2,其中一个将建立 VPN ( 172.32.10.10),另一个可以视为应用程序节点 ( 172.32.10.11)。两个节点都分配有公共 IP。

有 VPC_right:172.33.0.0/16和 subnet_right:172.33.20.0/24以及另外 2 个 ec2,同样一个将建立 VPN ( 172.33.20.20),另一个可以视为应用程序节点 ( 172.33.20.21)。两个节点都分配有公网 IP。

从我的问题开始 - 我已经在这两个子网之间成功创建了 S2S VPN,并且这种流程运行良好(在 22 或任何其他端口上 ping + telnet):

172.32.10.10 -> 172.33.20.20
172.32.10.10 -> 172.33.20.21
172.33.20.20 -> 172.32.10.10
172.33.20.20 -> 172.32.10.11

但是我遇到了没有创建隧道的虚拟机的问题,这种连接不起作用:

172.32.10.11 -> 172.33.20.20
172.32.10.11 -> 172.33.20.21
172.33.20.21 -> 172.32.10.10
172.33.20.21 -> 172.32.10.11

StrongSwan 日志中没有错误,隧道似乎可以正常工作。我一定是在路由方面做错了什么。

aws_route_tables 的 Terraform 代码:

resource "aws_route_table" "public_left" {
  vpc_id = aws_vpc.dev_network_left.id

  route {
    cidr_block = "0.0.0.0/0"

    gateway_id = aws_internet_gateway.main_left.id
  }

  tags = {
    Name = "public_left"
  }
}

resource "aws_route_table" "public_right" {
  vpc_id = aws_vpc.dev_network_right.id

  route {
    cidr_block = "0.0.0.0/0"

    gateway_id = aws_internet_gateway.main_right.id
  }

  tags = {
    Name = "public_right"
  }
}

resource "aws_route_table" "private1_left" {
  vpc_id = aws_vpc.dev_network_left.id

  route {
    cidr_block = "0.0.0.0/0"

    gateway_id = aws_nat_gateway.gw1_left.id
  }

  tags = {
    Name = "private1_left"
  }
}

resource "aws_route_table" "private1_right" {
  vpc_id = aws_vpc.dev_network_right.id

  route {
    cidr_block = "0.0.0.0/0"

    gateway_id = aws_nat_gateway.gw1_right.id
  }

  tags = {
    Name = "private1_right"
  }
}

这也是从左节点的 ip 路由输出的:

root@ip-172-32-10-10:~# ip r
default via 172.32.10.1 dev ens5 proto dhcp src 172.32.10.10 metric 100 
172.32.0.2 via 172.32.10.1 dev ens5 proto dhcp src 172.32.10.10 metric 100 
172.32.10.0/24 dev ens5 proto kernel scope link src 172.32.10.10 metric 100 
172.32.10.1 dev ens5 proto dhcp scope link src 172.32.10.10 metric 100

root@ip-172-32-10-11:~# ip r
default via 172.32.10.1 dev ens5 proto dhcp src 172.32.10.11 metric 100 
172.32.0.2 via 172.32.10.1 dev ens5 proto dhcp src 172.32.10.11 metric 100 
172.32.10.0/24 dev ens5 proto kernel scope link src 172.32.10.11 metric 100 
172.32.10.1 dev ens5 proto dhcp scope link src 172.32.10.11 metric 100

我觉得错误的是来自 172.32.10.11 的 traceroute 输出:

root@ip-172-32-10-10:~# traceroute -p 22 172.33.20.20
traceroute to 172.33.20.20 (172.33.20.20), 30 hops max, 60 byte packets
 1  172.33.20.20 (172.33.20.20)  1.261 ms  1.198 ms  1.239 ms

root@ip-172-32-10-11:~# traceroute -p 22 172.33.20.20
traceroute to 172.33.20.20 (172.33.20.20), 30 hops max, 60 byte packets
 1  * * *
 2  240.0.12.14 (240.0.12.14)  0.261 ms 240.0.12.15 (240.0.12.15)  0.177 ms 240.0.12.13 (240.0.12.13)  0.208 ms
 3  241.0.1.12 (241.0.1.12)  0.344 ms 241.0.1.5 (241.0.1.5)  0.179 ms 241.0.1.15 (241.0.1.15)  0.182 ms
 4  242.0.117.105 (242.0.117.105)  1.057 ms 240.0.12.18 (240.0.12.18)  0.212 ms 240.0.12.26 (240.0.12.26)  0.181 ms
 5  * 242.0.117.225 (242.0.117.225)  0.737 ms 242.0.117.121 (242.0.117.121)  3.990 ms
 6  52.93.142.115 (52.93.142.115)  3.081 ms 52.93.142.117 (52.93.142.117)  3.024 ms 52.93.145.196 (52.93.145.196)  4.465 ms
...
a lot of other public IP addresses
...

在这种情况下,对于 172.32.10.10 和 172.32.10.11(没有 .11 的条目),iptables 也许也会有用:

root@ip-172-32-10-10:~# iptables-save
Generated by iptables-save v1.8.7 on Thu Dec 14 19:55:32 2023
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 172.33.20.0/24 -o ens5 -m policy --dir out --pol ipsec -j ACCEPT
-A POSTROUTING -s 172.33.20.0/24 -o ens5 -j MASQUERADE
COMMIT
Completed on Thu Dec 14 19:55:32 2023

root@ip-172-32-10-11:~# iptables-save
root@ip-172-32-10-11:~#

你知道我的问题是什么吗?如果还有什么可以帮到你的话,请告诉我,我会把所有必要的信息发给我。

答案1

您的应用程序 ec2 不知道 strongswan ec2 上存在可以到达另一端的 VPN。

您必须创建静态路由。

  • 在指向 strongswan EC2 的 ENI 的 AWS 子网路由表中
  • 或者直接在应用程序 EC2 的操作系统中指向 strongswan ec2 的 IP

AWS 有管理解决方案来互连网络,例如 VPC 对等或传输网关。我认为这比手动方式更好,但也许你有充分的理由

答案2

我不熟悉 Strongswan,但如果您有效地将 EC2 实例用作路由器,则可能需要禁用 Terraform 或 EC2 控制台中的源/目标检查。如果实例不是源或目标,则此检查会阻止实例转发流量。这可能会阻止流量通过隧道。

在 terraform 中,你添加source_dest_check = false到实例参数,在控制台中转到Instance Details-> Actions-> Networking->Change source/destination check然后打开停止'(这里有双重否定,所以请仔细检查措辞!)。

相关内容