跳到主要内容

3. VRF——PE 中的多张转发表

3. VRF:PE 中的多张转发表 (VRFs: Multiple Forwarding Tables in PEs)​

每个 PE 路由器都维护着若干张相互独立的转发表(forwarding table)。其中一张是"缺省转发表"(default forwarding table),其余的则是"VPN 路由与转发表"(VPN Routing and Forwarding table),或称"VRF"。

3.1. VRF 与连接电路 (VRFs and Attachment Circuits)​

每一个 PE/CE 连接电路都会通过配置与一个或更多 VRF 相关联。与一个 VRF 相关联的连接电路被称为"VRF 连接电路"(VRF attachment circuit)。

在最简单也最典型的情形下,一条 PE/CE 连接电路恰好与一个 VRF 相关联。当在一个特定连接电路上收到一个 IP 报文(packet)时,会依据其目的 IP 地址在该相关联的 VRF 中进行查表(lookup),查表结果决定了如何路由该报文。一个报文的入向 PE 为了路由该特定报文所使用的 VRF,被称为该报文的"入向 VRF"(ingress VRF)。(还有"出向 VRF"(egress VRF)的概念,位于报文的出向 PE 处,这将在第 5 节讨论。)

如果一个 IP 报文到达的连接电路未与任何 VRF 相关联,则该报文的目的地址将在缺省转发表中查表,并据此路由。按照缺省转发表转发的报文,包括来自相邻 P 或 PE 路由器的报文,以及来自尚未与 VRF 关联的、面向客户的连接电路的报文。

直观地说,可以把缺省转发表理解为包含"公网路由"(public route),而把 VRF 理解为包含"私网路由"(private route)。类似地,可将 VRF 连接电路视为"私有的",而将非 VRF 连接电路视为"公有的"。

如果某条特定的 VRF 连接电路将站点 S 连接到一个 PE 路由器,那么就可以通过控制写入相应 VRF 的路由集合来限制来自 S(经由该连接电路)的连通性。该 VRF 中的路由集合应被限定为指向那些与 S 至少共属一个 VPN 的站点的路由。这样,从 S 经一条 VRF 连接电路发出的报文,只有在其目的站点 S' 与 S 同属某个 VPN 时,才能被 PE 路由到该站点 S'。也就是说,任何两个没有共同 VPN 的 VPN 站点之间的通信(经由 PE 路由器)都会被阻止。VPN 站点与非 VPN 站点之间的通信,则通过将 VPN 站点的路由排除在缺省转发表之外来阻止。

如果存在多条从 S 通向一个或多个 PE 路由器的连接电路,那么就可能有多张 VRF 可被用来路由来自 S 的流量(traffic)。要恰当地限制 S 的连通性,相同的路由集合就必须存在于所有这些 VRF 中。反之,也可以对来自 S 的不同连接电路施加不同的连通性限制;在这种情况下,与 S 的连接电路相关联的某些 VRF 所含的路由集合,会与其他一些 VRF 不同。

我们也允许这样一种情形:单条连接电路与一个 VRF 集合相关联,而非与单一 VRF 关联。如果希望将单个 VPN 划分为若干个具有不同连通性限制的"子 VPN"(sub-VPN),并借助客户报文的某些特征来从中选择子 VPN,这种做法会很有用。不过为简洁起见,我们通常将一条连接电路描述为与单一 VRF 相关联。

3.2. 将 IP 报文与 VRF 关联 (Associating IP Packets with VRFs)​

当 PE 路由器从 CE 设备收到一个报文时,它必须确定该报文所经由的连接电路,因为这进而决定了可用于转发该报文的 VRF(或 VRF 集合)。一般而言,为了确定一个报文所经由的连接电路,PE 路由器会记录报文到达的物理接口(interface),并可能同时记录报文二层头部(layer 2 header)的某些特征。例如,若某个报文的入向连接电路是一条帧中继 VC,那么该连接电路的身份就可以通过报文到达的物理帧中继接口,连同报文帧中继头部中的数据链路连接标识符(Data Link Connection Identifier,简称 DLCI)字段来确定。

