IPv6 在 PPP 接口上起来了,出现了一个链路本地地址,于是这次变更被宣布完成。接着却什么也没有被路由,不存在全局地址,访问公网目标的测试失败,而接口看起来仍然是配置好的。链路起来了,网络却从未起来。请按顺序做完下面四项检查,并在解释这一差距的那一项停下。

链路本地地址究竟证明了什么

IPv6CP 在 PPP 链路上启用 IPv6,并为每一侧协商一个接口标识符。该标识符产生一个链路本地地址,它足以与对端在链路上通信,却不足以到达任何其他东西。这个地址证明链路已经为 IPv6 做好准备,却完全不能证明对端背后的网络。把它当作接入地址来读,正是这类排查最常见的起点错误。

下面四个问题把链路层能定下来的事情,与服务必须提供的事情分开。请按顺序回答,因为前一个问题还开着的时候,后一个问题是答不了的。

QuestionAnswered byWhat it does not settle
Is IPv6 up on the link?IPv6CP: interface identifiers, then link-local addressesAny address reachable beyond the peer
Where does a global prefix come from?Router advertisement, delegated prefix, DHCPv6 or static configurationIPv6CP carries no prefix of its own
Who owns the routes?The client's tunnel configuration and the server's return pathA link-local address implies no route at all
How does this client get configured?Explicit tunnel settings or router advertisements, depending on the clientThe standard does not choose for the implementation

前缀必须从哪里来

全局地址需要一个来处:路由器通告、委派前缀、DHCPv6 或静态配置。IPv6CP 不携带任何一种,在链路上再怎么等也不会等出来。RFC 5072 把 IPv6CP 定位为在其他 IPv6 协议于链路上工作之前运行的配置步骤,这就是它的全部范围:准备链路,而不是给网络编号。把前缀给上,接口才会开始承载流量,而不是仅仅存在。

路由器通告在局域网上是常见答案,在点到点隧道上却不太可靠,因为客户端既要发请求,又要接受应答。有些隧道客户端两样都不做。在决定服务器应该发送之前,先确认客户端愿意接受什么。

同一个前缀还必须从另一端能够到达。持有全局地址却没有回程路径的客户端,只是配置好了,并没有连通。

路由是另一个承诺

即便有了地址,客户端也需要知道哪些目的地属于隧道,服务器则需要为这些目的地准备回程路径。这是两个地方做出的两个决定。承载全部 IPv6 流量的隧道,需要客户端有默认路由、服务器有回程路由;分流隧道则要求两端就同一份前缀清单达成一致。两者不一致时,流量出去就再也回不来。

在动手配置之前先把清单写下来。如果方案说只有公司前缀走隧道,那么客户端就不该有默认 IPv6 路由,服务器也不该通告一条。

剩下的由客户端集成决定

有些隧道客户端会显式配置 IPv6。例如 Apple 的 Network Extension 会为隧道接收地址、前缀和一组路由,因此使用它的应用不会等待以太网式的通告。另一些则依赖从链路上到达的路由器通告。两种模型都成立,但它们需要不同的服务器行为,所以选错就会得到一个永远等待没人发送的消息的客户端。改服务器之前先确认模型。

像 ppp0 这样的旧接口名,并不能证明今天运行的协议栈。现代客户端可能使用数据包隧道 API,而不是 PPP 接口;假设它仍像历史连接那样工作,正是把可用设计弄坏的方式。要问客户端版本和配置下发方式,而不是接口名。

写出客户端需要的方案

完整的描述涵盖三件事:客户端持有什么地址、隧道应该承载哪些目的地、网络如何把应答送回来。链路本地地址对这三者一个都答不上,一条被接受的通告也只回答其中一个的一部分。要逐项检查,而不是接受一个绿色指示。然后把每个答案由哪种机制提供记录下来,因为这份记录会让下一次 IPv6 报告变成两分钟的核查。

把记录和服务文档放在一起,并在客户端变化时更新。对 PPP 客户端正确的方案,对同一服务上的数据包隧道客户端可能就是错的。四个问题始终不变,变的只是答案。

相关文章