摘要

  • 早期 IPv6 Neighbor Discovery 能让主机获得默认路由器列表,却不能说明哪台更适合公网流量,也不能指出某一目的前缀应走另一台路由器。
  • RFC 4191 只增加高、中、低三档偏好和带寿命的 Route Information Option。完整实现先比较最长匹配前缀,同长度才比较偏好;已知可达性又高于偏好。
  • 这些字段是本地建议,不是路由协议、认证或远程命令。路由器不得倾倒完整路由表,主机可以忽略或覆盖,伪造通告仍能吸引流量,后来还必须把源前缀与正确出口联系起来。

默认列表不能回答去哪里

RFC 2461 为 IPv6 主机建立了简洁模型:Router Advertisement 填充 Prefix List 与 Default Router List;目的地址不在链路上时,主机从默认列表选择第一跳。

当一台机器同时拥有以太网、无线连接、企业隧道或隔离测试网时,“都是默认路由器”不再够用。一台能通公网,另一台只通内部前缀;两台都可达,却可能把同一目的送往完全不同的结果。原算法可以优先使用已知或大概可达的路由器,但无法在两台可达设备之间表达拓扑意图。

Redirect 也只能修正同一链路上的选择。一个接口上的路由器不能把主机重定向到另一个接口的路由器。多宿主把原本刻意简单的列表变成了信息不足的决策面。

三档偏好拒绝冒充度量

2005 年 11 月发布的 RFC 4191 没有要求主机运行路由协议,而是在 RA 中加入两位偏好。01 是高,00 是中,11 是低,10 保留且不得发送。

只有三档是有意设计。它提醒实现者:这不是带宽、时延、成本或全球可比的 routing metric。管理员可以表达“优先公网出口”“这台只作后备”,但不能让一套内部度量自动变成所有主机必须服从的顺序。

因此,偏好必须由了解拓扑的人显式配置,不能从动态路由表机械推导。Router Lifetime 为零时,头部偏好必须按中档发送并被接收方忽略。已经撤回的默认路由器,不能靠一个漂亮的偏好值继续取得权力。

选项 24 只交付少量目的范围

Route Information Option 是 ND 选项 24,携带前缀长度、三档偏好、route lifetime 和可变长度的前缀。管理员可以让企业隧道只发布内部前缀,让另一接口继续承担默认公网出口;也可以给一个特定技术前缀指定合适第一跳,而不把该路由器升级为所有流量的最佳默认。

寿命把这份陈述变成租约。零表示删除经这台路由器学到的路由,全一表示无限。主机学到的并不是“这台路由器拥有该前缀”,而是“在这段时间内,它宣称自己是匹配目的的可用第一跳”。

RFC 还建议每条链路、每次通告不要超过 17 个 Route Information Option。这个人为上限表达了架构纪律:只给主机它必须看见的小决策面,不要把路由器内部控制平面复制到成千上万个终端缓存。

最长前缀先于偏好发言

为了兼容渐进部署,RFC 4191 描述三类主机。Type A 完全忽略扩展;Type B 只理解默认路由器偏好;Type C 同时使用偏好与特定路由,形成概念上的小路由表。

Type C 先寻找最长匹配前缀。只有多个候选前缀长度相同时,高、中、低才用于决胜。因此,一个窄范围的低偏好路由,仍会压过高偏好的 ::/0 默认路由。更具体的陈述回答了更具体的问题。

随后是可达性。若第一跳已知不可达,主机跳过它并检查下一个候选;没有可达性信息时才暂时假设可达。路由变化还必须使受影响的 Destination Cache 失效,重新计算第一跳。主机也可以用本地配置覆盖收到的偏好。

这条顺序把权力分开:路由器提出有限建议,主机保留算法、观测与拒绝权。两位字段不能替主机制造一个成功探测结果。

恢复需要与真实流量相连

绕开不可达的首选路由器后,主机必须知道它何时恢复。单等下一次周期性 RA 可能持续很久,尤其当故障在中间交换设备、而路由器本身仍在运行时。

RFC 4191 规定一种克制的好奇心:只有当主机确有本来会交给该首选路由器的有用流量时,才应发 Neighbor Solicitation 探测;每台路由器每分钟不得超过一次。没有待发送的有用流量,就没有理由制造持续探测。

偏好提供恢复价值,实际流量提供开销理由,可达性探测提供事实。三个角色缺一不可,也不能互相冒充。

不要把路由震荡复制给所有主机

路由器可以让某个通告取决于链路状态或动态路由,但不应把不稳定的内部表直接暴露给主机。RFC 建议将面向主机的通告与路由震荡解耦,等前缀稳定后再发布。

原因是放大效应:路由器内部的一次 flap 若被复制到大量主机,会触发缓存失效、第一跳重算和额外探测。停止广告接口时,Router Lifetime 归零,所有 RIO 的寿命也应归零,不能撤回默认身份却留下狭窄路由的残余权力。

更精确的谎言也更隐蔽

RFC 3756 已说明伪造 RA、Redirect 与 ND 参数如何改变主机第一跳。RFC 4191 又给攻击者更精细的工具:伪装成高偏好路由器,或只为某个敏感前缀发布更具体路由。

伪造默认路由会破坏大量连接,容易暴露;只吸引管理、支付或企业前缀,反而可能更安静。RIO 没有签名,不证明发送者管理目的前缀,也不证明路线安全。无限寿命会让错误提示长期存在,但已知不可达仍可使主机选择替代路径,本地策略也能拒绝或覆盖。

“谁有资格发送 RA”与“接收后如何解释”是两件事。选项本身解决不了第一件事。

源地址揭示了下一层边界

2016 年的 RFC 8028 处理多上游、多前缀网络:使用某一运营商源前缀的报文,如果交给另一出口,可能被 ingress filtering、状态防火墙或 uRPF 丢弃。

后来的规则要求主机把源地址前缀与发布它的路由器联系起来。一个目的路由可以完全匹配,却仍可能因源地址和返回路径状态而选错出口。

这不是推翻 RFC 4191,而是证明它为何必须保持窄义。Router Preference 只回答目的与第一跳的有限问题;源地址、过滤、状态和返回路径仍要由运行中的主机共同判断。

来源与证明边界

默认路由器列表的早期模型见 RFC 2461,修订后的 ND 规范是 RFC 4861。三档偏好、RIO、A/B/C 主机、选择顺序、恢复探测和配置限制来自 RFC 4191。安全边界见 RFC 3756,源前缀与第一跳关系见 RFC 8028。

这些标准不测量当今部署率、厂商默认值、全球支持或恢复时间,也不证明发布的路由真实、获授权或全球有效。可以成立的历史结论更小:IPv6 给主机一套薄而会过期的路由词汇,同时把观测与最终选择留在本地。