在原生 IKEv2 配置里,真正有意思的不是某个勾选框,而是 IncludeAllNetworks,它改变的是系统被允许向隧道外发送什么的范围。把它设为 1,macOS 就把这条隧道当作几乎所有 IP 流量的通道,只留下一组由它定义、你可以扩充的例外。由于它住在配置字典里而不是菜单里,它也不等于大多数人读到发送全部流量时的理解。

这个键在网络栈内部改变了什么

没有它时,隧道就像一个挂着路由的网络接口。经由该接口的默认路由会抓走大部分流量,而另一个接口上更具体的前缀路由仍然为自己的前缀胜出。这是普通路由,也正是分流几乎像是意外发生的原因。

开启这个键之后,范围不再是路由偏好,而变成一条关于哪些流量允许经由隧道以外的任何东西离开的策略。系统仍然需要访问网络来维持连接,所以这条策略自带例外,而不是假装它们不存在。开启它从不会让机器完全没有可用路径。你得到的是一份比你预想更短的路径清单,而这份清单是有文档的。

实际后果是:再加一条路由不再能解释结果。如果某个目的地仍然被直连到达,要问的不是哪条路由赢了,而是有没有某个例外覆盖了它。

例外是这项设置的一部分

Apple 在主键旁边记录了几项排除:本地网络、Apple 推送通知流量、蜂窝服务和设备通信。每一项都有自己的平台与版本条件,所以同一份配置在不同 macOS 版本上的行为可能不同。

其中一些排除是固有的。建立并维持网络访问所需的流量,包括强制门户的处理,必须被允许,否则机器可能落到什么都连不上、也修不了的状态。

接下来是有意的选择。允许家里的打印机与允许某个工作资源前缀不是同一个决定,而两者都不同于让 APNs 保持可达以便通知继续到达。把你启用了哪些记在配置本身里,而不是以后从一份缺陷报告里才发现。

为什么它不等于默认路由

默认路由是路由表里的一条记录,而路由表会输。更具体的前缀能赢它,应用级连接可以绕过它,第二条度量更好的接口也能在没人碰 VPN 配置的情况下接管。

Apple 的路由指南把区别讲明白了:普通默认路由可以被更具体的路由覆盖,而范围更广的这项设置定义隧道必须承载哪些流量、哪些被从里面切出去。一个是偏好,另一个更接近规则。

这个差别也改变了你诊断泄漏的方式。有默认路由时,你查路由和度量。有范围键时,你查配置修订、已安装的例外和特定版本的行为,因为路由表位于更早做出的决定的下游。

EnforceRoutes 是另一个旋钮

EnforceRoutes 听起来像是同一想法的严格版本,于是人们把两个都堆上,相信键越多覆盖越广。Apple 明确记载:当 IncludeAllNetworks 启用时它会被忽略,所以那个组合里第二个键什么也买不到。

把它当作不使用更广范围的那些配置的替代方案,而不是加强项。如果你说不清每个键单独做什么,两个都加只会让配置更难评审。

网关和配置所有者必须就什么达成一致

客户端设置没法让服务器转发它从未被配置去转发的流量。网关必须接受会话、分配地址、为你打算到达的前缀提供回程路径,并按你选择的安排提供 DNS。如果它只路由一个前缀,宽泛的客户端范围就会产生到达即死的流量。向网关路由范围之外的目的地发一次请求,一分钟内就能证明这一点。

由应用自有的隧道又是另一种情况。提供方必须实现或暴露受支持的行为;再装一份原生 IKEv2 配置并不会修改另一个应用已经在管理的隧道,而一个 IKEv2 键也不是别的客户端会去读的 OpenVPN 指令。

关于当前的键清单和版本条件,请读 Apple 的 IKEv2 载荷参考,而不是某人多年前抄下来的配置。

把配置修订当作整体来接受

在改动一台被远程管理的 Mac 之前,写下目标 macOS 版本、预期的互联网出口、必须保持可达的私有前缀,以及你要启用的每一项例外。然后保留一条不依赖你即将改动的那条隧道的恢复路径。

测试新的公网请求、私有请求、两种地址族和名称解析,并且 检查已安装的修订而不是设计文件。如果仍有东西走直连,判断它是文档化的例外、不同的连接上下文,还是真正的配置错误,然后改这三者之一,而不是去扩大无关的键。

相关文章