MPLS VPN 中的 IPv6:三个选择,而非一个地址族
客户 VPN 路由、PE 之间的 BGP 会话和核心传输是三个分开的决策。一条会话可以用一个地址族运行,却承载另一个地址族的内容。
在设计评审上说“在 IPv6 BGP 上跑一个 IPv6 L3VPN”,这一句话里就藏着三个彼此独立的决策。哪些前缀属于客户的 VPN、哪些地址承载两台 PE 之间的路由会话、哪张核心网络搬运带标签的报文,是三件互不相干的选择。它们可以全是 IPv6,可以混用,而且混用是被有意允许的。正是把这三件事拆开,才让一个含糊的需求变成平台可以对照测试的东西。
把三件事分开
第一件事是客户路由:属于某一个 VPN 路由上下文、并且必须留在其他所有上下文之外的 IPv6 前缀。第二件是交换这些前缀的 PE 路由器之间的路由连接。第三件是把带标签的客户报文穿过核心送到远端边缘的传输。只点出其中一件,还称不上设计。
| Job | The question it answers | What confusion looks like |
|---|---|---|
| Customer VPN routes | Which IPv6 prefixes belong to each VPN context, and how are they kept apart? | Prefixes leak into the global table and between customers |
| PE-to-PE BGP session | Which addresses carry the routing connection between the two edges? | A session-family mismatch gets chased as a core transport fault |
| Transport to the remote PE | How does the chosen core move the labelled packet to the far edge? | A route is present and unforwardable in the same moment |
每件事都有自己的地址族、自己的故障模式,往往还有自己的团队。表格之所以有用,正是因为设计文档里的一句话常常把三行压成一行。
路由所属的地址族是 VPN-IPv6,而不是 IPv6 单播
RFC 4659 定义了 BGP/MPLS IPv6 VPN 地址族,而加入它的条件比“IPv6”这个词所暗示的更具体。那里的路由是一个路由区分符加一个 IPv6 前缀,在 AFI 2 和 SAFI 128 下编码。普通的 IPv6 单播是另一个地址族,所以在一台 looking glass 上看起来像前缀的通告,可能根本不是同一个对象。把地址族读错,是这套设计出错的第一种方式。
差别要到边缘上才咬人:路由必须先落进正确的 VPN 上下文,之后才谈得上做任何事。收到前缀只能证明交换发生过,对是否安装只字未提。正是这道缝,造就了那句经典的汇报:会话是通的,客户却仍然是黑的。
会话可以跑在与 VPN 不同的地址族上
没有任何规定强迫两台边缘之间的 BGP 连接使用 VPN 自己的地址族。规范允许 IPv4 或 IPv6 会话,而 IPv6 VPN 传输本身就定义在两类核心之上。所以一条 IPv6 会话既不能说明它承载的东西属于哪个地址族,也不负责挑选数据平面。这是三个彼此独立的位,设计应当把三位分开保管。
这既让人松一口气,也极容易在同一口气里读错。IPv6 客户路由可以跑在 IPv4 地址的会话上,IPv4 路由也可以跑在 IPv6 会话上,前提是平台支持这种组合,并且下一跳能够解析。不能发生的事情,是让会话去暗示载荷属于哪个地址族,无论在设计的文档里,还是在日后用来证明服务的监控里。
IPv4 核心上的下一跳有它自己的编码
当 VPN 下面的核心是 IPv4 时,路由不会带着一个入口边缘能直接使用的下一跳出现。它以映射到 IPv4 的 IPv6 形式到达,而规范在下方传输是 IPv4 时正是这样表达出口边缘。接下来入口路由器必须把这个映射地址变成它真正能穿过核心到达的东西,而解析正是那个悄悄失败的步骤。
要把它读成一条转发依赖,而不是一串在设备之间复制粘贴的字符。在真正运行的平台上确认三件事:通告的下一跳能解析成可用的路径,标签栈被接受,目的地落进预期的 VPN 上下文。其中任何一件失败,留下来的都是一条看起来很健康、却什么都不转发的会话,所以这项检查属于验收流程,而不属于日后的事故复盘。
把需求写成四行
值得测试的需求会点名四件事:VPN 的地址族、会话的传输、下一跳的编码和核心的排布。然后点名一个客户前缀,从头到尾跟到底:经过交换、安装、标签解析和回程路径。“支持 IPv6 BGP”这几个字一件都没有覆盖,还把不匹配真正藏在哪里遮住了。
没有 VPN-IPv6 交换的健康会话是不完整的,收到 VPN 路由却没有可用转发同样不完整。把这两条作为独立的验收条目留着,下一次排障对话就会很短,因为失败的那一条早就写在纸上了。