摘要

  • 一台主机只知道默认网关,也能抵达远方;代价是某些数据包会先交给 G1,再被 G1 从同一条本地链路转给更合适的 G2。ICMP Redirect 让 G1 在完成这次转发后,把下一次的捷径告诉原主机。
  • 这条消息不是小型路由协议。主机必须确认发送者正是当前第一跳,并确认新网关就在消息到达的本地网络上;随后改变的只是某个目的地的缓存,而不是一张对全网生效的地图。
  • IPv6 用链路本地源地址、255 的 Hop Limit 和目标校验把边界写得更清楚;SEND 还能加入签名和路由器授权。但经过保护的建议仍只说明一段转发关系,不证明目的地归属或全球最优路径。

多走一次的那条本地链路

早期主机不必拥有路由器眼中的完整世界。它只要知道一台默认网关,便可以把“不知道如何直达”的数据报交出去。这个最小知识模型降低了配置成本,也让主机与路由系统保持清楚的分工。

但默认并不等于最短。设想主机 H、路由器 G1 和路由器 G2 都连接在同一张局域网上。H 把 G1 设为默认网关。对于某个远端 X,G1 的路由表却认为下一跳应当是 G2。于是数据包先从 H 越过链路抵达 G1,再由 G1 沿同一链路发回 G2。包可以成功送达,路径却在本地多折了一次。

RFC 791 把名称、地址和路由区分开来。IP 数据报携带源与目的地址,各台主机和网关逐跳作出转发选择;本地网络程序再把选定的 IP 下一跳落实为一次链路传输。这个结构没有要求每台主机加入网关之间的路由交换。

因此,G1 比 H 多知道一件事,却不因此成为 H 的永久控制者。它知道自己刚把发往 X 的包交给了同链路的 G2。设计要解决的不是如何把整套路由权力交给 G1,而是如何让它只传递这条观察。

先把包送走,再提出建议

RFC 792 用 Redirect 描述了这个场景。G1 收到 H 的数据报,查询路由表,找出通往 X 的下一网关 G2;若 G2 与数据报源地址代表的主机位于同一网络,G1 就向 H 发送 Redirect,建议以后直接把相关流量交给 G2。

值得注意的是,G1 同时继续转发原始数据报。它不把当前包扣留为筹码,也不要求 H 先学会新路径才履行自己的转发职责。这一次仍沿已知工作路径前进;建议只作用于后续流量。

“重定向”这个名字因此比它的权力听起来更强。消息没有在网络深处夺走一个包,也没有替主机安装全球规则。它只是说:你刚才把这类流量交给了我;我确实转发了它;下次可以少经过我这一站。

ICMP 还明确保留了失败空间。RFC 792 说明,控制消息用来反馈通信环境,却不会使 IP 变得可靠。原数据报可能丢失,Redirect 也可能不返回。没有收到消息,不代表默认网关一定最优;收到一次消息,也不保证新路径永远可用。默认路径仍是可继续执行的底座。

被引用的原包是一张收据

Redirect 不只携带 G2 的地址。它还引用触发事件的数据报:原 IP 首部,加上最初 64 位数据。在当时的协议布局下,如果传输层端口位于数据开头,这段引用还能帮助主机把反馈关联到相应通信。

这像一张压缩过的收据。G1 不是向所有人宣告“凡是路由都应听我”,而是把建议系在 H 刚刚发出、G1 刚刚处理的那份流量上。消息的代码区分当时定义的网络、主机和服务类型场景,网关字段则指出建议的执行者。

收据的缺失同样重要。它没有列出 G2 之后的完整路径,没有解释 G1 的路由策略,没有证明 G2 必然接收,也没有提供 X 的产权或组织身份证明。G1 只能报告自己所在边界看到的事实:这个源把包交给我,我为这个目的地选择了另一个本地邻居。

这是一种范围很窄的网络资源证据。原包证明事件,新网关指出候选执行者,G1 的当前第一跳身份构成发言资格。最终是否改变本地状态,仍由 H 按共同规则判断。

只有当前网关才有资格开口

能够改变下一跳缓存的消息,天然也是攻击面。仅仅把 ICMP 格式写对,不能成为控制主机流量的许可证。RFC 1122 因而在要求主机处理 Redirect 的同时,给接收动作加上两道关系校验。

第一,新网关必须位于消息到达的同一连接子网。远端设备不能推荐一个主机在本地根本无法直达的执行者。第二,Redirect 的源必须是主机目前用于该目的地的第一跳。如果 H 原先没有把包托付给某台路由器,那台路由器便不能仅凭一条控制消息获得修改路径的资格。

这两道检查不能证明当前网关不会被攻陷,也不能解决共享链路上的所有冒充。它们完成的是更小但必要的工作:把“谁可以建议”限制在主机现有转发状态可以核验的关系里。

这里不需要判断 G1 是否代表一个国家、注册管理机构或远端网络。主机只问:它是不是我此刻实际使用的第一跳?它推荐的目标是否就在这条链路上?制度身份被留在协议不应擅自回答的层面。

改一个目的地,不改一张世界地图

RFC 1122 给 Host Redirect 与 Network Redirect 都留下了兼容处理,却拒绝让后者无限扩张。主机通常不知道远端目的地址所适用的子网掩码,因此不应根据一条消息擅自推断它覆盖的整段网络。所谓 Network Redirect 也应像 Host Redirect 一样,只更新该目的地主机的路由缓存项。

这个决定承认了证据的不完整。G1 对刚转发的一个目的地拥有可用观察,并不等于它已经向 H 证明了某个远端前缀内所有地址的共同拓扑。若把一次窄观察扩大成宽路由,未被测试的流量也会被带走。

