一、实验拓扑与背景介绍
最近在复习 BGP 多自治域组网,搭了一套包含 3 个 AS 的拓扑,目标是实现 AS100、AS200、AS300 的全网互通,同时在 AS200 内部通过 OSPF 实现 IGP 打通,让 iBGP 邻居能正常建立。
拓扑结构概览
表格
| 设备 | AS 号 | 关键接口与地址 |
|---|---|---|
| R1 | AS100 | GE0/0/0:12.1.1.1/24,LoopBack0:1.1.1.1/32 |
| R2 | AS200 | GE0/0/0:12.1.1.2/24,GE0/0/1:23.1.1.2/24,LoopBack0:2.2.2.2/32 |
| R3 | AS200 | GE0/0/0:23.1.1.3/24,GE0/0/1:34.1.1.3/24,LoopBack0:3.3.3.3/32 |
| R4 | AS200 | GE0/0/0:34.1.1.4/24,GE0/0/1:45.1.1.4/24,LoopBack0:4.4.4.4/32、LoopBack1:10.4.4.4/32 |
| R5 | AS300 | GE0/0/0:45.1.1.5/24,LoopBack0:5.5.5.5/32、LoopBack1:10.5.5.5/32 |
核心设计思路
- AS 间路由 :R1 与 R2 建立 eBGP 邻居,R4 与 R5 建立基于环回口的 eBGP 邻居(需要
ebgp-max-hop支持); - AS 内路由:AS200 内通过 OSPF 实现所有直连网段和环回口的 IGP 打通,同时把 BGP 路由引入 OSPF,保障内部路由可达;
- 默认路由兜底:R1 配置默认路由指向 R2,R5 配置默认路由指向 R4,保证非直连网段的流量转发。
二、初始配置与问题初现
按照拓扑完成所有基础配置后,发现了几个典型问题:
- R1 ping 不通 R5 的 5.5.5.5,也无法 ping 通 R4 的 4.4.4.4;
- R4 与 R5 的 BGP 邻居建立失败,一直处于 Idle/Connect 状态;
- AS200 内部 R2 无法 ping 通 R4 的 LoopBack0,iBGP 邻居虽然配置了,但状态异常。
三、分步排错与解决过程
1. 先解决 AS200 内部 OSPF 路由问题
首先排查 IGP,因为 iBGP 的建立依赖 AS 内路由可达。
- 检查 R3 的配置,发现 R3 的 OSPF 没有配置
router-id,虽然华为设备会自动选举,但还是建议手动配置,避免选举异常; - 检查 R2 的 OSPF 配置,
ospf 1 router-id 2.2.2.2下import-route bgp是正确的,但network命令没有宣告 GE0/0/0 的 12.1.1.2 网段?不,这里是对的,因为 12.1.1.0/24 是 AS 间链路,不需要在 OSPF 里宣告,R2 和 R1 建立 eBGP,只需要保证 R2 到 R4 的路由可达即可。 - 关键问题:R4 的 OSPF 配置中,
network 45.1.1.4 0.0.0.0宣告了,但 R3 和 R4 的 OSPF 邻居已经建立,但 R4 的 LoopBack0 4.4.4.4 在 R2 的路由表中是否存在?排查发现 R3 的 OSPF 配置中,ospf 1没有配置router-id,而且 R4 的 OSPF 配置中,import-route bgp已经配置,但 R2 和 R4 的 iBGP 邻居是否正常?
2. 解决 R2 与 R4 的 iBGP 邻居问题
R2 配置了peer 4.4.4.4 as-number 200,connect-interface LoopBack0,R4 也配置了peer 2.2.2.2 as-number 200,connect-interface LoopBack0,但邻居一直无法建立。
- 第一步:检查 R2 到 4.4.4.4 的路由,
display ip routing-table 4.4.4.4,发现 R2 通过 OSPF 学到了 4.4.4.4/32,下一跳是 23.1.1.3(R3),路由是通的; - 第二步:检查 BGP 的
peer 4.4.4.4 enable是否配置,两边都配置了,没问题; - 第三步:检查 R2 的 BGP 配置,
peer 4.4.4.4 next-hop-local,这个配置是正确的,用来把 eBGP 路由的下一跳改为自己,发给 iBGP 邻居; - 关键问题:R4 的 OSPF 配置中,
import-route bgp是正确的,但 R2 的 BGP 配置中,network 1.1.1.1 255.255.255.255是 R1 的路由,R2 从 R1 学到后,会通过 iBGP 发给 R4,R4 会收到,但是 R4 的 OSPF 引入 BGP,会把这些路由发布到 AS200 内部,R2 也会收到,不影响,但问题不在这; - 最终发现:R3 的 OSPF 配置中,没有宣告
34.1.1.3?不,配置里写了network 34.1.1.3 0.0.0.0,是对的。哦,原来 R2 和 R4 的 iBGP 邻居是建立成功的,只是因为没有收到足够的路由,一开始误以为不通,实际是 R1 的路由在 R4 的 BGP 表中,只是需要确认。
3. 解决 R4 与 R5 的 eBGP 邻居问题
R4 配置了peer 10.5.5.5 as-number 300,connect-interface LoopBack1,ebgp-max-hop 255;R5 配置了peer 10.4.4.4 as-number 200,connect-interface LoopBack1,ebgp-max-hop 2,但邻居一直无法建立。
- 第一步:检查 R4 到 10.5.5.5 的路由,R4 配置了
ip route-static 10.5.5.5 255.255.255.255 45.1.1.5,R5 配置了ip route-static 10.4.4.4 255.255.255.255 45.1.1.4,静态路由是双向的,ping 一下:R4 ping 10.5.5.5,发现是通的,说明底层 IP 可达; - 第二步:检查 BGP 配置,两边的
peer x.x.x.x enable都配置了,没问题; - 第三步:检查
ebgp-max-hop,R4 配置了 255,足够大,R5 配置了 2,也足够,因为两个环回口之间只经过一跳物理链路,TTL 减 1,所以没问题; - 关键问题:R5 的 BGP 配置中,
peer 10.4.4.4 as-number 200,这里的 AS 号写对了吗?R4 在 AS200,所以是对的;R4 的peer 10.5.5.5 as-number 300也是对的; - 哦!发现了!R4 的 LoopBack1 地址是 10.4.4.4/32,R5 的 LoopBack1 地址是 10.5.5.5/32,R4 的静态路由是
10.5.5.5/32 45.1.1.5,R5 的静态路由是10.4.4.4/32 45.1.1.4,是对的。那为什么邻居建立不了?排查 BGP 的 debug 信息,发现 R4 发送的 BGP 报文,源地址是 LoopBack1 的 10.4.4.4,目的地址是 10.5.5.5,R5 收到后,会检查是否配置了peer 10.4.4.4,R5 确实配置了,那为什么?哦!R5 的peer 10.4.4.4 as-number 200,R4 的 BGP 进程号是 200,是对的,但是 R5 的 BGP 配置中,ipv4-family unicast下,peer 10.4.4.4 enable是配置了的,没问题。最后发现:R4 的peer 10.5.5.5 connect-interface LoopBack1,配置正确;R5 的peer 10.4.4.4 connect-interface LoopBack1,也正确。原来只是因为实验环境中设备反应慢,多等了一会,邻居就建立起来了,属于 "假故障"。
4. 解决全网互通问题
邻居都建立后,发现 R1 ping 不通 R5 的 5.5.5.5,排查路由:
- R1 的路由表:默认路由指向 12.1.1.2(R2),BGP 学到了 R2 发来的路由,包括 R5 的 5.5.5.5;
- R2 的路由表:BGP 学到了 R1 的 1.1.1.1 和 R4 发来的 R5 的 5.5.5.5,同时 OSPF 学到了 R4 的路由;
- R4 的路由表:BGP 学到了 R2 发来的 R1 的 1.1.1.1 和 R5 的 5.5.5.5,OSPF 学到了 AS200 内的所有路由;
- R5 的路由表:默认路由指向 45.1.1.4(R4),BGP 学到了 R4 发来的 R1 的 1.1.1.1;
- 关键问题:R2 向 R1 发送 BGP 路由时,下一跳是自己,R1 收到后,会把下一跳设为 12.1.1.2,所以 R1 访问 5.5.5.5 时,会发给 R2,R2 发给 R4,R4 发给 R5,R5 返回时,根据默认路由发给 R4,R4 再发给 R2,R2 发给 R1,理论上是通的。但实际 ping 不通,排查发现 R1 的 BGP 配置中,
network 1.1.1.1 255.255.255.255是正确的,R1 把自己的环回口宣告进 BGP,R2 收到后,会通过 iBGP 发给 R4,R4 发给 R5,R5 的路由表中会有 1.1.1.1 的 BGP 路由,下一跳是 10.4.4.4(R4 的 LoopBack1),R5 的静态路由里有 10.4.4.4/32 指向 45.1.1.4,所以路由是通的。最后发现是 R1 的默认路由配置正确,但 ping 的时候,R5 的返回流量,R4 发给 R2,R2 发给 R1,R1 收到后,会回复,只是因为实验中设备的 ARP 缓存问题,清一下 ARP 缓存就通了。
四、关键配置与避坑总结
1. iBGP 邻居基于环回口建立的注意事项
- 必须保证 AS 内 IGP(OSPF/IS-IS)能学到环回口的路由,R2 和 R4 的环回口都要宣告进 OSPF;
- 必须配置
peer x.x.x.x connect-interface LoopBack0,让 BGP 报文的源地址为环回口地址; - 必须配置
peer x.x.x.x next-hop-local,R2 把从 R1 学到的 eBGP 路由发给 R4 时,下一跳改为自己,否则 R4 收到的路由下一跳是 R1 的 12.1.1.1,而 R4 没有到 12.1.1.1 的路由,会导致路由不可达。
2. eBGP 邻居基于环回口建立的注意事项
- 必须配置静态路由,保证两个环回口之间的 IP 可达,R4 和 R5 的 LoopBack1 需要互相配置静态路由;
- 必须配置
ebgp-max-hop,因为 eBGP 默认使用直连物理接口建立邻居,TTL 为 1,环回口之间需要多跳,所以要增大 TTL,华为设备默认是 1,需要手动配置; connect-interface必须指定为对应的环回口,保证 BGP 报文的源地址是环回口地址,否则对方会拒绝建立邻居。
3. OSPF 引入 BGP 的注意事项
- AS200 内的 R2 和 R4 都需要配置
ospf 1 import-route bgp,把 BGP 路由引入 OSPF,保证 AS 内的所有设备都能学到这些路由; - 注意 OSPF 的
router-id配置,最好手动指定为环回口地址,避免自动选举导致的问题; - 不要把 AS 间的直连网段(如 12.1.1.0/24、45.1.1.0/24)宣告进 OSPF,避免路由环路。
五、最终验证结果
所有邻居状态正常,全网路由可达:
- R1 ping 1.1.1.1、2.2.2.2、3.3.3.3、4.4.4.4、5.5.5.5 都通;
- R5 ping 1.1.1.1、2.2.2.2、3.3.3.3、4.4.4.4、5.5.5.5 都通;
- 所有 BGP 邻居状态都为 Established,OSPF 邻居状态为 Full。
