我正在尝试设置 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 计算机的路由表中,我可以找到以下条目:
我知道,当您在路由表中拥有到给定子网的两条路由时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/16
和10.0.200.0/16
VPN 上的路由。
事实证明这是可行的。
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;
}
我希望这能帮助那些正在为分割隧道问题苦苦挣扎的人。