Quagga未将eBGP学习前缀传播至其他eBGP邻居问题
我来帮你排查这个Quagga里eBGP路由通告失效的问题,结合你给出的配置片段,咱们一步步来分析可能的原因和解决办法:
首先先把你提供的配置片段整理出来方便分析:
router bgp 64620 bgp router-id 172.29.253.80 bgp log-neighbor-changes network 172.29.253.80/32 timers bgp 10 30 neighbor 10.35.253.2 remote-as 64901 neighbor 10.35.253.2 next-hop-self neighbor 10.35.253.2 soft-reconfiguration inbound neighbor 10.47.0.254 remote-as 64621 neighbor 10.47.0.254 ebgp-multihop 255 neighbor 10.47.0.254 nex...
1. 补全不完整的邻居配置
你的配置里neighbor 10.47.0.254 nex...明显没写完,大概率是漏掉了next-hop-self参数。对于非直连的eBGP邻居(你已经开了ebgp-multihop),默认下一跳是原路由发布者的IP地址,如果这个下一跳在10.47.0.254的路由表里不可达,对方根本不会接收这条前缀。赶紧补上这行:
neighbor 10.47.0.254 next-hop-self
2. 确认Quagga确实学到了目标路由
先检查你的BGP表,确认从AS64901(10.35.253.2)学到的前缀已经存在且是最优路由:
show ip bgp
找那些来自10.35.253.2的前缀,看前面有没有*> 标记——这个标记表示这条路由是Quagga选中的最优路由,只有最优路由才会被通告给其他邻居。如果没有这个标记,得先排查为什么这条路由没被选为最优(比如优先级、MED值、AS_PATH长度等问题)。
3. 检查出口方向的路由过滤策略
默认情况下,eBGP学到的路由会自动通告给其他eBGP邻居,但如果配置了路由映射、前缀列表或者ACL,可能会把这些路由过滤掉。你可以先查看对10.47.0.254的出口路由:
show ip bgp neighbor 10.47.0.254 routes out
如果输出为空,说明有过滤规则在生效。可以临时加一个允许所有路由的策略来测试:
route-map ALLOW_ALL permit 10 neighbor 10.47.0.254 route-map ALLOW_ALL out
配置完后再查出口路由,如果能看到目标前缀了,说明之前的过滤策略有问题,需要调整。
4. 验证eBGP多跳的连通性
你配置了ebgp-multihop 255,说明这个邻居不是直连的。首先要确保你的路由器能正常ping通10.47.0.254,同时对方也能ping通你的路由器:
ping 10.47.0.254 traceroute 10.47.0.254
如果连通性有问题,先解决IP层的路由问题,BGP邻居都建立不起来的话,路由通告更无从谈起。
5. 确认BGP邻居状态是Established
用这条命令查看邻居状态:
show ip bgp neighbors
找到10.47.0.254对应的条目,看BGP state是不是Established。如果不是,先排查邻居建立失败的原因——比如AS号配置错误、缺少认证(如果对方配置了)、防火墙拦截了BGP端口(TCP 179)等。
6. 核对BGP路由通告规则
最后再确认下BGP的基本规则:eBGP学到的路由会通告给其他eBGP邻居,除非满足以下条件之一:
- 路由不是最优路由
- 被出口策略过滤
- 下一跳不可达
- AS_PATH里包含接收方的AS号(防环路)
按照上面的步骤一步步排查,应该能找到问题所在。
内容的提问来源于stack exchange,提问作者Ossar

