我已成功在本地 Linux 主机和远程 VPN 网关之间建立了 IPSec 隧道。我使用网关分配的虚拟 IP,因为我经常出差,所以我的本地 LAN 子网并不固定。
当它启动时,所有流量(包括互联网流量)都通过隧道传输。我希望所有流量除了让本地子网通过隧道进行路由。我已阅读并重读 Strongswan 文档,但还是搞不清楚如何执行此操作。
我需要做什么?
本地 ipsec.conf
config setup
conn %default
ikelifetime=60m
keylife=20m
rekeymargin=3m
keyingtries=1
keyexchange=ikev2
authby=secret
conn VPN
left=%any
leftsourceip=%config
[email protected]
leftfirewall=yes
right=52.n.n.n
rightsubnet=0.0.0.0/0
[email protected]
auto=add
服务器 ipsec.conf
config setup
conn %default
ikelifetime=60m
keylife=20m
rekeymargin=3m
keyingtries=1
keyexchange=ikev2
conn AWSVPN
left=%any
leftsubnet=172.31.38.36/32
[email protected]
leftfirewall=yes
authby=secret
right=%any
rightsourceip=10.3.0.0/28
auto=add
网关
IP:172.31.38.36 子网:172.31.32.0/20
我的机器
IP:192.168.1.150(可更改)子网:192.168.1.0/24(可更改)虚拟 IP:10.3.0.1(由 Strongswan 网关分配)
编辑:
我已设法通过添加此项来排除本地网络,但子网是硬编码的:
conn local-net
leftsubnet=192.168.1.0/24
rightsubnet=192.168.1.0/24
authby=never
type=pass
auto=route
答案1
由于声誉较低,我无法添加评论,所以就在这里..
当它启动时,所有流量(包括互联网流量)都会通过隧道传输。
不可能。您在服务器上指定了“leftsubnet=172.31.38.36/32”,因此客户端的“rightsubnet=0.0.0.0/0”将缩小到仅此一个主机。
为了将所有流量路由到 VPN,您也需要在服务器上设置“leftsubnet=0.0.0.0/0”。
在默认配置中,Strongswan 在表 220 中添加到服务器子网的路由,对于服务器子网“0.0.0.0/0”,其路由如下所示:
$ ip route list table 220
default via 192.168.2.9 dev wlan0 proto static src 10.3.0.2
并且该表优先于默认使用的“主”路由表:
$ ip rule list
0: from all lookup local
220: from all lookup 220
32766: from all lookup main
32767: from all lookup default
因此,当客户端将数据包发送到本地 LAN 时,此数据包由表 220 路由,该表没有到本地 LAN 的路由 - 只有到 VPN 服务器的默认路由。因此,为了不将本地 LAN 的数据包路由到 VPN,您只需要在表 220 中添加到本地 LAN 的路由,例如:
$ ip route add table 220 192.168.1.0/24 dev wlan0
因此,表 220 现在将如下所示:
default via 192.168.2.9 dev wlan0 proto static src 10.3.0.2
192.168.2.0/24 dev wlan0 scope link
另一个可能的解决方案是使用“主”路由表来路由 VPN 子网(strongswan.conf 中的“routing_table = 32766”),因为它已经有到本地 LAN 的路由。但在这种情况下,当前默认路由将是一个问题:如果已经有一个默认路由,strongswan 将不会添加另一个默认路由。