下一代网际协议IPv6,是IPv4的增强版本,提供改进的地址空间、配置、维护和安全功能,支持更多的用户和设备接入互联网。
虚拟专用网络是由共享的链路或公网(如因特网)组成的专用私有网络的扩展,使用户在两个不同地域的计算机通过穿越共享链路或公网互通数据。
IPv6 层3隧道与IPv4 层3隧道的区别是IPv6 层3隧道中PE从CE接收到的是IPv6报文,IPv4 层3隧道中PE从CE接收到的是IPv4报文。
BGP/MPLS IPv6 层3隧道组网方案包括两种:
- IPv6 层3隧道业务由服务提供商的IPv4骨干网来实现,此种方案又被称为6VPE方案。
- IPv6 层3隧道业务由服务提供商的IPv6骨干网来实现。
当前仅支持6VPE方案。这种情况下,骨干网是IPv4网络,客户站点是IPv6地址族,PE应支持IPv4和IPv6(双协议栈),如下图。CE和PE设备之间的连接使用可承载IPv6流量的任意网络协议。PE在连接客户端的接口上使用IPv6,在连接公网的接口使用IPv4。
在提供IPv6 层3隧道服务的同时,PE和PE之间的运营商骨干网仍然运行IPv4协议。这样,可以使运营商网络逐步从IPv4过渡到IPv6。
在骨干网络是IPv4的情况下,PE之间使用IPv4地址建立层3隧道v6邻居,传递层3隧道IPv6路由,层3隧道IPv6路由可以选择骨干网中的IPv4隧道来承载IPv6 层3隧道业务。在骨干网络是IPv6的情况下,PE之间使用IPv6地址建立层3隧道v6邻居,传递层3隧道-IPv6路由,层3隧道v6路由可以选择骨干网中的IPv6隧道承载层3隧道 VPN业务。
本次实验讲解的拓扑图如下图所示:
- CE与PE之间使用IPv6 EBGP交换路由信息。
- PE之间采用OSPF作为IGP实现PE的互通,配置LDP打通 MPLS
- PE之间配置MP-IBGP交换层3隧道v6路由信息。
本次实验讲解的拓扑图如下图所示:
CE2的配置如下,本次我们从CE2配置network 3::3/128 开始整个报文处理的流程。
CE2配置了network命令后,会构造一个IPV6 unicast的UPDATE报文,我们抓包看下:
我们会发现IPV6的UPDATE报文是封装在MP_REACH_NLRI里面的,和IPV4 unicast是不一样的。
PE2的配置如下:
注意此时IPV6 层3隧道 地址族下的neighbor 用的是IPV4地址建立的邻居,RT、RD配置在vrf下的ipv6 unicast下面的。
PE2 收到UPDATE报文后的处理和前面讲解UPDATE的报文一样的不在说明,这里说明下不一样的处理。
PE2处理
解析路径属性
bgp_process_packet
--bgp_update_receive
--bgp_attr_parse
--bgp_mp_reach_parse
bgp_mp_reach_parse解析MP_REACH_NLRI,此时UPDATE报文里面的NHLEN是32字节,一个是IPV6的global地址,一个是link local地址,可以参看前面的报文,解析出来后,存放在attr属性的mp_nexthop_global、mp_nexthop_local 以便后面使用。
处理NLRI
处理NLRI的内容和前面文章分析的一样,本次update结果会生成3份路由:
- 在bgp 的vrf 1路由表里面生成IPV6 3::3的路由,然后在通告给peer(2001:3::2)又发给了对端?
show ip bgp vrf 1 ipv6
Network Next Hop Metric LocPrf Weight Path
*> 3::3/128 fe80::5054:ff:fe57:53c0
0 0 65300 i
- 然后在通告给zebra,zebra里面的处理和前面的分析也差不多,然后在zebra的vrf 1路由表里面生成3::3的路由
show ipv6 route vrf 1
VRF 1:
B>* 3::3/128 [20/0] via fe80::5054:ff:fe57:53c0, ens6, 02:32:21
C>* 2001:3::/64 is directly connected, ens6, 1d21h12m
C>* fe80::/64 is directly connected, ens6, 1d21h12m
K>* ff00::/8 [0/256] is directly connected, ens6, 1d21h12m
- 然后在导入到层3隧道 里面,生成层3隧道 路由,然后在UPDATE出去,这个我们在leak-vrf-to-vpn讲解
show ip bgp ipv6 层3隧道
Network Next Hop Metric LocPrf Weight Path
Route Distinguisher: 100:1
*> 3::3/128 2001:3::2@9< 0 0 65300 i
UN=2001:3::2 EC{100:1} label=16 type=bgp, subtype=5
Displayed 1 routes and 1 total paths
大概总结下处理的debug+结果+函数调用如下:
前面没有说明bgp_find_or_add_nexthop函数,这里重点补充下
Nexthop valid
bgp_find_or_add_nexthop 函数引入了一个新的数据结构struct bgp_nexthop_cache
然后会使用nexthop构建前缀,在nexthop_cache_table缓存的table里面查找,如果没有会创建struct bgp_nexthop_cache,并存放在path里面,同样bnc里面会记录path信息,同时调用register_zebra_rnh向zebra注册nh,然后返回nexthop的有效性,其实有效性的检查是在zebra接收到register_zebra_rnh发送的消息后处理的,这块的分析,后面再这里继续补充。
这个数据保存后具体的作用??还不太明白
LEAK-VRF-TO-层3隧道
Vrf的路由导入到层3隧道 的处理函数如下,其调用关系如下图,这里也能说明BGP 路由的来源。
我们分段来详细过下这个函数。