我正在尝试为 VPN 拆分隧道设置 Strongswan。
我想要的只是子网10.88.0.0/16
,10.0.200.0/24
可以通过 VPN 隧道访问。其他一切都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
and的主机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 客户端上手动编辑路由表:
那么我该怎么做呢?
原来我的拆分隧道问题被放在了一个完全不同的区域,因为我家里有 2 个路由器,所以我的家庭网络类似于:ISP <-> R1 <-> R2 <-> Me。
...并且 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 推送路由。事实证明这是可行的。
当您在 VPN 客户端中
disable class based routing
禁用时,启用会删除基于类的路由。default routing
在 Strongswan 中,您必须将来自客户端的 dhcp 请求转发到已实施 RFC3442 的 DHCP 服务器。
因此,在我上面的配置中,我必须替换所有出现的
pools = IkeVPN-ipv4
withpools = dhcp
并且strongswan.conf
我必须将以下内容添加到 charon plugins 小节:然后我可以删除
pools
配置底部的整个部分。还有一些可用的选项可以在这里阅读。
来自 @ecdsa 提示的 Strongswan 的指南提供了一些信息,但该指南是特定于 Windows 的,因此它不会告诉您如何处理 Linux、MacOS 或 Android 设备。然而,RFC3442 将处理一般情况。
简而言之,RFC3442 说的是您必须发送以下两个 dhcp 选项:
基本上,您必须使用以下语法将每个路由编码为 int 数组:
x,y1,y2,y3,y4,z1,z2,z3,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
:我希望这可以帮助任何对拆分隧道感到困惑的人。