硬件 NAT 卸载会破坏你的 VPN 路由规则吗?
加速可能跳过你的策略所依赖的钩子,也可能只是让计数器更新的位置发生变化。先分清这两种结果,再改动设置。
开启硬件 NAT 加速可以让 VPN 配置更快,也可能让某条路由策略对部分数据包悄悄失效,而且完全不会报错。哪一种结果会出现,取决于快速路径跳过了什么,而这一点在固件、内核版本和所用的加速类型之间各不相同。设置菜单很少告诉你刚才开启的到底是哪一种。
在归咎于加速器之前,有两个说法值得分开:某条规则不再被执行,以及某个计数器不再更新。这两者并不是同一种观察。
三种不同的加速常被混为一谈
转发卸载、加密加速和隧道数据通道卸载是三种彼此独立的机制,却常常共用同一个开关。转发卸载让已建立的流跳过常规协议栈的一部分,加密加速让加密运算更廉价,隧道卸载则把封装搬进硬件。只对普通路由流量做加速的路由器,可能把隧道流量完全留在慢路径上,这是性能结果而不是策略改变。反过来也存在:隧道流量被卸载,而周围的策略仍在评估。
Linux flowtable 是最值得阅读的已文档化案例,因为已建立的流可以被交给快速路径。此时它们的计数和状态处理与经典转发不同,计数器开始显得奇怪正是这个原因。
停住的计数器证明不了什么
规则计数器统计通过该规则的数据包,而一条被卸载的流在第一个包之后可能再也不会经过它。于是计数器在流量继续时冻结,如果你相信那个数字,它看起来和绕过一模一样。观察计数器仍然有用,它能提示这条流离开了被计数的路径。其余诊断必须来自数据包实际去了哪里。
相反的推断同样糟糕。一次快速下载并不能证明你的例外规则和故障处理仍然生效,因为它只检验了一条流,而不是策略。
三个条件决定卸载是否破坏策略
第一个条件是 快速路径是否查询你的策略所依赖的钩子,因为用标记和路由表达的策略比基于逐包过滤构建的策略更容易存活。第二个条件是固件是否允许这种组合,因为有些构建在隧道或防火墙功能启用时会自动关闭卸载。第三个条件是流量是否符合条件,因为加速通常只针对已建立的流,可能排除分片或异常数据包。三者都支持加速时策略仍然生效;而第一个条件不成立时,再怎么调优也无法恢复。
请阅读你所运行组合的厂商文档,而不是泛泛地看路由器型号。固件版本会悄悄改变这些答案。
测策略,而不是测吞吐
先测量策略应当保证什么,再测量它跑得多快。下面的命令显示是否安装了 flowtable、连接跟踪看到了什么,以及客户端从哪个地址出去。变更后要比较新建连接,因为已建立的连接可能仍走旧路径。
nft list flowtables
conntrack -L | head -n 20
curl -sS --max-time 8 https://api.ipify.org; echo
ping -c 3 192.168.50.20
覆盖隧道流量的 flowtable 条目告诉你快速路径已经介入,连接表则显示这条流是否按你预期被跟踪。当地址检查涉及上网出口时,它确认出口;而 ping 确认一个应当仍然可达的私有目标。在加速关闭和开启时各跑一遍同样的命令,比较结果而不是耗时。
记录原来的设置,让实验可逆。笼统地要求在所有地方关闭卸载只能算临时绕行,不算结论。