从 StrongSwan VPN 中排除本地子网

use*_*315 5 vpn linux-networking strongswan

我有一台带有额外的、仅限本地的以太网接口和私有子网的计算机。建立 StrongSwan VPN 后,我无法访问该子网。

这是本地“左”配置(由algo建立):

conn ikev2-<rightip>
    fragmentation=yes
    rekey=no
    dpdaction=clear
    keyexchange=ikev2
    compress=no
    dpddelay=35s

    ike=aes128gcm16-prfsha512-ecp256!
    esp=aes128gcm16-ecp256!

    right=<rightip>
    rightid=<rightip>
    rightsubnet=0.0.0.0/0
    rightauth=pubkey

    leftsourceip=%config
    leftauth=pubkey
    leftcert=daves.crt
    leftfirewall=yes
    left=%defaultroute

    auto=add
Run Code Online (Sandbox Code Playgroud)

有问题的子网是 10.0.0.0/24。%defaultroute 解析为 192.168.0.0/24 中的地址。

'left' 和 'leftsubnet' 看起来不像是正确的选项,但我认为没有什么比这更好的了。我试过将 leftsubnet 设置为 10.0.0.0/24 和 !10.0.0.0/24。

如何从 StronSwan VPN 连接中排除本地子网?

如何检查连接的路由配置?

A.B*_*A.B 5

您可以设置直通策略

更新:正如@ecdsa 所指出的,strongswan >= 5.5.2 有一个更简单的方法,如果您的版本可以使用它,请查看最后。

一些随机 IP 的示例。在任何更改和隧道之前:

# ip route get 10.0.0.55
10.0.0.55 dev lxcbr0 src 10.0.0.77 uid 0 
Run Code Online (Sandbox Code Playgroud)

建立隧道后,问题:

# ip route get 10.0.0.55
10.0.0.55 via 192.168.0.1 dev eth0 table 220 src 192.168.0.44 uid 0 
Run Code Online (Sandbox Code Playgroud)

将此配置添加到/etc/ipsec.conf

conn ignorelan
    left=127.0.0.1 #prevents usage in peers selection algorithm
    leftsubnet=10.0.0.0/24
    rightsubnet=10.0.0.0/24
    authby=never
    type=passthrough
    auto=route
Run Code Online (Sandbox Code Playgroud)

并重新加载它:

# ipsec reload
Run Code Online (Sandbox Code Playgroud)

应该立即激活它。如果没有(这次)你可以这样做:

# ipsec route ignorelan
'ignorelan' shunt PASS policy installed
Run Code Online (Sandbox Code Playgroud)

无论如何,它应该在以后重新启动时使用。您现在拥有(除了任何隧道):

# ipsec status 
Shunted Connections:
     ignorelan:  10.0.0.0/24 === 10.0.0.0/24 PASS
Run Code Online (Sandbox Code Playgroud)

[...]

现在,无论隧道是否建立,您都会返回正确的路由(由 strongswan 处理,因此在表 220 中,而不是(仅)表主(不再)):

# ip route get 10.0.0.55
10.0.0.55 dev lxcbr0 table 220 src 10.0.0.77 uid 0 
    cache 
Run Code Online (Sandbox Code Playgroud)

对于 0.0.0.0/0 的隧道,将出现类似于表 220 中的结果:

# ip route show table 220
default via 192.168.0.1 dev eth0 proto static src 192.168.0.44 
10.0.0.0/24 dev lxcbr0 proto static src 10.0.0.77 
192.168.0.0/24 dev eth0 proto static src 192.168.0.44 
Run Code Online (Sandbox Code Playgroud)

如果你没有在 passthrough 设置中放置匹配现实的路由(例如:错误的网络掩码),那么“分流”会出现错误的结果(如预期的源 IP,但通过错误的网卡),所以要小心。


更新bypass-lan 插件更易于使用,尤其是在动态环境中。

与其添加新conn条目,不如激活它(例如在 Debian buster(不稳定)上,编辑 /etc/strongswan.d/charon/bypass-lan.conf 并设置 load=yes(即:charon.plugins.bypass-lan.load) = 是))。默认情况下,每个接口都会被分流,这意味着会建立隧道,但默认情况下不会使用。所以只需设置interfaces_ignoreinterfaces_use相应地设置。您应该interfaces_ignore不想绕过隧道interfaces_use的接口设置,否则,为绕过隧道的接口设置。例如:

interface_use = lxcbr0
Run Code Online (Sandbox Code Playgroud)

在这个例子之后会得到ipsec start,就像之前的方法一样:

# ip route show table 220
10.0.0.0/24 dev lxcbr0 proto static src 10.0.0.77
Run Code Online (Sandbox Code Playgroud)

(但也会在使用 IPv6 时考虑与此接口相关的 IPv6 路由)。


另一种(hackish)方法是绕过strongswan的表220:而不是任何strongswan设置,可以通过以下方式实现(对于这些问题和示例):

ip rule add priority 219 to 10.0.0.0/24 lookup main
Run Code Online (Sandbox Code Playgroud)

它将使用目标网络的默认(主)路由表,而不是使用 strongswan 的表 220 继续到下一个条目。