尽管 PE 关于"某个特定报文到达于某条特定连接电路"的结论可能部分地由报文的二层头部决定,但客户绝不可能通过改写头部字段来欺骗 SP,使其误以为一个在某条连接电路上收到的报文其实是经由另一条连接电路到达的。在上例中,虽然连接电路是部分地通过检查帧中继头部中的 DLCI 字段来确定的,但该字段并不能由客户随意设置,而必须由 SP 指定的取值,否则报文根本无法到达 PE 路由器。

在某些情况下,某个特定站点可能被客户划分为若干个"虚拟站点"(virtual site)。SP 可以指定一组特定的 VRF 用于路由来自该站点的报文,并允许客户设置报文的某些特征,以此来从这组 VRF 中选择特定的一个。

例如,每个虚拟站点都可以实现为一个 VLAN。SP 与客户可以约定:在来自某个特定 CE 的报文上,用某些 VLAN 取值来标识某些 VRF。当然,若来自该 CE 的报文携带了不在约定集合内的 VLAN 标签(tag)值,PE 就会将其丢弃。另一种实现方式是使用 IP 源地址(source address)。此时,PE 会结合报文自身的 IP 源地址以及报文到达的接口,将该报文指派给某个特定的 VRF。同样,客户只能从其所被允许使用的那组特定 VRF 中进行选择。

如果希望让某个特定主机(host)同时属于多个虚拟站点,那么该主机必须为每个报文确定该报文所关联的虚拟站点。例如,它可以通过在不同的 VLAN 上、或经由不同的网络接口,发送来自不同虚拟站点的报文来实现这一点。

3.3. 填充 VRF (Populating the VRFs)​

VRF 中应该填入怎样的路由集合?

举例来说,令 PE1、PE2、PE3 为三台 PE 路由器,CE1、CE2、CE3 为三台 CE 路由器。假设 PE1 从 CE1 处学到了在 CE1 站点可达的路由。如果 PE2 与 PE3 分别连接到 CE2 与 CE3,且存在一个包含 CE1、CE2、CE3 的 VPN V,那么 PE1 就使用 BGP 将他从 CE1 学到的路由分发给 PE2 和 PE3。PE2 和 PE3 用这些路由来填充它们分别与 CE2、CE3 的站点相关联的 VRF。不在 VPN V 中的站点的路由不会出现在这些 VRF 中,这意味着来自 CE2 或 CE3 的报文无法被发往不属于 VPN V 的站点。

当我们说 PE 从 CE"学习"(learn)路由时,并未预设任何特定的学习技术。PE 可以通过动态路由算法学习路由,也可以通过配置这些路由(即静态路由,static routing)来"学习"。(在后一种情况下,说 PE 从 CE"学习"了路由,或许多少有点修辞上的夸张。)

PE 还需要从其他 PE 处学习属于某个给定 VPN 的路由。用于以正确的路由集合填充 VRF 的过程,在第 4 节中规定。

如果存在多条从某个特定 PE 路由器通向某个特定站点的连接电路,它们可能全部映射到同一张转发表;但如果策略要求,它们也可以被映射到不同的转发表。例如,策略可能规定:来自某个站点的某条特定连接电路仅用于内部网流量,而来自该站点的另一条连接电路仅用于外部网流量。(例如,连接到外部网连接电路的 CE 是一台防火墙,而连接到内部网连接电路的 CE 则不是。)在这种情况下,这两条连接电路就会与不同的 VRF 相关联。

注意,如果两条连接电路与同一个 VRF 相关联,那么 PE 在其中一条上收到的报文,所能到达的目的地集合,与它在另一条上收到的报文完全相同。因此,除非两个 CE 恰好属于完全相同的 VPN 集合,否则两条连接电路不能与同一个 VRF 相关联。

如果一条连接电路通向一个属于多个 VPN 的站点,该连接电路仍可与单一 VRF 相关联,此时该 VRF 将包含该站点所属全部 VPN 的路由。