0开篇:互联网的电话簿
如果把互联网想象成一张巨大无比、由无数张"快递网"拼接而成的世界地图,那么 BGP 就是这些快递网之间互相通报"我能把你寄到哪儿"的外交协议。
你每天刷视频、逛电商、打游戏,数据从你的手机出发,经过运营商、经过海底光缆、经过异国他乡的机房,最终抵达目标服务器。这一路上,没有任何一家公司拥有整张网络,而是成千上万个被称为 AS(自治系统) 的独立网络拼接而成。它们彼此并不互相信任,也各有各的小算盘——有的想省钱走便宜的出口,有的想保证质量走快线。那么问题来了:当数据包抵达网络 A 的边缘,A 凭什么知道"去往 8.8.8.8 下一跳该交给谁"?
答案就是 BGP(Border Gateway Protocol,边界网关协议)。它是整个互联网的"电话簿"和"路由交易所"。没有 BGP,互联网就会像没有邮政编码的世界,信件只能靠运气乱投。据估计,今天活跃在公网上的 IPv4 路由前缀大约有 90 多万条,IPv6 也有数万条,它们全靠 BGP 在不同 AS 之间互相广播、博弈、择优。
接下来,我会用 Cisco 路由器的真实配置,带你从"BGP 是什么"一路杀到"怎么用它构建运营商级网络"。系好安全带,我们出发。
1BGP 到底是什么
1.1 为什么 IGP 撑不起互联网
先讲一个反直觉的事实:BGP 从来不是为了"快"而设计的。OSPF、IS-IS、EIGRP 这些内部网关协议(IGP)算路极快,收敛以秒计,但它们有一个致命的"小家子气"——它们只关心自己 AS 内部那"一亩三分地"。如果你让 OSPF 去承载全球 90 万条路由:
- 每个路由器都要把全世界的路由放进自己的 LSDB(链路状态数据库),内存直接爆炸;
- 任何一条链路抖动,全世界的路由器都要重新 SPF 计算,CPU 原地升天;
- 最要命的是:IGP 根本没法表达"我想走便宜的运营商,不想走贵的",它没有"政策"概念。
所以工程师们很早就达成共识:IGP 管内部,BGP 管外部。AS 内部用 OSPF/IS-IS 把"家门"打通,然后由 BGP 在 AS 边界把"去往外部世界"的路由优雅地交换出去。
1.2 BGP 的几条"性格"
距离矢量?不,路径矢量
它不直接告诉邻居"距离你 5 跳",而是告诉邻居"去往 X 的整条 AS 路径是 AS1→AS2→AS3",让每个 AS 自己判断要不要走。
跑在 TCP 179 上
BGP 自己不负责可靠传输,全甩给 TCP。所以你永远看不到 BGP 的"序列号""确认"——那是 TCP 的活。
触发式更新
不像 RIP 每隔 30 秒喋喋不休,BGP 只有路由变化时才发更新,是个"沉默寡言"的协议。
基于策略
BGP 的"最优路径"不是算出来的,是工程师用 route-map、local-pref、MED 等"人肉"定出来的。
管理距离很大
在 Cisco 上 eBGP 是 20,iBGP 是 200,意味着它默认"信任度"低于 IGP——这是有深意的。
慢,但是稳
收敛可能要几分钟,但它极少抽风,是互联网 30 多年不塌的基石。
1.3 BGP 的版本往事
BGP-1、BGP-2、BGP-3 都已是历史尘埃。今天所有人用的都是 BGP-4(RFC 4271),并在它之上通过"多协议扩展(MP-BGP,RFC 4760)"把能力从 IPv4 扩展到了 IPv6、VPN、组播等地址族。所以你听到"BGP4"或者"MP-BGP",本质上是一家人。
2自治系统 AS 与两类邻居
2.1 什么是 AS(Autonomous System)
AS 就是"自治系统"——一群在统一技术管理策略下运行、对外呈现单一路由策略的网络集合。它就像网络世界里的"国家"。每个 AS 都有一个全球唯一的编号,叫 ASN(AS Number)。
- 公有 ASN:由 IANA 通过地区注册局(APNIC、ARIN、RIPE 等)分配,范围 1–64511 是老的 16 位空间,以及 131072–419999999 的 32 位扩展空间。
- 私有 ASN:64512–65534(16 位)和 420000000–4294967294(32 位),用于内部联邦、数据中心等,不能出现在公网。
2.2 eBGP 与 iBGP:一门亲,两兄弟
| 维度 | eBGP(外部 BGP) | iBGP(内部 BGP) |
|---|---|---|
| 邻居所在 AS | 不同 AS | 相同 AS |
| 典型拓扑 | AS 边界路由器之间 | AS 内部所有 BGP 路由器之间 |
| 默认 TTL | 1(直连才能建邻居) | 255(可跨多跳) |
| 管理距离 | 20 | 200 |
| 下一跳处理 | 自动改为自己 | 默认不改(需 next-hop-self) |
| 路由传递规则 | 发给任何邻居 | 从 iBGP 学到的路由不再发给其他 iBGP(防环) |
| AS_PATH | 每经过一个 eBGP 加一个 AS | 不变 |
2.3 Cisco 上定义 AS 的本质
在 Cisco 路由器上,你敲下 router bgp 65001,这个 65001 就是你这台路由器的"国籍"。从此它说话的口吻、加 AS_PATH 的方式,全都按这个 AS 号来。
! 一台位于 AS 65001 的路由器 router bgp 65001 bgp log-neighbor-changes ! 邻居抖动能进日志,排错神器
3BGP 如何"交朋友":邻居建立
BGP 是个"慢热"的协议,它不会像 OSPF 那样主动到处喊"谁是我的邻居"。BGP 邻居必须手工指定——你得亲口告诉路由器:"去和 10.1.1.2 这个 IP 建 BGP 邻居,它是 AS 65002 的。"这就是 neighbor 命令的由来。
3.1 一条最朴素的邻居配置
! R1 (AS 65001) 想和 R2 (AS 65002) 建 eBGP router bgp 65001 neighbor 10.1.1.2 remote-as 65002 neighbor 10.1.1.2 description "eBGP to R2" ! R2 上对称配置 router bgp 65002 neighbor 10.1.1.1 remote-as 65001
3.2 iBGP 邻居:用环回口建邻居
eBGP 通常直连、用物理口 IP 建邻居即可。但 iBGP 邻居可能隔着好几台路由器,物理口会随链路故障而变。老司机的做法是:用 Loopback 环回口的稳定 IP 建 iBGP 邻居,并指定 update-source 告诉 BGP"用哪个口的 IP 作为我发送报文的源地址"。
! R1 与 R3 同属 AS 65001,但中间隔着别的设备 interface Loopback0 ip address 1.1.1.1 255.255.255.255 router bgp 65001 neighbor 3.3.3.3 remote-as 65001 ! 同 AS → iBGP neighbor 3.3.3.3 update-source Loopback0 ! 用环回口 IP 当源
3.3 eBGP 多跳:当邻居不在隔壁
默认 eBGP 的 TTL=1,意味着报文只能走一跳,必须直连。但如果你和邻居之间有运营商的传输设备(二层透传),或者就是要跨多跳建 eBGP,就需要 ebgp-multihop 把 TTL 调大:
router bgp 65001 neighbor 2.2.2.2 remote-as 65002 neighbor 2.2.2.2 ebgp-multihop 2 ! 允许 2 跳 neighbor 2.2.2.2 update-source Loopback0
ebgp-multihop 配合 Loopback 建邻居虽方便,但也意味着攻击面变大。生产环境务必配合 MD5 认证(后文有)和 GTSM/TTL Security,否则别人伪造一个邻居就能往你这儿灌路由。
4BGP 报文四大家族
BGP 报文都封装在 TCP 里,端口 179。它一共有五种报文类型(常说是"四大家族",因为 Route-Refresh 是后加的)。我们一个个拆开看。
① OPEN(开场白)
建邻居时双方先互甩 OPEN 报文,相当于"亮名片"。里面包含:自己的 AS 号、BGP 版本、Hold Time(保活时间)、Router-ID、以及双方能支持哪些能力(Capabilities),比如是否支持多协议、是否支持 4 字节 AS 号、是否支持路由刷新。
② KEEPALIVE(心跳)
建完邻居后,双方按 Hold Time 的三分之一发 KEEPALIVE,证明"我还活着"。默认 Hold Time 是 90 秒,所以每 30 秒跳一次心跳。只要心跳不断,邻居就稳如老狗。
③ UPDATE(正经事)
这是 BGP 的"主业报文",用来通告或撤销路由。一个 UPDATE 里可以包含:
- NLRI(网络层可达信息):我要通告哪些前缀(比如 192.0.2.0/24)。
- Path Attributes(路径属性):去往这些前缀的"身世信息"——AS_PATH、NEXT_HOP、LOCAL_PREF、MED、Community 等(第六章重点)。
- Withdrawn Routes(撤销路由):哪些前缀我刚才说有、现在没了。
④ NOTIFICATION(绝交信)
一旦检测到错误(比如 AS 号对不上、Hold Time 超时、属性非法),BGP 会发出 NOTIFICATION 然后立刻断开邻居。这是排查故障时日志里最不想看到、但最有价值的报文。
⑤ ROUTE-REFRESH(刷新请求)
当你改了入方向策略想让它立刻生效,又不想"摔电话重连"(clear),就发一个 ROUTE-REFRESH 让邻居把路由重新发一遍。配合 soft reconfiguration 使用体验更佳。
! 让邻居 R2 把路由重新刷新给我(入方向策略重算) clear ip bgp 10.1.1.2 in
5BGP 状态机:邻居关系的"恋爱史"
BGP 邻居从"陌生人"到"稳定伴侣",要经历 6 个状态。理解它,你就能看懂 show ip bgp summary 里那一栏栏的字母到底在说什么。
- Idle( idle,发呆):初始状态,拒绝一切连接。如果配置错误(比如邻居 IP 不可达),就长期卡这里。
- Connect( connect,拨号中):发起 TCP 三次握手。成功就进 Opensent,失败就进 Active 重试。
- Active( active,主动重连):TCP 没建起来,正在锲而不舍地重试。卡在这里通常是底层 IP 不通 / 没有去往邻居的路由 / ACL 挡了 179 端口。
- OpenSent( opensent,递名片):TCP 通了,发出 OPEN 等对方 OPEN。如果对端 AS 号写错,会在这里收到 NOTIFICATION 然后回 Idle。
- OpenConfirm( openconfirm,确认中):双方 OPEN 都对上了,等最后一个 KEEPALIVE 确认。
- Established( established,喜结连理):邻居稳了!开始交换 UPDATE。这才是你想要的终态。
| 状态 | 你看到它意味着 | 常见病因 |
|---|---|---|
| Idle | 根本没开始 | 邻居 IP 不可达、没路由 |
| Active | TCP 179 建不上 | 对端没配邻居、ACL 拦、源 IP 不匹配 |
| OpenSent / OpenConfirm | 参数协商失败 | remote-as 写错、Hold Time 不一致、能力不匹配 |
| Established | ✅ 成功 | —— |
! 实时观察邻居卡在哪个状态 R1# show ip bgp summary BGP router identifier 1.1.1.1, local AS number 65001 Neighbor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd 10.1.1.2 4 65002 152 150 0 0 0 00:12:33 3 ! 末尾数字=收到几条路由;若显示 Active 就是没建上
show ip bgp summary 最后一列如果是个数字(如 3),表示邻居已建立并收到了 3 条路由;如果显示 Active 或 Idle,那就是建邻居失败了,按上表对症排查。
6路径属性:BGP 的灵魂
这是 BGP 最精华、也最劝退新人的一章。BGP 选路不看"距离",而是比"属性"。每条 BGP 路由都带着一堆属性,就像护照上的签证页,记录着它的身世、身价和政策标签。属性分四大类:
| 类别 | 含义 | 成员 | 是否必须被传递 |
|---|---|---|---|
| 公认必遵 Well-known Mandatory | 所有 BGP 实现都认,且每条路由必须带 | ORIGIN、AS_PATH、NEXT_HOP | 是 |
| 公认自决 Well-known Discretionary | 所有 BGP 都认,但可带可不带 | LOCAL_PREF、ATOMIC_AGGREGATE | 是 |
| 可选过渡 Optional Transitive | 不强制认,但认不认都要继续传给下家 | AGGREGATOR、COMMUNITY | 认的传,不认也传 |
| 可选非过渡 Optional Non-transitive | 不强制认,且不认就丢弃、不再传 | MED、ORIGINATOR_ID、CLUSTER_LIST | 否 |
6.1 ORIGIN(起源)—— 路由的"出身"
记录这条路由最初是怎么进 BGP 的,三个值,优先级 i > e > ?:
i(IGP,代码 0):用network命令注入的——"根正苗红"。e(EGP,代码 1):从老式 EGP 学来的,现在几乎见不到。?(Incomplete,代码 2):靠重分发(redistribute)进来的——"来路不明"。
6.2 AS_PATH(AS 路径)—— 防环 + 选路核心
这是 BGP 的防环基石,也是选路第一判据。每经过一个 eBGP,就把离开的 AS 号压栈到 AS_PATH 前面。路由器收到一条路由,如果发现自己 AS 号已经在 AS_PATH 里,立刻丢弃——这就是 eBGP 的防环逻辑。
as-path prepend 人为"加长"某条路径,把它变成"备胎路由"。详见第十七章。
6.3 NEXT_HOP(下一跳)—— 最容易被坑的属性
指"要到达这个前缀,把包扔给谁"。规则很微妙:
- eBGP 通告时,NEXT_HOP 自动改成自己的接口 IP;
- iBGP 通告时,NEXT_HOP 默认不变——这就埋下了"下一跳不可达"的大坑(第十章专门解决)。
6.4 LOCAL_PREF(本地优先级)—— AS 内的"出口民意"
只在 iBGP 内部传递,不传出本 AS。数值越大越优(默认 100)。用它来告诉 AS 内部所有路由器:"出咱们家去往某目的地,走哪个边界路由器最好"。这是 影响出方向流量( outbound )最常用的武器。
6.5 MED(Multi-Exit Disc,多出口鉴别符)
和 LOCAL_PREF 相反,MED 是给邻居 AS 看的,意思是"我这里有两个出口连你,请优先走 MED 小的那个"。数值越小越优(默认 0)。它影响的是入方向流量( inbound )——但注意:MED 默认只在同一对相邻 AS 之间、且只有"第一个 AS"相同时才比较,这是它最容易让人迷糊的地方。
6.6 WEIGHT(权重)—— Cisco 私房菜
注意!WEIGHT 不是标准 BGP 属性,是 Cisco 私有,只在本机有效、不传给任何邻居。范围 0–65535,越大越优。它是 Cisco 路由器上选路的最高优先级判据。想在本机"一票否决"某条路径,用它最快。
6.7 COMMUNITY(团体)—— 给路由贴标签
Community 就像给路由贴的"邮戳",是 32 位数值(格式 a:b 或单个数字),用来在 AS 之间传递"统一处理指令"。比如"凡是贴了 65001:100 的路由,一律不往外传"。它是实现大规模策略的超级利器,第十五章细讲。
! 看看一条路由都带了哪些属性 R1# show ip bgp 192.0.2.0 BGP routing table entry for 192.0.2.0/24, version 7 Paths: (1 available, best #1) 65002 10.1.1.2 from 10.1.1.2 (2.2.2.2) ! 下一跳 Origin IGP, metric 0, localpref 100, valid, external, best Community: 65002:100 ! 团体属性
7选路规则:终极裁决(Cisco 13 条)
当路由器从多个邻居学到"去往同一个前缀"的多条路径,它会按固定顺序逐条比对,谁先赢就停,绝不并列。Cisco IOS 的默认选路算法如下(从最高优先级往下):
- Weight(权重):Cisco 私有,本机有效,越大越优。
- Local Preference(本地优先级):AS 内一致,越大越优。
- 本地起源(Locally Originated):自己 network/redistribute 进来的优先于邻居学的。
- AS_PATH 长度:越短越优。
- Origin 类型:IGP(i) > EGP(e) > Incomplete(?)。
- MED:越小越优(仅当来自同一相邻 AS)。
- eBGP 优于 iBGP:从外部学来的优先于从内部学来的。
- 到下一跳的 IGP 度量(IGP metric):去往 NEXT_HOP 的内部路由,成本小的优。
- 负载均衡:如果以上全平,且开启了 maximum-paths,可等价多路径。
- 最老的路径(eBGP):老牌路径优先(稳定优先)。
- 最小的 Router-ID:比邻居的 BGP Router-ID,小的赢。
- 最小的邻居 IP 地址:最后兜底,比邻居的 IP,小的赢。
! 查看路由器最终为每条前缀选了哪条"best path" R1# show ip bgp Network Next Hop Metric LocPrf Weight Path * 192.0.2.0 10.1.1.2 0 0 65002 i *> 10.2.2.2 0 0 65003 i ! > 标记的就是 best path(带 * 是有资格候选的)
8基础配置实战(Cisco IOS)
理论嚼了这么多,上真家伙。下面是一套完整的双 AS 互联最小可用配置,你照着敲就能在两台路由器间跑通 BGP。
8.1 拓扑:R1(AS65001) — R2(AS65002)
########## R1 ########## hostname R1 interface GigabitEthernet0/0 ip address 10.1.1.1 255.255.255.252 interface Loopback0 ip address 1.1.1.1 255.255.255.255 router bgp 65001 bgp router-id 1.1.1.1 ! 手动指定 Router-ID,避免靠接口 IP 瞎选 bgp log-neighbor-changes neighbor 10.1.1.2 remote-as 65002 neighbor 10.1.1.2 description eBGP-to-R2 network 1.1.1.1 mask 255.255.255.255 ! 把环回口路由通告进 BGP ########## R2 ########## hostname R2 interface GigabitEthernet0/0 ip address 10.1.1.2 255.255.255.252 interface Loopback0 ip address 2.2.2.2 255.255.255.255 router bgp 65002 bgp router-id 2.2.2.2 bgp log-neighbor-changes neighbor 10.1.1.1 remote-as 65001 network 2.2.2.2 mask 255.255.255.255
show ip bgp summary,看到邻居状态是数字(收到路由数)就成功了。再用 ping 2.2.2.2 source loopback0 验证端到端连通——记得指定源,否则 ping 用的是出口物理口 IP,而那个 IP 对方未必有路由。
8.2 Router-ID 为什么重要
BGP 的 Router-ID 是一个 32 位值(通常写成 IP 样子)。它在选路规则第 11 条当"裁判"。如果不手动设,Cisco 会拿"最大的环回口 IP"或"最大的物理口 IP"当 Router-ID——这很随机,可能导致你无法预测选路结果。所以生产环境一律手动 bgp router-id。
9通告路由的 N 种姿势
BGP 不像 OSPF 会自动把接口塞进协议。你得主动"发布"路由。有三种主流姿势:
姿势一:network 命令(最干净)
network 不是"激活接口",而是"如果我的路由表里恰好有这条精确前缀,就把它宣告进 BGP"。注意必须精确匹配(含掩码)。
router bgp 65001 network 192.0.2.0 mask 255.255.255.0 ! 路由表里得有 192.0.2.0/24 才生效
姿势二:redistribute 重分发(省事但有坑)
把 IGP(OSPF 等)或直连路由整批灌进 BGP。方便,但会引入大量"来路不明(Origin ?)"的路由,容易把内部细节全暴露给外部,运营商慎用。
router bgp 65001 redistribute ospf 1 match internal ! 把 OSPF 内部路由重分发进 BGP
姿势三:aggregate-address 聚合(优雅汇总)
把一堆细路由聚成一条大路由再宣告,减少路由表规模。详见第十三章。
network 10.0.0.0 发现没生效,因为不带 mask 时 Cisco 默认按主类掩码(A 类 /8)理解,而你路由表里可能是 /24。永远带上 mask 精确宣告,少踩坑。
10下一跳之谜:next-hop-self
这是 BGP 初学者翻车率最高的坑,没有之一。我们来复现事故:
假设 AS 65001 里有三台路由器 R1—R2—R3(iBGP 都在同一个 AS)。R1 是边界,和外面 AS 65002 的 R4 建 eBGP。R4 把 4.4.4.4 通告给 R1,NEXT_HOP 变成 R4 的接口 IP(比如 10.1.1.4)。R1 通过 iBGP 把这条路由传给 R3,但 iBGP 默认不改 NEXT_HOP,于是 R3 收到的路由 NEXT_HOP 还是 10.1.1.4。
问题来了:R3 是个内部路由器,它根本没有去往 10.1.1.4 的路由(那是边界网段)!于是 R3 认为"下一跳不可达",这条路由被打上 inaccessible,直接进不了路由表。流量到了 R3 就"找不到北"。
解法:next-hop-self
让边界路由器 R1 在发给 iBGP 邻居时,把 NEXT_HOP 改成自己的环回口 IP,这样 AS 内部所有路由器都"认识"这个下一跳(因为内部 IGP 通着)。
! 在边界路由器 R1 上,对 iBGP 邻居做 next-hop-self router bgp 65001 neighbor 3.3.3.3 remote-as 65001 neighbor 3.3.3.3 update-source Loopback0 neighbor 3.3.3.3 next-hop-self ! 关键!把下一跳改成自己
11路由反射器 RR:干掉 full mesh
还记得第二章说的 iBGP 水平分割吗?"从 iBGP 学的路由不再发给其他 iBGP",导致 AS 内必须所有 iBGP 路由器两两互联(full mesh)。AS 内有 N 台路由器,就要建 N×(N−1)/2 个邻居关系——10 台就是 45 个,100 台就是 4950 个,纯纯的运维噩梦。
11.1 RR 的工作原理
路由反射器(Route Reflector)引入一个"中心节点"概念:
- RR(反射器):特殊路由器,打破了水平分割。
- Client(客户端):普通 iBGP 路由器,只需和 RR 建邻居。
- Non-client(非客户端):传统的 iBGP 邻居。
RR 的反射规则(核心):
- 从 Client 收到的路由 → 反射给所有其他 Client 和 Non-client;
- 从 Non-client 收到的路由 → 只反射给 Client(不反射给另一个 Non-client);
- 从 eBGP 收到的路由 → 反射给所有人(eBGP 不受水平分割限制)。
为了防环,RR 引入了两个新属性:ORIGINATOR_ID(originating 路由器的 Router-ID)和 CLUSTER_LIST(经过的 RR 簇 ID 列表)。如果路由绕回自己,丢弃。
! 把 R1 配成 RR,R2、R3 是它的客户端 ! 在 RR (R1) 上: router bgp 65001 neighbor 2.2.2.2 route-reflector-client neighbor 3.3.3.3 route-reflector-client ! R2、R3 上只需正常配 iBGP 邻居指向 R1 的环回口,无需彼此互联 ! R2 / R3 配置示例: router bgp 65001 neighbor 1.1.1.1 remote-as 65001 neighbor 1.1.1.1 update-source Loopback0
12联邦 Confederation:把大 AS 拆成小 AS
联邦是另一种干掉 full mesh 的思路,和 RR 是"两种不同的哲学":
- RR:AS 号不变,逻辑上还是一个大 AS,只是搞了个"反射中心"。
- Confederation(联邦):把一个大 AS 在内部切成若干个"子 AS"(用私有 ASN),子 AS 之间跑 eBGP(但带着特殊标记,不向真外边传),子 AS 内部再跑 iBGP。
! R1 属于联邦的子 AS 65002,对外宣称自己是大 AS 65001 router bgp 65002 bgp confederation identifier 65001 ! 对外展示的真实 AS bgp confederation peers 65003 ! 联邦内的其他子 AS neighbor 10.0.0.2 remote-as 65003 ! 和另一个子 AS 的 eBGP(联邦内)
13路由聚合:把碎片拼成整块
假设 AS 65001 内部有 192.0.2.0/24、192.0.3.0/24、192.0.4.0/24……几十个细路由。如果全部通告给邻居,对方的路由表会膨胀。更优雅的做法是聚合成一条 192.0.0.0/22 超级网再发出去。
router bgp 65001 aggregate-address 192.0.0.0 255.255.252.0 ! 生成聚合路由
两个关键开关
summary-only:只发聚合路由,抑制掉所有明细。最大程度减少路由条目。as-set:聚合路由的 AS_PATH 记录"原始明细来源的所有 AS 集合",避免聚合导致防环失效。强烈建议加!
router bgp 65001 aggregate-address 192.0.0.0 255.255.252.0 summary-only as-set
14路由过滤与策略:route-map 大法
BGP 的精髓在于"策略"。你不希望把所有路由都无脑传给邻居,也不希望邻居的垃圾路由污染你。Cisco 提供四把"筛子":
prefix-list
按"前缀 + 掩码范围"精确过滤,比 ACL 更直观、更省资源。日常首选。
route-map
全能策略引擎,既能过滤,又能改属性(设 local-pref、改 next-hop、打 community)。
filter-list
基于 AS_PATH 正则表达式过滤,适合"拒绝来自某 AS 的路由"。
distribute-list
用 ACL 过滤,老式做法,现在基本被 prefix-list 取代。
14.1 prefix-list 实战
! 只允许通告 192.0.2.0/24,拒绝其余 ip prefix-list PL-OUT permit 192.0.2.0/24 ip prefix-list PL-OUT deny 0.0.0.0/0 le 32 ! 隐式拒绝一切(prefix-list 末尾有隐藏 deny any) router bgp 65001 neighbor 10.1.1.2 prefix-list PL-OUT out
14.2 route-map:过滤 + 改属性二合一
! 入方向:把来自 R2 的路由 local-pref 改成 200(抢占出口) route-map RM-IN permit 10 set local-preference 200 route-map RM-IN permit 20 ! 放行其余路由(空 set = 只匹配不修改) router bgp 65001 neighbor 10.1.1.2 route-map RM-IN in
permit 20(空动作)。
14.3 filter-list:用正则掐掉某 AS
! 拒绝任何 AS_PATH 里包含 65099 的路由 ip as-path access-list 1 deny _65099_ ip as-path access-list 1 permit .* ! 放行其余 router bgp 65001 neighbor 10.1.1.2 filter-list 1 in
15团体属性 Community 进阶
Community 是 BGP 策略自动化的"灵魂"。它给路由贴一个标签,然后全网(甚至跨 AS)根据这个标签统一执行动作,而不用逐条写前缀列表。
15.1 几个"公认的"Well-known Community
| 团体值 | 含义 |
|---|---|
| NO_EXPORT (0xFFFFFF01) | 收到此标记的路由,不再通告给任何 eBGP 邻居(只在 AS 内传) |
| NO_ADVERTISE (0xFFFFFF02) | 收到后谁都不通告(连 iBGP 都不传) |
| LOCAL_AS / NO_EXPORT_SUBCONFED | 不在联邦子 AS 间传 |
| GRACEFUL_SHUTDOWN (0xFFFF0000) | 优雅停路,把路由"降权"而非突然消失 |
15.2 自定义团体 + 匹配执行
! 出方向:给去往邻居的路由打上 65001:100 标签 route-map RM-OUT permit 10 set community 65001:100 additive ! additive = 追加,不覆盖原有 router bgp 65001 neighbor 10.1.1.2 route-map RM-OUT out neighbor 10.1.1.2 send-community ! 必须开!否则 community 不发出去 ! 对端:匹配 65001:100 的路由,统统拒绝接收 ip community-list 1 permit 65001:100 route-map RM-IN deny 10 match community 1 route-map RM-IN permit 20
neighbor x.x.x.x send-community,对端啥也收不到。这是高频失误点。
16路由阻尼 Dampening:让"抽风"路由闭嘴
有些路由像"狼来了"的孩子,频繁 up/down(比如链路反复闪断)。每次抖动都触发 UPDATE 全网传播,消耗资源。BGP 阻尼(Route Dampening)的机制是:一条路由抖一次就记一笔"罚分",罚分累计到阈值就把它"关禁闭"(suppress),直到它稳定一段时间再放出来。
router bgp 65001 bgp dampening 15 750 2000 60 ! 参数:half-life(15分) reuse(750) suppress-limit(2000) max-suppress(60分)
- half-life:半衰期,罚分每过这么久减半。
- suppress-limit:罚分超过它就关禁闭。
- reuse-limit:罚分降到这就放出。
- max-suppress-time:最多关多久(防止永久封禁)。
17选路调优实战:掌控进出流量
这是 BGP 工程师的"看家本领"——用属性精细操控出方向(outbound)和入方向(inbound)流量走哪条路。假设 AS 65001 双归上行到 AS 65002 和 AS 65003,你想控制走哪边。
17.1 控制出方向(AS 内怎么出去)→ Local_Pref
想让 AS 内所有路由器都把流量从 65002 出去:
! 在收到 65002 路由的入方向,把 local-pref 调高 route-map RM-FROM-65002 permit 10 set local-preference 300 ! 默认 100,调高即优先 router bgp 65001 neighbor 10.1.1.2 route-map RM-FROM-65002 in
17.2 控制入方向(外面怎么进来)→ AS_PATH Prepend
想让外部流量优先从 65003 进来(即让 65002 这条路"显得更远"),就人为拉长去往 65002 的 AS_PATH:
! 出方向给 65002 的路由多压几次自己 AS,显得"路远" route-map RM-TO-65002 permit 10 set as-path prepend 65001 65001 65001 ! 路径里多出现 3 次自己 router bgp 65001 neighbor 10.1.1.2 route-map RM-TO-65002 out
17.3 控制入方向(备选)→ MED
! 告诉 65002:从我这儿进,请优先走 MED 小的那个出口 route-map RM-MED permit 10 set metric 50 router bgp 65001 neighbor 10.1.1.2 route-map RM-MED out
17.4 本机一票否决 → Weight
! 只在本机让去往 65002 的路径优先(不影响其他路由器) route-map RM-W permit 10 set weight 40000 router bgp 65001 neighbor 10.1.1.2 route-map RM-W in
| 想控制 | 用哪个属性 | 配在哪 |
|---|---|---|
| 本 AS 出方向(去哪) | Local_Pref ↑ | 入方向(from 上游) |
| 外部入方向(从哪来) | AS_PATH prepend | 出方向(to 上游) |
| 外部入方向(精细化) | MED ↓ | 出方向(to 上游) |
| 本机单点偏好 | Weight ↑ | 入方向 |
18MP-BGP 与 IPv6:一套协议,多地址族
传统 BGP 只传 IPv4。MP-BGP(多协议扩展,RFC 4760)给 UPDATE 报文加了"地址族"字段,让 BGP 能携带 IPv6、VPN、组播等任意地址族。在 Cisco 上,通过 address-family 把不同家族的邻居和路由隔离开。
! 在 IPv6 地址族下建 eBGP 邻居并通告 IPv6 路由 router bgp 65001 neighbor 2001:db8:1::2 remote-as 65002 ! address-family ipv6 neighbor 2001:db8:1::2 activate ! 在 IPv6 族下激活邻居 network 2001:db8:6501::/48 ! 通告 IPv6 前缀 exit-address-family
activate。这是从老设备迁移时最容易踩的坑——邻居建上了却收不到路由,八成是忘了 activate。
19BGP/MPLS VPN 简介:企业专网的引擎
如果你用过运营商的"企业专线/MPLS VPN"把北京、上海、深圳的办公室打通,背后核心就是 BGP 的 VPNv4 地址族(RFC 4364)。它用 MP-BGP 在运营商骨干上传递"带标签的私网路由"。
19.1 三个关键角色
- CE(Customer Edge):客户侧路由器,只跑普通路由协议连 PE。
- PE(Provider Edge):运营商边缘,把客户私网路由变成 VPNv4 路由在骨干传。
- P(Provider):纯骨干转发节点,只跑 MPLS 标签转发,看不见客户路由。
19.2 VPNv4 配置骨架
! PE 路由器上,用 VPNv4 地址族在 PE 之间传客户路由 router bgp 65001 neighbor 3.3.3.3 remote-as 65001 neighbor 3.3.3.3 update-source Loopback0 ! address-family vpnv4 neighbor 3.3.3.3 activate neighbor 3.3.3.3 send-community extended ! 必须传扩展团体(RT) exit-address-family ! 客户 VRF 实例,用 Route-Target 控制谁能互访 address-family ipv4 vrf CUST-A redistribute ospf 100 match internal exit-address-family
route-target import/export(一种扩展团体属性)决定"我能接收谁的路由、我的路由给谁"。同一 RT 的站点自动互通,不同 RT 隔离——这就是 MPLS VPN 实现"逻辑隔离又灵活互通"的魔法。
20BGP 安全:别让互联网"劫持"你
BGP 诞生于"大家都是好邻居"的纯真年代,本身几乎没有安全设计。于是出现了震惊业界的"BGP 路由劫持"事件(比如某国把 Google 的流量拐跑)。下面是你必须掌握的四道防线。
20.1 MD5 认证:邻居身份核验
router bgp 65001 neighbor 10.1.1.2 password Str0ngP@ss! ! 两端密码必须一致,否则 NOTIFICATION 断开
20.2 GTSM / TTL Security:防近距离伪造
攻击者如果在你和对端之间插一脚,TTL 会被消耗。开启 TTL Security 要求报文 TTL 必须等于 255(即必须直连或极近),伪造包直接被丢。
router bgp 65001 neighbor 10.1.1.2 ttl-security hops 1 ! 等价于 GTSM,要求 TTL=255
20.3 前缀过滤 + RPKI:从根上防劫持
光认证邻居不够,还得确认"对方宣告的路由它真有资格宣告"。RPKI(资源公钥基础设施)让 ASN 和 IP 前缀的归属关系可被密码学验证。Cisco 支持 RPKI 校验:
! 配置 RPKI 验证服务器,自动标记"无效"路由 rpki server rpki.ripe.net transport tcp port 323 refresh 120 router bgp 65001 bgp origin-as validation enable ! 把校验"无效"的路由在入方向丢掉 route-map RM-RPKI deny 10 match rpki invalid route-map RM-RPKI permit 20 router bgp 65001 neighbor 10.1.1.2 route-map RM-RPKI in
maximum-prefix)防止邻居突发灌爆你的路由表。
! 防止邻居突然发来海量路由把设备冲垮 router bgp 65001 neighbor 10.1.1.2 maximum-prefix 100000 90 warning-only
21故障排查手册:老司机的工具箱
BGP 出问题,80% 在邻居建不上,15% 在路由没通告/没收到,5% 在选路不符合预期。按这个顺序排查效率最高。
21.1 邻居起不来
! 1. 看邻居状态 show ip bgp summary ! 2. 看邻居详情(卡哪一步、什么原因) show ip bgp neighbors 10.1.1.2 | include State|prefix|capability ! 3. 看底层通不通(BGP 靠 TCP 179,先确认 IP 层可达) ping 10.1.1.2 ! 4. 看 TCP 会话起没起 show tcp brief | include 179
- Idle → 没去往邻居的路由 / neighbor IP 写错。
- Active → TCP 179 建不上:对端没配 neighbor、ACL 挡了 179、源 IP 不匹配(多跳忘了 update-source)。
- OpenSent→Idle → remote-as 写错 / 能力协商失败(如对方不支持 4 字节 AS)。
21.2 邻居建了但收不到路由
! 看邻居到底收没收到、发没发 show ip bgp neighbors 10.1.1.2 advertised-routes ! 我发出去的 show ip bgp neighbors 10.1.1.2 received-routes ! 我收到的(需开 soft-reconfig) ! 常见原因: ! - 忘了 address-family activate(新 IOS) ! - network 的前缀不在本地路由表(精确匹配!) ! - 入方向 prefix-list / route-map 把路由挡了 ! - next-hop 不可达(iBGP 没做 next-hop-self)
21.3 选路不对
! 用 bestpath 的原因码看路由器到底为啥选了它 show ip bgp 192.0.2.0 ! 输出里会显示 "best #1" 以及每条路径被淘汰的原因
neighbor x.x.x.x soft-reconfiguration inbound,这样 received-routes 才看得到邻居发来的"全部"路由(包括被策略过滤掉的),否则只能看到进表的。代价是多占点内存,排错完可关。
22最佳实践与面试考点
22.1 运营商级 BGP 最佳实践清单
- 永远手动设 Router-ID,别让设备瞎选。
- iBGP 用环回口 + update-source 建邻居,稳定可靠。
- 边界对 iBGP 做 next-hop-self,消除下一跳黑洞。
- 大 AS 用 RR(双冗余)替代 full mesh。
- 对每個 eBGP 邻居做前缀过滤,只放行你该通告/接收的。
- 开启 maximum-prefix 防路由表被灌爆。
- MD5 + TTL Security + RPKI 三层安全叠加。
- 聚合 + as-set 减小全球路由表,但配 dampening 防聚合抖动。
- 用 Community 构建可扩展策略,别写一堆死前缀列表。
- 出方向用 Local_Pref,入方向用 AS_PATH prepend / MED 调流量。
22.2 高频面试考点(背下来)
BGP 用什么传输?
TCP 179,自己不保证可靠。
防环靠什么?
eBGP 靠 AS_PATH 含自己就丢;iBGP 靠水平分割(不反射给 iBGP)。
为什么 iBGP 要 full mesh?
水平分割导致内部必须全互联,RR/联邦用来破局。
next-hop-self 干嘛的?
让 iBGP 邻居下一跳可达,防黑洞。
Local_Pref vs MED?
LP 管出方向、AS 内传;MED 管入方向、给邻居看。
Weight 是标准属性吗?
不是,Cisco 私有,仅本机有效,选路第一判据。
选路第一条比啥?
Weight → Local_Pref → 本地起源 → AS_PATH → …
RR 防环属性?
ORIGINATOR_ID 和 CLUSTER_LIST。
22.3 写在最后
BGP 是一门"慢艺术"。它不追求微秒级收敛,而追求稳定、可预测、可博弈。你今天学的每一个属性、每一条选路规则、每一个 Cisco 命令,背后都是三十多年互联网工程师和运营商之间"信任与防备"的平衡术。把这本手册里的配置敲熟、把选路逻辑想透,你就已经跨过了网络工程师的一道重要门槛。
愿你的 BGP 永远 Established,愿你的路由表永不抖动。🚀
23快速收敛与高可用:让 BGP 也"快"起来
前面说过 BGP 是"慢而稳"的协议,但现代业务(金融交易、直播、云)对中断零容忍。于是工程师给 BGP 装上了四套"加速引擎",让它在链路故障时从"分钟级"收敛提升到"亚秒级"。
23.1 BFD:给邻居关系装个"心跳起搏器"
BGP 自己的 KEEPALIVE 最快 3 秒一次(Hold 90 秒),链路断了要等很久才感知。BFD(双向转发检测)是个独立的轻量协议,能把故障检测压到毫秒级(甚至 50ms)。检测到故障后立刻通知 BGP 砍掉邻居,触发切换。
! 全局开启 BFD,并与 BGP 邻居联动(IOS-XE 风格) router bgp 65001 neighbor 10.1.1.2 fall-over bfd ! 链路挂了 BFD 立刻让 BGP 倒邻居 ! 在接口上定义 BFD 参数 interface GigabitEthernet0/0 bfd interval 50 min_rx 50 multiplier 3 ! 50ms 发一次,3 次丢了就判死
23.2 BGP PIC:前缀无关收敛
传统收敛是"路由没了 → 重新算 → 改写 FIB",前缀越多越慢。PIC(Prefix-Independent Convergence)的思路是:提前为每个前缀算好"主路径 + 备份路径",并写进 FIB。故障发生时路由器不动脑、直接查表切到备份,与前缀数量无关,收敛时间恒定在几十毫秒。
router bgp 65001 address-family ipv4 bgp additional-paths install ! 安装备份路径到 FIB(PIC 核心) bgp recursion host ! 基于主机路由递归,加速下一跳切换 exit-address-family
23.3 Graceful Restart:控制平面重启,转发不中断
路由器升级或 BGP 进程重启时,邻居会以为"你挂了"而 withdraw 你的路由,造成短暂黑洞。GR(优雅重启)让设备在重启期间"假装还活着"——邻居继续用它转数据,等它回来再同步。前提是转发平面(硬件)不重启(NSR/NSF 配合)。
router bgp 65001 neighbor 10.1.1.2 graceful-restart ! 宣告自己支持 GR ! 或全局:bgp graceful-restart
23.4 Graceful Shutdown:优雅退场
运维要下线一条链路/一个 AS 时,如果直接断,流量会瞬间被黑洞或乱窜。Graceful Shutdown(RFC 8326)给要下线的路由打上 GRACEFUL_SHUTDOWN (65535:0) 团体,让全网把它"降权"(local-pref 调成极低),平滑地把流量引走,再真正断开——零丢包退场。
! 下线前,先把去往该邻居的路由降权,引走流量 route-map RM-SHUT permit 10 set community 65535:0 router bgp 65001 neighbor 10.1.1.2 route-map RM-SHUT out neighbor 10.1.1.2 send-community
24Add-Path 与 ORR:打破 RR 的"信息损耗"
路由反射器虽然解决了 full mesh,但它有个天生缺陷:RR 默认只把"它自己算出的最优路径"反射给客户端。客户端因此看不到次优路径,一旦主路径挂了,只能等 RR 重新算、重新反射,收敛慢一拍。
24.1 Add-Path(RFC 7911):把多条路径都发出来
Add-Path 让 BGP 邻居不止发 best path,还能发"备份路径",每条带一个 path identifier 区分。RR 客户端因此手里握着主+备,主挂了秒切备,不用等 RR 重新决策。
! RR 和客户端都开启 additional-paths 能力 router bgp 65001 neighbor 3.3.3.3 additional-paths receive ! 客户端:我要收多条路径 ! address-family ipv4 neighbor 3.3.3.3 additional-paths send ! RR:我发多条路径 neighbor 3.3.3.3 advertise additional-paths best 2 ! 发最优+次优 exit-address-family
24.2 ORR(Optimal Route Reflection):让 RR 站在客户端角度算路
普通 RR 是用自己的位置算 IGP metric,再选 best 反射——但 RR 到目的地可能比客户端近,于是反射给客户端的"最优"对客户端来说未必最优。ORR 让 RR 为不同客户端群分别计算基于它们位置的最优路径,解决"RR 视角偏差"问题。在 IOS-XR 上通过路由策略+ORR 实现。
! 概念示意(IOS-XR 思路):为某组客户端定义"视角"再反射 ! 实际配置依赖 RPL(Route Policy Language)与 ORR 组, ! 此处仅说明意图:RR 按客户端拓扑位置重算最优而非按自身
25BGP EVPN:数据中心的"控制平面之王"
如果你管理过数据中心,一定被"大二层"折磨过:VLAN 要跨机房延伸、虚拟机要任意漂移、租户要隔离又要互通。传统靠泛洪(flood-and-learn)的二层网络在规模一大就崩。EVPN(Ethernet VPN,RFC 7432)用 BGP 当控制平面,把 MAC、IP、主机可达性当成"路由"在 BGP 里通告,数据平面再用 VXLAN 或 MPLS 封装转发。
25.1 EVPN 的"路由类型"
| 类型 | 名字 | 通告什么 |
|---|---|---|
| Type 2 | MAC/IP Advertisement | 主机 MAC + IP 绑定(相当于"ARP 表"发全网) |
| Type 3 | Inclusive Multicast | 广播/未知单播的复制树成员(VTEP 列表) |
| Type 5 | IP Prefix | 整个 IP 子网/外部路由(L3 VNI 互通、连外网) |
| Type 1 / 4 | Ethernet Auto-Discovery / ES | 多归属、EVPN ESI 分叉检测 |
25.2 Cisco VXLAN + EVPN 配置骨架
在 Spine/Leaf 架构里,Leaf 是 VTEP(VXLAN 隧道端点), Leaf 之间用 eBGP(或 iBGP)在 L2VPN EVPN 地址族下交换 MAC/IP 路由。
! Leaf 上:把 BGP 当作 EVPN 控制平面 router bgp 65001 neighbor 192.0.2.254 remote-as 65001 ! 指向 Spine(RR) neighbor 192.0.2.254 update-source Loopback0 ! address-family l2vpn evpn neighbor 192.0.2.254 activate neighbor 192.0.2.254 send-community extended exit-address-family ! 把 VLAN 绑到 VNI,交给 EVPN 学习 vlan 10 vn-segment 10010 ! VLAN10 ↔ VNI 10010 interface nve1 no ip address source-interface Loopback0 member vni 10010 ingest-replication 192.0.2.254
26BGP FlowSpec:用 BGP 当"分布式防火墙"
传统 DDoS 防护的痛点是:攻击来了,你要在很多台路由器上手工写 ACL,慢且易错。BGP FlowSpec(RFC 5575 / 8956)的骚操作是:把"流量过滤/限速规则"本身编码成 BGP NLRI,通过 BGP 会话一键推送到全网。控制器算好规则,BGP 负责分发,路由器自动执行。
26.1 FlowSpec 能做什么
discard
直接丢弃匹配流量(黑洞攻击源)。
rate-limit
限速而非丢弃,适合"削峰"合法突发。
redirect
引流到清洗中心(scrubbing)。
remark
改 DSCP 标记,配合 QoS。
26.2 匹配维度与配置思路
FlowSpec 规则能匹配:源/目的 IP(带前缀长度)、IP 协议、源/目的端口、TCP 标志位、ICMP 类型等,组合起来就是一条"精准狙击"规则。
! 在 Cisco IOS-XE 上开启 FlowSpec 并接收规则 flowspec address-family ipv4 local-install interface-all ! 把规则装进接口生效 router bgp 65001 neighbor 10.1.1.2 remote-as 65002 address-family ipv4 flowspec neighbor 10.1.1.2 activate ! 接收对端发来的 FlowSpec 规则 exit-address-family
27BGP-LS 与 Segment Routing:BGP 牵手 SDN
传统 BGP 只传"可达性"。但当你想做流量工程(TE)——比如"让这条流量特意绕开拥塞链路"——光有 BGP 不够,还得知道全网拓扑和链路状态。于是 BGP 又扩展出一个新地址族。
27.1 BGP-LS(链路状态,RFC 7752)
IGP(OSPF/IS-IS)本来知道拓扑,但拓扑信息困在 AS 内部。BGP-LS 把 IGP 的拓扑、链路带宽、SRLG 等"翻译"成 BGP 路由,上报给 SDN 控制器。控制器拿到全网地图,就能用算法算最优 TE 路径,再通过 BGP 把"Segment 路径"下发给转发设备。
! 把 OSPF 拓扑通过 BGP-LS 报告给控制器(控制器作为 BGP-LS 邻居) router bgp 65001 neighbor 10.0.0.100 remote-as 65001 address-family link-state link-state neighbor 10.0.0.100 activate exit-address-family
27.2 Segment Routing(SR)与 SRv6
SR 的核心思想是:路径 = 一串"段"(Segment)的列表。源节点在包头压入一组标签(MPLS SR)或 IPv6 地址(SRv6),中间节点只按标签转发,无需逐跳维护状态。BGP 在这里负责传播 SR 策略(SR Policy)和 SRv6 SID。
- SR-MPLS:用标签栈表达路径,BGP 在"IPv4 SR 策略"地址族下发。
- SRv6:用 IPv6 地址(SID)表达,BGP 在"IPv6 SR 策略"地址族下发,天然支持 IPv6 网络编程。
! 简化示意:通过 BGP 下发一条 SR Policy(SR-MPLS) router bgp 65001 address-family ipv4 sr-policy neighbor 3.3.3.3 activate exit-address-family ! SR Policy 定义"去往某前缀,走 Segment 列表 [16001,16002]" ! 实际由控制器(SR-PCE)计算后经 BGP 分发,设备无需手工算路
28数据中心里的 BGP(RFC 7938):当 BGP 干起 IGP 的活
传统思维是"BGP 管外、IGP 管内"。但超大规模数据中心(如云厂商)反其道而行:整个 Fabric 全用 BGP(eBGP)做路由协议,不用 OSPF/IS-IS。Facebook、Microsoft 等巨头就是这么干的。RFC 7938 把这套做法标准化了。
28.1 为什么数据中心偏爱 eBGP
- 极简:不用维护 IGP 的复杂区域/链路状态数据库,每个节点只跑 BGP。
- 水平扩展:Spine/Leaf 每层用不同私有 AS,天然避免 AS 内 full mesh 问题(因为都是 eBGP,没有 iBGP 水平分割烦恼)。
- 快速收敛 + 一致策略:BGP 的策略模型统一,适合自动化。
28.2 典型 Spine-Leaf eBGP 设计
! Leaf 用 AS 65001,Spine 用 AS 65000,全 eBGP 互联(私有 AS) router bgp 65001 neighbor 169.254.1.1 remote-as 65000 ! 指向上联 Spine(点到点链路本地地址) neighbor 169.254.1.1 ebgp-multihop 255 ! 允许跨设备(常配 unnumbered) network 10.1.10.0 mask 255.255.255.0 ! 通告本 Leaf 下联子网
29BMP 监控运维:给 BGP 装"黑匣子"
BGP 出问题时,最痛苦的是"看不见过程"——你只能看到最终的路由表,却看不到邻居曾经发了什么、被策略挡了什么。BMP(BGP Monitoring Protocol,RFC 7854)就是解决这个:它把 BGP 的 adj-rib-in(邻居发来的全部)、adj-rib-out(我发出去的全部)、local-rib(本地选路结果)实时镜像给监控采集器,供分析和溯源。
29.1 BMP 三种 RIB 视角
| 视角 | 含义 | 用途 |
|---|---|---|
| adj-rib-in | 邻居发来、未经策略的 | 看"邻居到底给我什么",排查被过滤的路由 |
| adj-rib-out | 我发往邻居、经策略后的 | 审计"我向外宣告了什么" |
| local-rib | 本机最终采纳的 | 对比"收到 vs 采用",定位选路问题 |
29.2 配置 BMP 采集器
! 把 BGP 数据镜像到监控服务器 10.0.0.200:5000 router bgp 65001 bmp server 1 address 10.0.0.200 port 5000 bmp server 1 update-source Loopback0 bmp server 1 initialization-delay 30 ! address-family ipv4 bmp server 1 advertise all ! 镜像 adj-in / adj-out / local exit-address-family
30设计实战案例:把知识焊成方案
30.1 案例一:企业双归属多出口
场景:企业 AS 65001 同时接入两家运营商(AS 65002 电信、AS 65003 联通),要求"主备 + 智能选路"。
- 入方向(外面怎么进来):默认两家都收,但给 65002 的路由
as-path prepend加长,让外界优先从 65003 进来; - 出方向(内部怎么出去):给来自 65002 的路由
set local-pref 300,让内部优先走 65002 出去(主用); - 两边都配
maximum-prefix+ 前缀过滤,防止一家抖动拖垮自己。
! 出方向主用 65002 route-map RM-IN permit 10 set local-preference 300 router bgp 65001 neighbor 10.1.1.2 route-map RM-IN in ! 来自 65002 neighbor 10.2.2.2 route-map RM-PREPEND out ! 发给 65003 时 prepend
30.2 案例二:运营商 AS 合并 / 迁移
场景:两家运营商合并,要把 AS 65002 并入 AS 65001,又不能造成全网路由中断。
- 过渡期用
bgp confederation或双 AS 并存,让新旧 AS 互通; - 用 AS_SET 聚合平滑合并 AS_PATH,避免环路;
- 在边界用
as-override处理客户侧重复 AS; - 配合 Graceful Shutdown 逐步引流,最后下线旧 AS。
30.3 案例三:RR 集群分层设计
超大型 AS(几百台 PE)不能只放一组 RR。经典做法是分层 RR:核心层放一级 RR,汇聚层放二级 RR,二级 RR 之间再互相反射或经一级 RR 互联,形成"RR 的 RR",既避免单点,又控制反射域规模。
! 二级 RR (R2) 同时是 一级 RR(R1) 的客户端,又是本地客户端的 RR router bgp 65001 neighbor 1.1.1.1 remote-as 65001 ! 指一级 RR(我是其客户端) neighbor 1.1.1.1 update-source Loopback0 neighbor 4.4.4.4 route-reflector-client ! 本地客户端 neighbor 5.5.5.5 route-reflector-client
30.4 案例四:给全球路由表"瘦身"
场景:你是中小运营商,不想承载全表 90 万条,只想"默认路由 + 自己客户路由"。
- 向运营商要 默认路由(
neighbor x.x.x.x default-originate)走 transit; - 只接收客户/对等的具体路由(prefix-list 精准收);
- 自己对外只通告聚合后的地址块(
aggregate-address ... summary-only)。
router bgp 65001 neighbor 10.1.1.2 default-originate ! 向上游要默认路由即可 neighbor 10.1.1.2 prefix-list ONLY-CUST in ! 只收客户路由 aggregate-address 203.0.113.0 255.255.255.0 summary-only as-set
31附录:命令速查与术语表
31.1 常用 show / clear 命令速查
| 命令 | 作用 |
|---|---|
show ip bgp summary | 看邻居状态、收了几条路由(排查第一招) |
show ip bgp | 看完整 BGP 表及每条的 best 标记 |
show ip bgp <prefix> | 看某前缀的路径属性与选路原因 |
show ip bgp neighbors | 看邻居详情、能力、消息计数 |
show ip bgp neighbors x advertised-routes | 看我发给邻居的路由 |
show ip bgp neighbors x received-routes | 看邻居发我的(需 soft-reconfig) |
clear ip bgp * | 硬清(断邻居重连,慎用) |
clear ip bgp * soft | 软清(重发路由不拆邻居,常用) |
clear ip bgp x in/out | 对单个邻居软清入/出方向 |
show bgp l2vpn evpn | 看 EVPN 路由(数据中心) |
show ip bgp vpnv4 all | 看 MPLS VPN 路由 |
31.2 术语中英对照
AS / ASN
自治系统 / 自治系统号
eBGP / iBGP
外部 / 内部边界网关协议
NLRI
网络层可达性信息(前缀)
AS_PATH
AS 路径(防环 + 选路)
LOCAL_PREF
本地优先级(出方向)
MED
多出口鉴别符(入方向)
RR
路由反射器
ORR
最优路由反射
EVPN
以太网 VPN(数据中心控制平面)
VXLAN
虚拟扩展 VLAN(数据平面封装)
FlowSpec
流规则(分布式流量过滤)
SR / SRv6
段路由 / IPv6 段路由
BGP-LS
BGP 链路状态(上报拓扑给 SDN)
BMP
BGP 监控协议(路由遥测)
RPKI
资源公钥基础设施(防路由劫持)
31.3 写给进阶者的学习路径
- 打地基:把第 1–7 章的属性与选路规则背熟、能在白板上画状态机。
- 练手感:用 GNS3 / EVE-NG / CML 搭双 AS 拓扑,敲完第 8–17 章每一条配置并验证。
- 攻难点:RR、联邦、next-hop-self、Community 策略——这是运营商面试硬通货。
- 追前沿:EVPN、SRv6、FlowSpec、BMP——云与运营商网络的现在与未来。
- 读标准:有余力翻 RFC 4271(BGP-4)、4760(MP-BGP)、7938(数据中心 BGP)、7432(EVPN)。
从"会配 neighbor"到"能设计一张网",差的不是命令,而是对"策略、信任、博弈"的理解。这份手册陪你走完了大半,剩下的路,去真实设备上一行行敲出来吧。🛰️