你连上之后运行一次路由列表,看到一个从没听说过的子网指向隧道。那一行精确地说明了一件事,却完全没有说明另外几件事。它记录的是这台机器将如何把数据包转发到那个前缀,没有说明那里有哪些主机,也没有说明你的账户能到达什么。正确读懂它只需要一分钟,而把它当成清单来读,需要更长时间才能改掉这个习惯。

把路由表当作本地指令来读

路由是本地内核持有的转发指令:对于这个前缀,使用这个接口和这个下一跳。前缀长度决定了指令有多具体,最长匹配获胜。这条规则里没有提到权限、服务健康或远端拓扑。

策略规则可能在查表之前介入,所以一条路由可以存在,却并不是某个特定数据包实际使用的那条。要把规则和路由表放在一起读,然后问内核它为某个具体目的地会选择哪条路径。针对一个地址的答案,比一页前缀更有价值,而且它是唯一能反映客户端所应用的标记、命名空间和接口绑定的答案。

宽前缀不是目录

通过隧道路由的 /16 并不意味着有一万六千台可达主机,默认路由意味着的还要更少。服务器决定谁来应答,防火墙决定什么被允许,账户决定什么被授权。

窄表有相反的陷阱:缺少某个前缀,可能意味着该目的地能通过另一条路径到达,也可能只是它根本没有被路由。在你测试之前,这两种情况看起来一模一样。拿路由表和被告知要使用的资源去比,而不是拿你对 VPN 应该包含什么的预期去比。

表项从哪里来

路由至少来自四个地方:配置文件、在建立连接时推送路由的服务器、拥有该接口的网络管理器,以及在故障处理时手动输入命令的人。每一个的生命周期不同,负责人也不同。

故障期间手动输入的那条,就是重启后消失、也不会出现在任何人文档里的那条。服务器推送的路由会随服务器变化而变化,所以来路不明的新前缀往往出现在网关更新之后,而不是客户端变更之后。ip-route 手册记录了路由表和字段的语法,如果你需要读懂那些标志位。

对照服务合同检查路由

有用的比较是在路由表和承诺给你的服务之间:名称、地址范围、端口和负责人。把这四项写在前缀旁边,缺口就会显现出来。

ip route show table all dev tun0
ip route get 10.20.5.9
ip rule show

如果前缀存在而服务仍然失败,路由表已经完成了它的工作,问题在别处:名称解析、另一侧的防火墙,或者没有正确组的账户。如果前缀缺失,问题是谁本该提供它,而不是该输入什么。这两种答案都会指出下一个该问的团队,而这就是读路由表唯一有用的产出。在关闭终端之前,把那个名字记下来。

记录任何变更前后的状态,连同日期和接口。路由表是一台机器上某一瞬间的快照,只有当有人写下它是什么时候拍的,它才会成为证据。

相关文章