我怎样才能仅将特定子网路由到 StrongSwan VPN,而不是将 Linux 上的所有流量路由到 StrongSwan VPN?

我怎样才能仅将特定子网路由到 StrongSwan VPN,而不是将 Linux 上的所有流量路由到 StrongSwan VPN?

我对网络没有特别的了解,所以我会尽力解释我的需求。在我的 Linux 笔记本电脑上,我运行 StrongSwan(带有 NetworkManager)以使用 IPsec 连接到特定 VPN。这个 VPN 让我能够访问这些类型的 IP 10.*.*.*

现在,我的问题是,当我运行 VPN 时,所有流量都会通过 VPN,但我更愿意将仅发往那些 IP 的数据包路由到 VPN(10.*.*.*)。

我该怎么做?有人能给我提供一个简单的指南,或者分享必要的配置以及如何应用它们吗?

答案1

strongSwan 的 NetworkManager 插件目前不允许更改建议的流量选择器(决定哪些流量要通过隧道传输)。因此,它始终建议通过隧道传输所有内容,除非服务器缩小流量选择器的范围(见下文),否则这就是协商的结果。

解决此问题的可能方法:

  1. 如果可以,请更改服务器的配置,以便它通过自己的一组精简的流量选择器将客户端的提议缩小到所需的子网。有些客户端或多或少能够处理这个问题,strongSwan 的 NM 插件应该没问题(在 strongSwan wiki 上,您可以找到有关分割隧道的更多信息以及不同客户可能遇到的问题)。
  2. 如果你只想在连接到 VPN 时访问本地 LAN,你可以加载旁路局域网插入在里面卡戎-nm守护进程(strongSwan NM 插件的后端),它会自动为所有本地连接的子网安装绕过 IPsec 策略。
  3. 与上一个选项类似,使用常规 IKE 守护程序 (卡戎或者charon-systemd,通过 swanctl.conf 或 ipsec.conf 配置)为您不想通过 VPN 访问的子网安装绕过 IPsec 策略(如果它们不是本地连接的,这也有效)。
  4. 预防卡戎-nm守护进程在路由表 220 中安装自己的路由(通过charon-nm.install_routes选项(strongswan.conf 中的选项),或者在连接建立后清除路由表 220。然后手动或通过 NM 脚本(在 中/etc/NetworkManager/dispatcher.d,请参阅文档在这里),仅为要建立隧道的子网安装特定路由,例如:

    ip route add 10.0.0.0/8 dev <outbound interface> src <virtual IP> table 220
    

    其中虚拟 IP 地址必须通过日志或ip addr(或通过环境变量在脚本中)确定。如果您不禁用自动路由安装,您也可以从现有路由中获取虚拟 IP,然后将其删除。

  5. 或者,使用常规 IKE 守护程序而不是 NM 插件。在那里,您有更多选项可以仅隧道传输您想要的流量(通过设置特定的远程流量选择器或通过旁路策略)。但是,您没有 GUI 来配置/启动 VPN 连接(但您可以自动启动连接或在检测到目标子网的流量时启动连接)。

答案2

非常感谢@ecdsa 的完整回答。

我是网络领域的新手,尽管解决方案很简单,但我还是付出了很多努力才实现它。

以下解决方案采用第四个建议,并需要以下步骤:

  1. 通过 NetworkManager 打开你的 VPN
  2. 运行以下命令来发现从 NetworkManager 创建的路由

    user@laptop:~$ ip route list table 220
    default via 192.168.1.1 dev enp0s31f6 proto static src 172.26.199.15
    
  3. 注意接口(enp0s31f6) 和虚拟 IP (172.26.199.15

  4. 由于要使用自定义路由,因此请使用以下命令刷新当前路由

    sudo ip route flush table 220
    
  5. 使用以下命令添加自定义路线

    sudo ip route add 10.0.0.0/8 dev enp0s31f6 via 172.26.199.15 table 220
    

现在只有发往10.0.0.0/8将通过 VPN 进行路由。

相关内容