无法在 Strongswan 中运行拆分隧道

无法在 Strongswan 中运行拆分隧道

我正在尝试设置 Strongswan 以进行 VPN 拆分隧道。

我想要的只是子网10.88.0.0/16,并且可以通过 VPN 隧道访问。其他一切都通过网络10.0.200.0/24处理。default gateway

所有客户端都被分配一个属于10.0.201.0/24子网的 IP 地址。

在我的配置文件中,其中包括以下内容:

# Default login method
eap-defaults {
  remote {
   auth = eap-radius
   id = %any
   eap_id = %any
  }
}

connections
{
  conn-unix : conn-defaults, eap-defaults {
    children {
      net {
        local_ts = 10.0.200.0/24, 10.88.0.0/16
      }

      esp_proposals = aes128gcm128-x25519
    }

    pools = IkeVPN-ipv4
    proposals = aes128-sha256-x25519
  }

  conn-windows : conn-defaults, eap-defaults {
    children {
      net {
        local_ts = 10.0.200.0/24, 10.88.0.0/16
      }

      esp_proposals = aes256-sha256-prfsha256-modp1024
    }

    proposals = aes256-sha256-prfsha256-modp1024
    pools = IkeVPN-ipv4
  }
}

pools
{
  IkeVPN-ipv4 {
    addrs = 10.0.201.0/24
    dns = 10.0.88.2
  }
}

当我通过 VPN 登录时,可以 ping 属于10.88.0.0/16和的主机10.0.200.0/24,所以我知道我可以使用 VPN 隧道。

然而:

如果我尝试在仍然连接到 VPN 的情况下访问 Internet 上的任何其他资源,那么我甚至无法 ping 属于该资源的 IP 地址。

在我的 Windows 计算机的路由表中,我可以找到以下条目:

连接到 VPN 服务器的 Windows 客户端的部分路由表

我知道,当您在路由表中拥有到给定子网的两条路由时0.0.0.0/0,具有最低度量的规则将获胜,并且使用该规则转发流量。

但是我不希望 VPN 服务器通过 VPN 安装默认路由,而是只告诉子网10.88.0.0/16必须10.0.200.0/24通过 VPN 进行路由。

我想要的是看到更接近此的路由表,而不必在每个 VPN 客户端上手动编辑路由表:

所需路由表

那么我该如何做呢?

答案1

事实证明,我的拆分隧道问题出现在完全不同的区域,因为我家里有 2 个路由器,所以我的家庭网络是这样的:ISP <-> R1 <-> R2 <-> 我。

...并且 R1 配置为 10.0.0.0/24 范围内的 IP 地址。

当您在 Windows VPN 客户端中禁用默认路由时,它将添加一个基于类的路由,因此在我的情况下,它将添加一条通过 VPN 发送 10.0.0.0/8 的所有内容的路由,这当然意味着它会与路由器 R1 上的设置冲突。

这就是为什么想要完全删除路由 10.0.0.0/8 并推送子网10.88.0.0/1610.0.200.0/16VPN 上的路由。

事实证明这是可行的。

disable class based routing当您default routing在 VPN 客户端中禁用时,基于类的路由将被删除。

在 Strongswan 中,您必须将客户端的 dhcp 请求转发到已实施 RFC3442 的 DHCP 服务器。

因此,在上面的配置中,我必须用pools = IkeVPN-ipv4和替换所有出现的pools = dhcp,并且strongswan.conf必须将以下内容添加到 charon 插件子部分:

charon {
  plugins {
    ...
    dhcp {
      server = ip.address.of.dhcp.server
    }
  }
}

pools然后我可以删除配置底部的整个部分。

还有更多选择点击此处阅读

Strongswan 的指南@ecdsa 提示提供了一些信息,但该指南是针对 Windows 的,因此它不会告诉您如何处理 Linux、MacOS 或 Android 设备。但是,RFC3442 将处理一般情况。

简而言之,RFC3442 所说的是您必须发送以下两个 dhcp 选项:

  • 选项 121(与 Linux、Android 和 Windows Vista 或更早版本相关)
  • 选项 249(与 Windows 7 或更新版本以及 MacOS 相关)

基本上,您必须使用以下语法将每条路线编码为 int 数组:

x,y1,y2,y3,y4,z1,z2,z3,z4

在哪里:

  • x:CIDR 网络掩码
  • y1 - y4:是您想要路由的网络,但当序列 y1、y2、y3、y4 的尾部全为零时,它们就会被省略。
  • z1 - z4:是子网的下一跳网关。

如果有多个路由要通过 DHCP 发送,那么您必须在第一个路由器的尾部添加另一个类似于上述的序列。

根据 Strongswan 文档,我可以用 替换标准网关0.0.0.0

这意味着我的路线10.0.200.0/24被编码为,24,10,0,200,0,0,0,0并被10.88.0.0/16编码为16,10,88,0,0,0,0

将两者结合起来得到24,10,0,200,0,0,0,0,16,10,88,0,0,0,0,这使我得到以下配置ISC DHCP server

option rfc-routes code 121 = array of integer 8;
option ms-routes code 249 = array of integer 8;

default-lease-time 21600;
max-lease-time 86000;

subnet 10.0.201.0 netmask 255.255.255.0 {
    range 10.0.201.1 10.0.201.254;

    option domain-name "example.com";
    option domain-name-servers ip.address.of.dns.server;

    option rfc-routes 24,10,0,200,0,0,0,0,16,10,88,0,0,0,0;
    option ms-routes 24,10,0,200,0,0,0,0,16,10,88,0,0,0,0;
}

我希望这能帮助那些正在为分割隧道问题苦苦挣扎的人。

相关内容