无法通过 StrongSWAN VPN 连接到子网

无法通过 StrongSWAN VPN 连接到子网

这是我遇到的一个更大问题的简化版本,但我认为它涵盖了所有内容。生产问题出在 StrongSWAN VPN 和 Juniper SSG550 之间。网络设置显然并不理想,但我已经继承了它,客户不愿意改变任何东西,除非绝对必要。

EC2 实例 Bob 和另一个非 EC2 实例 George 之间有一个子网到子网的 StrongSWAN VPN。在与 Bob 相同的子网中还有另一个 EC2 实例 Fred。

Bob 和 George 使用的是全新 Ubuntu 安装。分别为 14.04 和 14.10。Fred 使用的是 Oracle Linux Server 10.5

所有 EC2 实例均已禁用源/目标检查。

----------------------                ----------------------
|                    |                |                    |
|   192.168.1.0/24   |                |    10.0.1.0/24     |
|                    |                |                    |
|  ----------------  |                |  ----------------  |
|  | Bob          |  |                |  | George       |  |
|  | 192.168.1.12 |  |   StrongSWAN   |  | 10.0.1.22    |  |
|  |              |<-------------------->|              |  |
|  | StrongSWAN   |  |                |  | StrongSWAN   |  |
|  |              |  |                |  |              |  |
|  ----------------  |                |  ----------------  |
|                    |                |                    |
|  ----------------  |                ----------------------
|  | Fred         |  |                
|  | 192.168.1.28 |  |                
|  |              |  |                
|  ----------------  |                
|                    |                
---------------------- 

ipsec.conf文件如下:

鲍勃:

# Connections into AWS VPC
conn %default
    ikelifetime=60m
    keylife=20m
    rekeymargin=3m
    keyingtries=1
    keyexchange=ikev1
    authby=secret

conn client
    keyexchange=ikev1
    ikelifetime=24h
    ike=aes256-sha2_256-modp1024
    esp=aes256-sha2_256-modp1024
    aggressive=no
    lifetime=1h
    leftsubnet=192.168.0.0/16
    [email protected]
    leftfirewall=yes
    rightfirewall=yes
    right=PUBLIC_IP_OF_GEORGE
    rightsubnet=10.0.1.0/24
    [email protected]
    auto=add

乔治:

# Connections into AWS VPC
conn %default
    ikelifetime=60m
    keylife=20m
    rekeymargin=3m
    keyingtries=1
    keyexchange=ikev1
    authby=secret

conn client
    keyexchange=ikev1
    lifetime=24h
    ike=aes256-sha2_256-modp1024
    esp=aes256-sha2_256-modp1024
    aggressive=no
    leftfirewall=yes
    leftsubnet=10.0.1.0/24
    [email protected]
    right=PUBLIC_IP_OF_BOB
    rightsubnet=192.168.0.0/16
    [email protected]
    auto=add

我还添加了一条弗雷德到乔治的路线。

Fred> route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
10.0.1.0        192.168.1.12    255.255.255.0   UG    0      0        0 eth0
...

我遇到的问题是,从 George 到 Fred 的流量无法到达那里。从 Fred 到 George 的流量可以到达那里。Bob 和 Fred 都可以 ping George。George 可以 ping Bob。

我在这三个实例的 4000 端口上设置了一个监听套接字。Bob 和 Fred 都可以连接到 George 上的监听套接字,而 George 也可以连接到 Bob 上的监听套接字。显然,Bob 和 Fred 可以互相连接。

这是 Bob 上看到的 George 和 Fred 之间的连接的 tcpdump。

Bob> tcpdump port 4000
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
11:55:37.791967 IP 10.0.1.22.46014 > 192.168.1.28.4000: Flags [S], seq 2922469699, win 29200, options [mss 1460,sackOK,TS val 3459391 ecr 0,nop,wscale 7], length 0
11:55:37.792052 IP 10.0.1.22.46014 > 192.168.1.28.4000: Flags [S], seq 2922469699, win 29200, options [mss 1460,sackOK,TS val 3459391 ecr 0,nop,wscale 7], length 0
11:55:38.792116 IP 10.0.1.22.46014 > 192.168.1.28.4000: Flags [S], seq 2922469699, win 29200, options [mss 1460,sackOK,TS val 3459641 ecr 0,nop,wscale 7], length 0
11:55:38.792188 IP 10.0.1.22.46014 > 192.168.1.28.4000: Flags [S], seq 2922469699, win 29200, options [mss 1460,sackOK,TS val 3459641 ecr 0,nop,wscale 7], length 0
11:56:07.434645 IP 10.0.1.22.46015 > 192.168.1.28.4000: Flags [S], seq 459738226, win 29200, options [mss 1460,sackOK,TS val 3466802 ecr 0,nop,wscale 7], length 0
11:56:07.434722 IP 10.0.1.22.46015 > 192.168.1.28.4000: Flags [S], seq 459738226, win 29200, options [mss 1460,sackOK,TS val 3466802 ecr 0,nop,wscale 7], length 0
11:56:08.436531 IP 10.0.1.22.46015 > 192.168.1.28.4000: Flags [S], seq 459738226, win 29200, options [mss 1460,sackOK,TS val 3467052 ecr 0,nop,wscale 7], length 0
11:56:08.436601 IP 10.0.1.22.46015 > 192.168.1.28.4000: Flags [S], seq 459738226, win 29200, options [mss 1460,sackOK,TS val 3467052 ecr 0,nop,wscale 7], length 0
^C
8 packets captured
8 packets received by filter
0 packets dropped by kernel

弗雷德身上什么也没看见。

两个EC2实例的iptables规则如下:

鲍勃:

Bob> iptables --list
Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  10.0.1.0/24          192.168.0.0/16       policy match dir in pol ipsec reqid 1 proto esp
ACCEPT     all  --  192.168.0.0/16       10.0.1.0/24          policy match dir out pol ipsec reqid 1 proto esp

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

弗雷德:

Fred> iptables --list
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

任何关于问题可能出在哪里的建议都将不胜感激。目前我不确定这是 EC2 问题还是网络问题。

答案1

在上述评论、tcpdump 和分割隧道

尽管在这个测试场景中只有一个问题,但实际上有两个问题。

我需要一些 iptables 伪装魔法

Bob> iptables -t nat -A POSTROUTING -s 10.0.1.0/24 -m policy --dir out --pol ipsec -j ACCEPT
Bob> iptables -t nat -D POSTROUTING -s 10.0.1.0/24 -j MASQUERADE

在生产中,还有一个额外的复杂因素,即 VPN 的 EC2 端(在 192.168.1.0/24 子网中)是 172.22.70.192/28 子网。这需要一些路由魔法来确保从 Fred(eth0 10.0.1.28,eth0:0 172.22.70.194)到 George 的数据包能够以正确的 IP 地址到达 Bob(eth0 10.0.1.12,eth0:0 172.22.70.193)。

Fred> ip route add 10.0.1.0/24 via 192.168.1.12 dev eth0:0 src 172.22.70.194

现在一切正常。

相关内容