添加路由反射器后部分 L2VPN 路由消失
会话保持在线,但少数 L2VPN 路由始终不到达。被复用的集群 ID、客户端关系和反射图解释了这种选择性丢失。
会话保持在线,IGP 稳定,然而四条提供商边缘中有两条上始终看不到少数 L2VPN 路由。这种模式属于反射问题而不是传输问题,因为会话损坏会整体失败,而被复用的反射边界只会选择性失败。物理环路与此无关;那些路由停下的位置是逻辑分发图。找到这一点并不需要重建控制平面。
丢失是选择性的,这缩小了排查范围
物理环路中的四条提供商边缘要组成全互联需要六条逻辑会话,因为每台路由器都要与另外三台配对。这些会话跑在路由化的传输之上,所以布线无法说明存在多少邻接关系、其中哪一个做反射。当两条边缘漏掉某一组前缀而其余一切照常收敛时,线缆并不是嫌疑对象。
选择性丢失指向环路防护、策略或关系方向,即部分路由越过边界,而另一部分在途中被丢弃。完全丢失指向会话或地址族。判断自己面对的是哪一种,是第一个有用的步骤,而且只需一条命令。
反射究竟改变了什么
路由反射放宽了 iBGP 发言者不得重新通告从另一 iBGP 发言者学到的路由这一规则。RFC 4456 通过发言者与路由来源之间的关系来表达这一例外,而这个关系的方向比大多数摘要所暗示的更重要。从客户端学到的路由可以反射给其他客户端和非客户端,而从非客户端学到的路由只能反射给客户端。这个不对称要读两遍,因为它解释了新增一条客户端关系如何可能掩盖设计错误:它打开了一条拓扑从未设想的路径。
CLUSTER_LIST 属性记录反射历史,反射器若在该列表中发现自己的集群 ID,就必须忽略这条通告。这就是环路防护,也是标识符被意外复用时删除路由的机制。ORIGINATOR_ID 起着相关作用,它指明最初通告该路由的路由器。
被复用的集群 ID 正是路由消失的方式
小型网络容易走捷径:给每台路由器一个等于其 loopback 的集群 ID,之后再加一台反射器,并因为顺手而复用已有的 loopback。如果这个标识符现在出现在两个独立的反射阶段,第二阶段就会在 CLUSTER_LIST 中看到自己的 ID 并丢弃该路由。没有任何日志记录错误,因为丢弃正是对环路的正确响应。
服务同一集群的冗余反射器是正当例外:它们有意共享同一个 ID,以便任一台都能服务相同的客户端。标识符必须与反射设计相匹配,而不是用来区分机箱名称。
在动手改任何配置之前先画出预期的图:谁产生前缀、哪条客户端关系允许第一次反射、哪台反射器把它带到下一阶段、最后一个客户端在哪里。图中的每一跳都是复用标识符、缺失的客户端关系或策略过滤器可能拦截路由的位置。图画出来之后,缺失的路由就有了位置,而不是一团谜。
抵制把每个邻居都变成客户端的冲动
对缺失路由的快速修复是把每个邻居都变成每台反射器的客户端。传播恢复了,但设计也不再告诉你任何东西:它放大了每台发言者承载的路由数量,同时掩盖了本该由哪条关系来完成工作。
小型网络通常需要两种形态之一。全互联 iBGP 是四台路由器的六条会话、完全不用反射;指定一对反射器服务其余边缘则是另一种。两者都比每台路由器各反射一点的部分互联更容易推演。按规模和故障行为来选形态,而不是按布线图。
先检查地址族,再归咎于反射
端口 179 上的 TCP 会话只能证明两台发言者可以通话,完全不能说明 VPN 地址族是否交换过哪怕一条路由。先确认会话状态,再确认地址族,最后确认单条前缀。
vtysh -c "show bgp summary"
vtysh -c "show bgp l2vpn evpn summary"
vtysh -c "show bgp l2vpn evpn"
这三种输出把邻接问题、交换问题和前缀缺失问题区分开来。如果地址族完全不显示前缀,就先检查邻居的激活状态和导出策略,再看反射。如果前缀在一条边缘出现而在另一条没有,就比较接收侧的集群列表和 originator,然后按上一节的图去走。
把下一跳可达性和转发状态排除在这项检查之外。带有不可达下一跳的反射路由是存在但不可用的,看起来像反射故障,直到你去看下一跳那一列。先解决下一跳,确认转发表项,然后才判断分发图是否需要再加一台反射器。