从 StrongSwan VPN 中排除本地子网

从 StrongSwan VPN 中排除本地子网

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

这是当地的“左”配置(由算法):

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

所讨论的子网是 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 连接中排除本地子网?

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

答案1

您可以设置直通策略

更新:正如@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 

建立隧道后,问题:

# 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 

将此配置添加到/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

并重新加载:

# ipsec reload

应该会立即激活它。如果(这次)没有激活,您可以执行以下操作:

# ipsec route ignorelan
'ignorelan' shunt PASS policy installed

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

# ipsec status 
Shunted Connections:
     ignorelan:  10.0.0.0/24 === 10.0.0.0/24 PASS

[...]

现在,无论隧道是否建立,您都可以得到正确的路线(由 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 

当 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 

如果您没有在直通设置中设置与实际情况不符的路由(例如错误的网络掩码),则“分流”可能会出现错误的结果(例如预期的源 IP,但却通过错误的网卡),所以要小心。


更新: 这旁路局域网插件更易于使用,特别是在动态环境中。

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

interface_use = lxcbr0

在此示例中之后将获得ipsec start,与上一个方法一样:

# ip route show table 220
10.0.0.0/24 dev lxcbr0 proto static src 10.0.0.77

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


另一种(黑客)方法是绕过 strongswan 的表 220:不需要任何 strongswan 设置,而是可以通过以下方式实现相同的目的(针对这些问题和示例):

ip rule add priority 219 to 10.0.0.0/24 lookup main

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

相关内容