我正在尝试从头开始准备 VPN 设置。我使用了 Terraform + AWS + Strongswan。基本图表附在此处: AWS 图,S2S VPN
因此,我有 VPC_left: 172.32.0.0/16
和 subnet_left: 以及172.32.10.0/24
2 个 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
然后打开在‘停止'(这里有双重否定,所以请仔细检查措辞!)。