分流在 ROS 里不是靠一个开关完成的,它由三层东西串起来:先给连接贴上标记,再让标记去认路由表,最后路由表把流量交给对应的代理IP线路。三层里任何一层没接上,规则写得再漂亮也不会生效,这也是很多人对着配置反复改却始终没动静的原因。
三层分别管什么
- 标记
- 给流经的连接贴一个内部记号,记号本身不带任何地址信息
- 路由表
- 把记号翻译成走哪一条线路,是分流最终落地的地方
- 地址列表
- 圈定哪些来源或目标需要被贴记号,决定规则的边界
在 ROS 里,三层之间是自上而下的关系。地址列表先把范围圈出来,标记再按这个范围给连接贴条,路由表拿着记号决定去向。所以规则不生效的时候,回头检查这三层里哪一层断了,比盯着规则本身翻来覆去改要快得多,因为断点几乎总能归到其中某一层上。
为什么只按设备分或只按目标分都不够
只按设备分,一台机器上的全部流量都会被推到同一条代理IP线路上,连内网访问和本地打印也跟着绕一圈;只按目标分,同一个目标可能有多台设备在访问,你没办法区别对待。两类条件叠起来用,才是分流常见的完整形态:先圈出目标范围,再限定生效的设备范围,最后才由路由表决定去向。
| 条件类型 | 圈定什么 | 常见误用 |
|---|---|---|
| 来源设备 | 哪几台机器生效 | 以为按设备分就够,忽略了内网流量 |
| 目标地址 | 哪些地址被处理 | 忘了内网地址也落在范围里 |
| 端口与协议 | 哪一类连接被处理 | 把所有端口一刀切,连本地服务也绕进去 |
条件写得越窄,越不容易误伤旁边的流量。
三层里最容易断的是哪一层
实际排查下来,断点多数落在标记和路由的衔接上,也就是记号贴了却没被后面的规则认出来。地址列表配得好好的,标记也已经贴上,但路由表里没有对应的那条去向,流量于是走了默认路径,从外表看一切正常,只是没走代理IP线路。这类问题不会报错,只能靠对比地址来发现,所以 ROS 里配置完成之后主动核一遍,比等着业务反馈要主动。
先写目标范围,再写来源条件,最后接路由。按这个顺序排,后续调整代理IP线路时只需要动一层。
顺手记一句:改完分流之后,别只看被覆盖的设备通不通,还要确认没被圈进去的设备仍然走本地宽带。分流做错最常见的样子,是覆盖面比预想的大了一圈,而这一点在单台设备上根本看不出来。
