IPv6CP 协商了什么,以及什么仍需要前缀
PPP 接口上的链路本地地址只是一个配置步骤,并非 IPv6 接入。要把标识符交换与前缀、路由和客户端集成区分开来。
IPv6 在 PPP 接口上起来了,出现了一个链路本地地址,于是这次变更被宣布完成。接着却什么也没有被路由,不存在全局地址,访问公网目标的测试失败,而接口看起来仍然是配置好的。链路起来了,网络却从未起来。请按顺序做完下面四项检查,并在解释这一差距的那一项停下。
链路本地地址究竟证明了什么
IPv6CP 在 PPP 链路上启用 IPv6,并为每一侧协商一个接口标识符。该标识符产生一个链路本地地址,它足以与对端在链路上通信,却不足以到达任何其他东西。这个地址证明链路已经为 IPv6 做好准备,却完全不能证明对端背后的网络。把它当作接入地址来读,正是这类排查最常见的起点错误。
下面四个问题把链路层能定下来的事情,与服务必须提供的事情分开。请按顺序回答,因为前一个问题还开着的时候,后一个问题是答不了的。
| Question | Answered by | What it does not settle |
|---|---|---|
| Is IPv6 up on the link? | IPv6CP: interface identifiers, then link-local addresses | Any address reachable beyond the peer |
| Where does a global prefix come from? | Router advertisement, delegated prefix, DHCPv6 or static configuration | IPv6CP carries no prefix of its own |
| Who owns the routes? | The client's tunnel configuration and the server's return path | A link-local address implies no route at all |
| How does this client get configured? | Explicit tunnel settings or router advertisements, depending on the client | The standard does not choose for the implementation |
前缀必须从哪里来
全局地址需要一个来处:路由器通告、委派前缀、DHCPv6 或静态配置。IPv6CP 不携带任何一种,在链路上再怎么等也不会等出来。RFC 5072 把 IPv6CP 定位为在其他 IPv6 协议于链路上工作之前运行的配置步骤,这就是它的全部范围:准备链路,而不是给网络编号。把前缀给上,接口才会开始承载流量,而不是仅仅存在。
路由器通告在局域网上是常见答案,在点到点隧道上却不太可靠,因为客户端既要发请求,又要接受应答。有些隧道客户端两样都不做。在决定服务器应该发送之前,先确认客户端愿意接受什么。
同一个前缀还必须从另一端能够到达。持有全局地址却没有回程路径的客户端,只是配置好了,并没有连通。
路由是另一个承诺
即便有了地址,客户端也需要知道哪些目的地属于隧道,服务器则需要为这些目的地准备回程路径。这是两个地方做出的两个决定。承载全部 IPv6 流量的隧道,需要客户端有默认路由、服务器有回程路由;分流隧道则要求两端就同一份前缀清单达成一致。两者不一致时,流量出去就再也回不来。
在动手配置之前先把清单写下来。如果方案说只有公司前缀走隧道,那么客户端就不该有默认 IPv6 路由,服务器也不该通告一条。
剩下的由客户端集成决定
有些隧道客户端会显式配置 IPv6。例如 Apple 的 Network Extension 会为隧道接收地址、前缀和一组路由,因此使用它的应用不会等待以太网式的通告。另一些则依赖从链路上到达的路由器通告。两种模型都成立,但它们需要不同的服务器行为,所以选错就会得到一个永远等待没人发送的消息的客户端。改服务器之前先确认模型。
像 ppp0 这样的旧接口名,并不能证明今天运行的协议栈。现代客户端可能使用数据包隧道 API,而不是 PPP 接口;假设它仍像历史连接那样工作,正是把可用设计弄坏的方式。要问客户端版本和配置下发方式,而不是接口名。
写出客户端需要的方案
完整的描述涵盖三件事:客户端持有什么地址、隧道应该承载哪些目的地、网络如何把应答送回来。链路本地地址对这三者一个都答不上,一条被接受的通告也只回答其中一个的一部分。要逐项检查,而不是接受一个绿色指示。然后把每个答案由哪种机制提供记录下来,因为这份记录会让下一次 IPv6 报告变成两分钟的核查。
把记录和服务文档放在一起,并在客户端变化时更新。对 PPP 客户端正确的方案,对同一服务上的数据包隧道客户端可能就是错的。四个问题始终不变,变的只是答案。