先聊个现象。很多人一开始接触BGP,第一反应是去eNSP里照着题库敲命令:配置peer、敲network、看邻居状态变成Established,然后感觉自己“会了”。但真到了生产环境,会遇到完全不同的BGP——不是数通设备上的命令行,而是容器网络里Calico打印出来的一行日志:number of node(s) with bgp peering established = 0 calico/node is not ready: BIRD is not ready。那一刻你会意识到,实验题里学的是BGP的“骨架”,生产环境里看到的是同一套协议的“另一种形态”。
这篇内容就是把两条线的排查经验放到一起做的记录。一方面,我会用eNSP把一个比较典型的BGP综合实验从头到尾搭完,从AS规划、IGP设计、IBGP会话、eBGP邻居到路由反射器全部串起来;另一方面,我会把Calico报“BGP peering established = 0”时的排查链路梳理出来。你会发现,两者需要解决的问题本质上是同一件事:BGP邻居能不能起来,路由能不能正确传递,以及路径上哪一层配置出了问题。
1. 为什么同一个BGP,实验环境和生产环境会差这么多
1.1 学习BGP和排查BGP的人,搜的是同一个词
从网上这段时间的热搜词来看,搜“BGP”的人基本分成两类。第一类是在准备网络认证或者期末实验的,关键词多半是“ensp bgp”“bgp协议”“bgp路由反射器”,他们关心的是协议怎么配、RR怎么搭、邻居怎么建立。第二类是正在维护Kubernetes集群或者刚装完Calico的,关键词直接就是一大段报错——number of node(s) with bgp peering established = 0 calico/node is not ready。
这两类人看起来在做完全不同的事,但本质上都在跟BGP打交道。第一类在模拟器里验证协议逻辑,第二类在产品环境里面对协议的实现问题。问题在于,很多教程把这两件事割裂开了:学BGP的人只敲命令行,不关心容器网络里为什么也要用BGP;排障的人只盯着Calico的日志,却未必清楚BGP邻居建立需要满足哪些条件。卡壳的时候,两边都觉得对方的世界才是“真正的BGP”。
我的体会是,与其把这两套知识分开记,不如当成一个协议的两层实验来做。先通过模拟器把状态机、水平分割、路由反射器、下一跳可达性这些核心机制吃透,再去看Calico,很多报错其实是能直接“对号入座”的。
1.2 一个综合实验应该验证哪些机制
BGP不像OSPF那样,配置完接口宣告就能跑起来。它的知识链条长、环节多,任何一个节点出问题,表现都可能是“路由没学到”或者“邻居没建立”。综合实验的作用,就是把这根链条从头到尾拉通一遍。
我给自己定的目标是验证五个点。第一是eBGP邻居建立,也就是不同AS之间的路由器如何通过直连接口建立TCP 179会话。第二是IBGP邻居建立,
