兄弟们,BGP 这玩意儿,说简单也简单,说复杂能让你怀疑人生。
最近帮客户搞了一波 AS64500 到 AS65000 的 EBGP 对接,本以为半小时搞定,结果硬是折腾到凌晨两点。为啥?全特么是细节坑。
这篇东西,不扯虚的。直接上 CLI,画拓扑,讲我踩过的坑。2026 年了,BGP 的配置思路没变,但安全要求和自动化程度完全不一样了。
基础拓扑:一个经典的 EBGP 场景
[AS 64500] [AS 65000]
R1 (10.0.12.1) --------- (10.0.12.2) R2
Loopback0: 1.1.1.1 Loopback0: 2.2.2.2
Network: 172.16.1.0/24 Network: 192.168.1.0/24
就这?就这。但 90% 的人第一步就翻车。
第一步:最基础的 BGP 配置(别笑,真有人写错)
! R1 Configuration
router bgp 64500
bgp router-id 1.1.1.1
neighbor 10.0.12.2 remote-as 65000
! 注意:2026年了,别用默认的TTL,EBGP默认TTL=1,必须手动改
neighbor 10.0.12.2 ebgp-multihop 2
neighbor 10.0.12.2 timers 10 30
!
address-family ipv4 unicast
network 172.16.1.0 mask 255.255.255.0
neighbor 10.0.12.2 activate
exit-address-family
! R2 Configuration
router bgp 65000
bgp router-id 2.2.2.2
neighbor 10.0.12.1 remote-as 64500
neighbor 10.0.12.1 ebgp-multihop 2
neighbor 10.0.12.1 timers 10 30
!
address-family ipv4 unicast
network 192.168.1.0 mask 255.255.255.0
neighbor 10.0.12.1 activate
exit-address-family
翻车点 #1: 很多人忘了 ebgp-multihop。如果你用直连 IP 建邻居,默认 TTL=1 就够了。但一旦你用了 Loopback 或者中间有跳数,不配这个,邻居永远起不来。
翻车点 #2: timers 10 30 是我个人习惯。默认的 Keepalive=60s, Hold=180s 太慢了,故障收敛时间 3 分钟,2026 年的网络谁等得起?我一般压到 10/30,再低 CPU 扛不住。
第二步:验证邻居状态(这条命令救过我无数次命)
show ip bgp summary
show ip bgp neighbors 10.0.12.2
输出长这样:
| 状态 | 含义 | 常见原因 |
|---|---|---|
| Idle | 初始状态或错误 | 邻居 IP 不可达、AS 号不匹配 |
| Connect | TCP 连接建立中 | 路由不通、ACL 过滤 |
| Active | 主动连接失败 | 对端没配、端口被 ACL 挡 |
| OpenSent | 发送 OPEN 消息 | 一般正常 |
| OpenConfirm | 收到 OPEN 确认 | 一般正常 |
| Established | 邻居建立成功 | 恭喜,你可以下班了 |
实战经验: 如果卡在 Active 状态超过 30 秒,别瞎折腾。直接 debug ip bgp events,看日志里到底报什么错。我见过最离谱的——对端 ACL 把 TCP 179 端口给 drop 了,查了俩小时。
第三步:路由策略与过滤(2026 年标配)
裸配 BGP 不配过滤策略?那是给自己挖坟。2026 年,每个 EBGP 邻居至少要有:
- 入方向前缀过滤 —— 防止对面瞎发路由把你表撑爆
- 出方向 AS_PATH 过滤 —— 防止你的私有 AS 泄漏到公网
- 最大前缀限制 —— 防 DDoS 攻击
! R1 上配置前缀列表
ip prefix-list ALLOW_FROM_R2 seq 5 permit 192.168.1.0/24
route-map RM_IN_FROM_R2 permit 10
match ip address prefix-list ALLOW_FROM_R2
set local-preference 150
route-map RM_OUT_TO_R2 permit 10
match ip address prefix-list ALLOW_FROM_R2
set as-path prepend 64500 64500 64500
router bgp 64500
neighbor 10.0.12.2 route-map RM_IN_FROM_R2 in
neighbor 10.0.12.2 route-map RM_OUT_TO_R2 out
neighbor 10.0.12.2 maximum-prefix 100 80 restart 5
这里有个骚操作: maximum-prefix 100 80 restart 5 意思是如果收到的前缀超过 80 条就报警,超过 100 条直接断邻居,5 分钟后自动重连。对付路由泄露神器。
第四步:BGP 安全配置(2026 年必须搞)
以前很多人觉得 BGP 安全无所谓。直到 2024 年某大厂被 BGP 劫持搞挂了 6 小时。
! TCP MD5 认证(老东西但有效)
router bgp 64500
neighbor 10.0.12.2 password MySuperSecretKey2026
! GTSM (Generalized TTL Security Mechanism)
! 只接受 TTL >= 255 的 BGP 包,防远程攻击
neighbor 10.0.12.2 ttl-security hops 1
注意: ttl-security hops 1 和 ebgp-multihop 是冲突的,不能同时配。如果你用直连建邻居,用 TTL Security 更安全。如果用 Loopback 多跳,只能用 MD5。
常见问题 FAQ
Q1: 为什么我的 BGP 邻居一直卡在 Idle 状态?
A: 99% 的情况是对端 IP 不可达。先 ping 10.0.12.2 看看通不通。通了再看 AS 号配没配错。我见过有人把 remote-as 写成自己的 AS 号,那肯定起不来。
Q2: EBGP 和 IBGP 的配置区别是什么?
A: EBGP 一般用直连 IP,AS 号不同,TTL=1,不需要 next-hop-self。IBGP 一般用 Loopback 建邻居,AS 号相同,需要 next-hop-self,而且必须全互联或配 Route-Reflector。简单说:EBGP 是跨组织,IBGP 是内部。
Q3: BGP 的 Local Preference 和 MED 怎么选?
A: Local Preference 是出方向的,MED 是入方向的。简单粗暴:你想让流量从哪个出口走,就在那配高 Local Pref。你想让对端优先走你哪个入口,就配低 MED。但注意 MED 只在相同 AS 间比较,不同 AS 的 MED 没有可比性。
总结几个血泪教训
- 配完 BGP 一定要
write memory—— 别问我为什么强调这个,问就是重启过。 - 先配
maximum-prefix再上线 —— 2024 年有个案例,对端路由泄露,直接导致全网 BGP 表爆炸,CPU 100%。 - BGP 的收敛时间默认太慢 —— 改 timers,配 BFD。2026 年的网络,BFD 不是可选项,是必选项。
- 别迷信默认配置 —— 每个厂商的默认行为不一样。Cisco 默认会发送所有直连路由,Juniper 默认不发送。看清楚。
最后说一句:BGP 不难,难的是你永远不知道对端会给你发什么垃圾路由。做好过滤,配好安全,剩下的随缘。