最近把BGP实验从头到尾又刷了一遍,从AS之间的邻居建立,到路由聚合、路由反射器,再到容器网络里Calico的BGP会话排查,一圈下来最大的感受是:BGP这个协议本身不难,难的是把每个环节的“为什么”想清楚。很多人把邻居配出来、路由也通了,就觉得会了,但一旦遇到聚合路由黑洞、RR反射不出来、peer状态始终为0这种问题,马上卡住。这篇文章把我这次实验的完整过程、踩过的坑、以及排查思路写下来,给准备做BGP实验或者正在被BGP折腾的人一个参照。
实验环境我用的是华为eNSP模拟器,设备选AR2220,系统版本是VRP8。拓扑里覆盖了EBGP、IBGP、network宣告、聚合路由、BGP路由反射器这几个最常见的考点。不夸张地说,把这张拓扑吃透,BGP的日常配置和排错基本就过关了。
1. 实验拓扑与地址规划:先把环境搭明白
做BGP实验最忌讳的事情,不是命令记不住,而是拓扑和地址规划一塌糊涂。很多人在实验里配来配去发现路由不通,最后查了半天,发现是接口IP敲错了或者对端AS号抄错了。所以这一节先把环境彻底交代清楚。
1.1 实验拓扑与设备角色划分
这次的拓扑一共六台路由器,跨三个AS。
code复制AS 100 AS 200 AS 300
R1 --------------- R2 ---------------- R3 ---------------- R4
| | \
| R5 R6
- R1属于AS 100,模拟客户侧设备,后面挂三个业务网段。
- R2和R3都属于AS 200,R2是AS 200的入口边界,R3是AS 200的出口边界,两者之间跑IBGP。
- R4、R5、R6都属于AS 300,其中R4是IBGP核心节点,R5和R6是它的客户机,用于做路由反射器实验。
R1和R2之间是EBGP,R3和R4之间是EBGP,R2和R3之间是IBGP,R4与R5、R4与R6之间也是IBGP。这样设计的用意很明显:EBGP跨AS建立,IBGP在AS内部建立,两种关键会话类型都能练到;同时R2和R3这一对IBGP还能顺便验证路由聚合,R4、R5、R6这一组能验证反射器。
R2和R3之间、R4和R5/R6之间的内部互通,我用OSPF做底层IGP。原因是IBGP会话建议用Loopback接口建立,而Loopback接口之间的可达性靠IGP来保证。这个选择不是强迫症,是为了模拟真实网络里的稳定性需求,后面细说。
1.2 地址规划背后的小心思
地址规划这里有一点经验想分享:互联地址尽量用10.0.x.y/24这种一眼能看出对端的格式,Loopback地址则直接和路由器编号挂钩。别看只是命名习惯,排错的时候能省大量时间。
| 设备 | AS号 | Loopback0 | 接口与地址 | 对端 |
|---|---|---|---|---|
| R1 | 100 | 1.1.1.1/32 | G0/0/0: 10.0.12.1/24 | R2 G0/0/0 |
| R2 | 200 | 2.2.2.2/32 | G0/0/0: 10.0.12.2/24;G0/0/1: 10.0.23.2/24 | R1 G0/0/0;R3 G0/0/0 |
| R3 | 200 | 3.3.3.3/32 | G0/0/0: 10.0.23.3/24;G0/0/1: 10.0.34.3/24 | R2 G0/0/1;R4 G0/0/0 |
| R4 | 300 | 4.4.4.4/32 | G0/0/0: 10.0.34.4/24;G0/0/1: 10.0.45.4/24;G0/0/2: 10.0.46.4/24 | R3 G0/0/1;R5 G0/0/0;R6 G0/0/0 |
| R5 | 300 | 5.5.5.5/32 | G0/0/0: 10.0.45.5/24 | R4 G0/0/1 |
| R6 | 300 | 6.6.6.6/32 | G0/0/0: 10.0.46.6/24 | R4 G0/0/2 |
业务网段放在R1上,用三个Loopback接口模拟:
- Loopback1: 11.1.1.0/24
- Loopback2: 11.1.2.0/24
- Loopback3: 11.1.3.0/24
R5上再额外配一个Loopback1 172.16.5.0/24,R6上配Loopback1 172.16.6.0/24,方便反射器实验里观察路由反射效果。
1.3 基础配置:接口、环回与OSPF
先把接口地址和环回地址配完。以R2为例:
code复制<R2> system-view
[R2] interface GigabitEthernet0/0/0
[R2-GigabitEthernet0/0/0] ip address 10.0.12.2 24
[R2-GigabitEthernet0/0/0] quit
[R2] interface GigabitEthernet0/0/1
[R2-GigabitEthernet0/0/1] ip address 10.0.23.2 24
[R2-GigabitEthernet0/0/1] quit
[R2] interface LoopBack0
[R2-LoopBack0] ip address 2.2.2.2 32
[R2-LoopBack0] quit
其它设备完全同理,把表里的地址填进去就行。
然后配置OSPF。AS 200内R2和R3要互通Loopback,AS 300内R4、R5、R6要互通Loopback。以R2为例:
code复制[R2] ospf 1 router-id 2.2.2.2
[R2-ospf-1] area 0
[R2-ospf-1-area-0.0.0.0] network 10.0.23.0 0.0.0.255
[R2-ospf-1-area-0.0.0.0] network 2.2.2.2 0.0.0.0
[R2-ospf-1-area-0.0.0.0] quit
[R2-ospf-1] quit
AS 300内类似,把R4、R5、R6的Loopback和互联网段宣告进OSPF即可。这一步做完,用ping验证一下Loopback互通,不要带着网络不通去配BGP,否则后面出现任何问题你都无法判断是IGP的问题还是BGP的问题。
提示:IBGP用Loopback建会话,而不是物理接口地址,是因为Loopback接口只要路由器还在就会一直存在,物理链路断了只要还有其它路径,会话就不受影响。这是生产环境里惯用的做法。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. EBGP邻居建立与network宣告:实验里最容易被绊倒的环节
环境搭完后,第一个真正考验人的环节来了。EBGP邻居建立看似简单,但华为VRP上有一个特别容易坑人的地方:地址族激活。
2.1 最小化EBGP配置与激活地址族
先看R1和R2之间的EBGP配置。R1的BGP进程是AS 100,对端R2属于AS 200。
code复制[R1] bgp 100
[R1-bgp] router-id 1.1.1.1
[R1-bgp] peer 10.0.12.2 as-number 200
[R1-bgp] ipv4-family unicast
[R1-bgp-af-ipv4] peer 10.0.12.2 enable
[R1-bgp-af-ipv4] quit
[R1-bgp] quit
R2上同理:
code复制[R2] bgp 200
[R2-bgp] router-id 2.2.2.2
[R2-bgp] peer 10.0.12.1 as-number 100
[R2-bgp] ipv4-family unicast
[R2-bgp-af-ipv4] peer 10.0.12.1 enable
[R2-bgp-af-ipv4] quit
[R2-bgp] quit
配置完成后,用命令查看邻居状态:
code复制[R1] display bgp peer
BGP local router ID : 1.1.1.1
Local AS number : 100
...
Peer AS MsgRcvd MsgSent OutQ Up/Down State
10.0.12.2 200 10 10 0 00:03:42 Established
看到Established,说明邻居已经起来。如果还没起来,不要急着改配置,先看下一节的状态机排查。
这里要特别提醒:在华为VRP8版本里,配完peer之后默认可能不会自动激活到IPv4单播地址族,尤其是老版本VRP5上更加明显。所以建议在ipv4-family unicast视图下显式执行peer x.x.x.x enable。很多人在eNSP里明明配了peer,状态却一直卡在Active,就是这个原因造成的。
R2和R3之间的IBGP会话是同一套逻辑,只不过AS号相同,且建议用Loopback地址。配置如下:
code复制[R2] bgp 200
[R2-bgp] router-id 2.2.2.2
[R2-bgp] peer 3.3.3.3 as-number 200
[R2-bgp] peer 3.3.3.3 connect-interface LoopBack0
[R2-bgp] ipv4-family unicast
[R2-bgp-af-ipv4] peer 3.3.3.3 enable
R3上对称配置。connect-interface这一条很重要,它告诉设备发BGP报文时用Loopback0作为源地址。如果漏掉,设备会选择去往3.3.3.3的出接口地址作为源,对端一看源地址不是2.2.2.2,直接拒绝。
2.2 network宣告的“精确匹配”陷阱
邻居建立只是起点,真正干活的是路由通告。BGP通告路由的方式有两种,network和import-route。实验里最经典的就是network宣告。
我见过太多人第一次配network的时候,以为它就是“把接口网段宣告出去”,结果配置如下:
code复制[R1-bgp-af-ipv4] network 11.1.1.0 24
然后邻居那边一条路由都收不到。
原因在于BGP的network不是“宣告接口”,而是“宣告一条与IP路由表精确匹配的路由”。也就是说,R1的IP路由表里必须存在11.1.1.0/24这条路由,BGP的network命令才会生效。
那这个条件满足吗?满足。因为11.1.1.0/24是Loopback1的直连路由,IP路由表里天然存在。所以上面这条network本身是没有问题的,能成功。
但如果换成下面这种就不行了:
code复制[R1-bgp-af-ipv4] network 11.1.0.0 16
这条命令会失败,因为R1的IP路由表里没有11.1.0.0/16,哪怕它有11.1.1.0/24、11.1.2.0/24、11.1.3.0/24三条明细,BGP也不会自动帮你聚合。如果你想通过network发布聚合路由,必须先手工写一条静态路由,让IP路由表里有这条聚合路由,后面第3章细说。
正确的宣告方式是把三个业务网段都写进去:
code复制[R1] bgp 100
[R1-bgp] ipv4-family unicast
[R1-bgp-af-ipv4] network 11.1.1.0 24
[R1-bgp-af-ipv4] network 11.1.2.0 24
[R1-bgp-af-ipv4] network 11.1.3.0 24
然后在R2上看BGP路由表,应该能看到三条11.1.x.0/24,下一跳是10.0.12.1。
code复制[R2] display bgp routing-table
BGP Local router ID is 2.2.2.2
Status codes: * - valid, > - active, # - not got to best
Origin codes: i - IGP, e - EGP, ? - incomplete
Total Number of Routes: 3
Network NextHop MED LocPrf PrefVal Path/Ogn
*> 11.1.1.0/24 10.0.12.1 0 100 0 100i
*> 11.1.2.0/24 10.0.12.1 0 100 0 100i
*> 11.1.3.0/24 10.0.12.1 0 100 0 100i
Path/Ogn列显示的100i,说明是来自AS 100的IGP路由。看到这里,邻居和路由通告才算真正打通。
2.3 邻居状态卡住时的排查顺序
如果邻居状态一直不是Established,别慌,按顺序查。
BGP状态机大致是Idle、Connect、Active、OpenSent、OpenConfirm、Established。大多数实验环境里,你只需要关心两个异常状态:
- 状态一直停留在Active或Connect:说明TCP连接没有建立成功。可能原因包括IP地址写错、路由不可达、接口down、ACL过滤了TCP 179端口。
- 状态在OpenSent或OpenConfirm反复跳变:说明TCP通了,但BGP参数协商不过去。最常见的原因是AS号配错、Router-ID冲突、认证失败。
排查时先看对端能不能ping通:
code复制[R1] ping 10.0.12.2
ping通了之后再查看详细的邻居信息:
code复制[R1] display bgp peer verbose
这个命令能看到详细的BGP状态、Keepalive间隔、允许的AS号范围等。如果觉得信息太多,可以直接看错误计数:
code复制[R1] display bgp peer error
这个命令会列出BGP会话断开的原因,比如“Connection Rejected”“Open Error”等。有一次我在实验里把R3的对端AS号写成了300,R3和R4都是300,结果R3和R4之间无论如何都建立不起来,display bgp peer error里明确显示Open Error,一看AS号果然写错了。这种问题靠看配置很难发现,但查error基本一眼就定位。
还有一个小坑:EBGP如果使用Loopback地址建会话,默认TTL是1,数据包过去会被对端丢弃。要么用直连地址建EBGP,要么手动增加ebgp-max-hop。实验里EBGP我全部用直连地址,绕开这个坑,但生产环境里如果遇到EBGP邻居起不来,要想到这一层。
3. 聚合路由指向null 0:一个网段一个坑,一条静态路由解掉
路由能通之后,下一步就是做聚合。这是BGP实验里最值得深挖的一个场景,同时也是网上搜索热度很高的关键词“bgp聚合路由指向null 0”的出处。这个知识点不搞懂,环境越大越吃亏。
