桌上的打印机在隧道建立后仍能工作,而另一间办公室的服务器却悄悄解析到了本地地址。这两种行为来自同一条规则:最具体的路由胜出,而直连前缀已经具体到极致。这通常正是你想要的设计,也正是重复的私有网段窃取远端地址的方式。先读懂内核的选择,就能把莫名其妙的故障变成一次前缀比较。

直连前缀比默认路由更具体

隧道通常安装一条默认路由或一组前缀,而本地接口则带有一个直连前缀以及通往整个 LAN 的路由。两者之间由最长前缀匹配决定,因此 LAN 前缀内的目标永远不会进入隧道。这就是 VPN 开启时打印机、路由器管理页面和本地 NAS 仍可访问的原因。这也是重叠网段中的远端资源会被送到错误机器的原因。

私有地址空间并不唯一,两个站点选择同一前缀的情况足够常见,值得提前规划。当网段重叠时,本地应答来得又快又显得权威,于是很容易把故障误读为登录问题。目标确实应答了,只是不是你要的那一个。

读懂内核会做的选择

不要从上往下读表,而是直接问内核对确切目标会选用哪条路由。然后再查可能选中其他表的策略规则。两条命令几秒钟就能回答这两个问题。

ip route get 10.20.30.41
ip route show table all | grep -E '10\.|default'
ip rule show

第一段输出会给出接口、下一跳以及内核将使用的源地址,这才是关键答案。dev 的值指向本地网桥,意味着数据包根本不会进入隧道,无论 VPN 客户端的状态面板怎么宣称。过滤后的路由表清单显示另一张表里是否存在同一前缀,规则列表则显示这些表的查询顺序。策略规则可以让某个前缀走指定路由表 即使主表并不认同也是如此,所以那个顺序也是答案的一部分。

本地访问是一项独立权限

有路由不等于被允许使用它。大多数客户端可以在隧道开启时阻止本地网络通信,而那项设置是策略决定,不是路由的副产物。当可信的近端服务属于设计的一部分时,请启用受支持的本地访问选项,而不是发明路由。设备在公共 Wi-Fi 上时,就把它关掉。

两层的失败方式不同。被阻止的本地路径即使路由存在也会超时,而重叠路由会给出错误主机的应答。区分它们只需一次查询,却能省下一个下午的防火墙改动,转发安排见 strongSwan 的转发说明。

不堆叠主机路由地修正重叠

为单个地址加主机路由看似修好了重叠,却在需要同网段第二个地址的那一刻失效。加上二十条之后,没人说得清哪个前缀才是权威。可持续的修法是更改编址、用有文档的拓扑避开重复网段,或在一端做转换。每一种都只需一次规划时间,而不是永久维护。

如果确实需要临时主机路由,就在旁边记录原因、责任人和日期,以便日后移除。然后测试确切的地址和服务,再加一个公网目标,因为悄无声息地把无关应用排除在隧道之外的本地访问改动,比原来的故障更糟。把本地前缀和远端前缀分开写下来;这个习惯能阻止一个能通的本地 ping 被传来传去,当作远端办公室可达的证据。

相关文章