目的地缓存还有一层意义:它记录的是这台主机在当前条件下怎样执行,而不是谁拥有地址。另一台主机、另一张接口、另一时刻,完全可能采用不同下一跳。路径能够被替换,正因为它没有被包装成身份或永久权利。

Redirect 因此不是一条缩小版的路由公告。它是一项局部例外,依赖当前默认路径而存在。默认路径不因捷径出现而失去意义;当例外失效时,系统还需要能够退回广义选择。

发现路由器,不等于参与路由

默认网关本身也需要来源。静态配置可靠但维护成本高,且无法自然表达路由器的上线与离线。让主机偷听本地路由协议,又会迫使它理解各网络可能不同、还会变化的控制协议。

RFC 1256 用 Router Solicitation 与 Router Advertisement 提供了另一条路。主机可以发现邻近路由器的地址、偏好和信息寿命,却不必成为路由协议成员。

文件明确说,这不是路由协议。广告帮助主机找到可用的默认路由器,却不决定去往每个目的地时哪台最好。如果主机为 X 选了不理想的默认网关,那台网关可以再用 Redirect 指出更合适的邻居。

于是形成两个不同的证据面:Router Advertisement 是一份会过期的候选执行者列表;Redirect 是某次实际转发后,对一个目的地提出的窄修正。前者不承诺目的地最优,后者也不获得管理所有默认路由器的权力。

为什么路由器自己不能服从 Redirect

对信息很少的主机有用的建议,若被路由器当作路由学习渠道,后果会完全不同。RFC 1812 规定,正在使用路由协议的路由器不得把 ICMP Redirect 学来的路径用于转发。

理由在于证据系统不同。路由器通过静态配置或路由协议获得可见性、依赖和冲突处理。若一条由单个数据包触发的消息可以绕过这些机制,便可能与现有路由状态矛盾并形成环路。相同字节到达不同角色,不应自动拥有相同权限。

RFC 1812 也收紧发送条件。触发包必须从接收它的同一物理接口发出;源地址与更好的下一跳必须处于同一逻辑子网;数据包不得含有 IP 源路由选项。发送 Redirect 的源地址还应属于接收主机所在的相同逻辑子网。

这些条件共同封住越权出口。不同接口意味着跨边界指挥,而不是删除本地三角;源与下一跳不在同一子网,主机便无法直接执行;已有源路由则说明发送方已显式选择特殊路径,不应再由普通捷径覆盖。

IPv6 把“来自本地”写进报文

IPv6 没有抛弃 Redirect,而是把它纳入 Neighbor Discovery。路由器可以告诉主机:另一个路由器是更好的第一跳;也可以指出目的地址其实就是链路邻居,主机无需先过网关。

RFC 4861 的校验规则把边界变得更容易机械判断。消息源必须是链路本地地址,IPv6 Hop Limit 必须等于 255,ICMP 校验和与代码必须有效;发送者还必须与主机当前用于该目的地的第一跳一致。

目的地址不能是组播。目标地址要么是建议路由器的链路本地地址,要么在宣布目的地本身位于链路上时与目的地址相同。通过这些检查的 Redirect 才能被称为有效。

255 的设计尤其精确。任何经过路由器转发的 IPv6 包都会减小 Hop Limit,因此一条到达时仍为 255 的消息不可能从链路之外转发而来。它不证明邻居诚实,只证明消息没有从远方穿过一跳再冒充本地。这正是“先验证范围,再判断资格”。

主机随后更新 Destination Cache;若消息带有目标链路层地址,还可更新 Neighbor Cache。执行者仍是主机。RFC 4861 同样禁止路由器因为收到 Redirect 而更新自己的路由表。

加密可以保护关系,不能制造普遍真理

本地并不天然安全。一台恶意邻居或伪装的路由器,恰好位于主机最缺乏外部信息的启动位置。RFC 3971 定义 Secure Neighbor Discovery,通过签名、加密生成地址和锚定在配置信任点上的证书路径来保护 Neighbor Discovery。

在这套模型里,路由器授权可以约束其获准宣告的地址范围。某些 Redirect 场景还要求目标地址落在证书许可的范围内。有效签名说明发送者持有相应密钥,证书路径说明某个已选信任结构授权它扮演路由器。

但这不是更高层真理的自动生成器。签名不证明建议路径全球最短,不证明它符合商业策略,也不证明目的地由签名者拥有。它验证的是消息完整性、密钥控制和相对于信任锚的有限授权。

SEND 还允许通过配置在受保护与未受保护的 Neighbor Discovery 之间共存或选择。严格模式可能拒绝无法认证的真实邻居,兼容模式则保留未认证建议的风险。标准描述选择面,不替每个运营者消除取舍。

来源与证据边界

RFC 791 提供 IP 与逐跳路由模型;RFC 792 定义 G1/G2 Redirect;RFC 1122 规定主机校验与目的地缓存范围;RFC 1256 区分默认路由器发现和逐目的地选择;RFC 1812 约束路由器发送并阻止路由器借 Redirect 学路由;RFC 3971 提供可选的 SEND 认证;RFC 4861 定义 IPv6 Redirect 的本地验证和缓存行为。

这些文件没有给出一个全球统一的部署、启用或停用日期,也不能证明今天所有操作系统的默认值。它们没有统计攻击发生率,没有保证每条有效消息都是正确运营选择,也没有授权把沉默解释为路径已经最优。它们证明的是一种更窄的架构:当前第一跳可以根据一次真实转发提出本地建议,但建议能否执行、执行到什么范围,仍由接收主机的验证和缓存边界决定。