改默认路由前,先查 Linux 策略路由
一条规则就能把流量送去另一张表,让主默认路由变得无关紧要。改 Linux VPN 路由之前,先读优先级、表和所有者。
一台 VPN 主机在一个接口上应答,却 拒绝把回应从隧道送回去,而默认路由看起来是对的。主表不再是全部真相,就是从这一点开始的。Linux 可以用策略规则为每个数据包选择一张路由表,VPN 可能已经装了一张。动默认路由之前,先读规则。
顺序很重要:先看规则,再看每条规则选中的表。
按优先级顺序读规则
运行 ip rule show 并从上往下读。优先级数字决定求值顺序,数字越小越早被检查。32766 上的默认规则通常是最后一条起作用的。如果列表很长,改任何东西之前先存成文件。
对每条规则,记下优先级、匹配条件(源、标记、接口或目的地)以及它引用的表。没有可用表的规则是死胡同,不是路由。
IPv6 也一样,用 ip -6 rule show。只存在于 IPv4 家族的策略,会把另一个家族留在主表上。
读每条规则选中的表
用 ip route show table <name or number> 查看每一张被引用的表。把它的路由和你预期的接口、下一跳作比较。空表或不完整的表,解释的正是主表解释不了的故障。
主表里可能仍留着默认路由,这没问题。如果某条规则先把你的流量送去表 51820,那么主默认路由对这个包无关紧要。
如果编号不熟,去 /etc/iproute2/rt_tables 里查表名。这一查只要一秒,能省掉一段长绕路。
弄清规则是谁装的
NetworkManager、wg-quick 及其他脚本可以动态装规则。运行时删掉一条,下次重连可能又被装回来。加一条竞争规则之前,先看管理器的配置。
例如 wg-quick 会为隧道允许的地址加一条带标记的规则和一张表。去往这些地址的流量之所以绕过主默认路由,原因就是那条规则。如果你不改配置就删掉它,下次 up 会把它恢复。
复查时保住端点的外层路由和管理通道。不要为了简化输出,就在一台在线的远程网关上把所有规则清空。能在改动后活下来的管理会话,本身就是测试的一部分。
测真正重要的源上下文
一条通用的 ip route get 回答的是与应用流不同的问题。加上源地址,如果 VPN 用标记也加上标记,才能看到真实数据包走的路径。用同一个源上下文,分别测一个被包含的目的地和一个被排除的目的地。如果主机跑双栈,再对 IPv6 重复一遍。
在获批的修正之后,重跑同样这两次查询并比较。把预期的那条规则、那张表、以及规则能撑过重启多久记录下来。正是这份记录,让下一次服务重启可解释,而不是神秘。ip-rule 手册页 记录了匹配选择器和表的语法。