BGP 从入门到精通

一本写给网络工程师的"互联网外交官"手册 —— 用 Cisco 设备把 BGP 从原理讲到实战,从邻居握手讲到选路裁决,从路由反射器讲到 RPKI 安全。

🌐 覆盖 BGP 全部核心知识点 🔧 Cisco IOS 实战配置全覆盖 📈 从 AS 到选路 13 条规则 🛡️ 含 MP-BGP / VPN / 安全

0开篇:互联网的电话簿

如果把互联网想象成一张巨大无比、由无数张"快递网"拼接而成的世界地图,那么 BGP 就是这些快递网之间互相通报"我能把你寄到哪儿"的外交协议

你每天刷视频、逛电商、打游戏,数据从你的手机出发,经过运营商、经过海底光缆、经过异国他乡的机房,最终抵达目标服务器。这一路上,没有任何一家公司拥有整张网络,而是成千上万个被称为 AS(自治系统) 的独立网络拼接而成。它们彼此并不互相信任,也各有各的小算盘——有的想省钱走便宜的出口,有的想保证质量走快线。那么问题来了:当数据包抵达网络 A 的边缘,A 凭什么知道"去往 8.8.8.8 下一跳该交给谁"?

答案就是 BGP(Border Gateway Protocol,边界网关协议)。它是整个互联网的"电话簿"和"路由交易所"。没有 BGP,互联网就会像没有邮政编码的世界,信件只能靠运气乱投。据估计,今天活跃在公网上的 IPv4 路由前缀大约有 90 多万条,IPv6 也有数万条,它们全靠 BGP 在不同 AS 之间互相广播、博弈、择优。

💡 一句话记住 BGP BGP 是唯一的外部网关协议(EGP)事实标准,它干的活儿不是"发现我家里的路"(那是 OSPF、EIGRP 这些 IGP 的事),而是"告诉邻居:去世界的某个角落,从我家门口走最划算"。它是路径矢量(Path Vector)协议,是基于策略的、几乎全靠人工"调参"的、运行在 TCP 之上的"慢而稳"的协议。

接下来,我会用 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",本质上是一家人。

⚠️ 常见误解 有人以为 BGP 是"距离矢量协议",这是半个错误。BGP 是路径矢量协议(Path Vector),它携带完整的 AS_PATH(路径上经过的所有 AS 号码),靠这个来防环和做策略,和 RIP 那种只报"跳数"的距离矢量有本质区别。

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 路由器之间
默认 TTL1(直连才能建邻居)255(可跨多跳)
管理距离20200
下一跳处理自动改为自己默认不改(需 next-hop-self)
路由传递规则发给任何邻居从 iBGP 学到的路由不再发给其他 iBGP(防环)
AS_PATH每经过一个 eBGP 加一个 AS不变
💡 iBGP 的"水平分割" iBGP 有个铁律:"从 iBGP 邻居学来的路由,绝不再通告给其他 iBGP 邻居"。这避免了 AS 内部的路由环路,但也带来一个头疼问题——AS 内所有 iBGP 路由器必须全网互联(full mesh),否则中间会"漏路由"。后面的路由反射器和联邦,就是为了解决这个 full mesh 噩梦。

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
💡 双工原则 eBGP 邻居必须两边互相指定对方。R1 说"R2 是 AS 65002",R2 也得说"R1 是 AS 65001"。而且两边的 remote-as 必须和实际 AS 对得上,否则邻居关系会卡在 Active 状态(后面状态机章节细讲)。

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(撤销路由):哪些前缀我刚才说有、现在没了。
💡 UPDATE 的优雅之处 BGP 的 UPDATE 是"增量 + 触发"的。路由没变,它就闭嘴;变了才发。而且它能把一堆路由打包在一个 UPDATE 里通告,大大省带宽。这和 RIP 那种"每隔 30 秒把整张表广播一遍"形成鲜明对比。

④ 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 里那一栏栏的字母到底在说什么。

  1. Idle( idle,发呆):初始状态,拒绝一切连接。如果配置错误(比如邻居 IP 不可达),就长期卡这里。
  2. Connect( connect,拨号中):发起 TCP 三次握手。成功就进 Opensent,失败就进 Active 重试。
  3. Active( active,主动重连):TCP 没建起来,正在锲而不舍地重试。卡在这里通常是底层 IP 不通 / 没有去往邻居的路由 / ACL 挡了 179 端口
  4. OpenSent( opensent,递名片):TCP 通了,发出 OPEN 等对方 OPEN。如果对端 AS 号写错,会在这里收到 NOTIFICATION 然后回 Idle。
  5. OpenConfirm( openconfirm,确认中):双方 OPEN 都对上了,等最后一个 KEEPALIVE 确认。
  6. Established( established,喜结连理):邻居稳了!开始交换 UPDATE。这才是你想要的终态。
状态你看到它意味着常见病因
Idle根本没开始邻居 IP 不可达、没路由
ActiveTCP 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 条路由;如果显示 ActiveIdle,那就是建邻居失败了,按上表对症排查。

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 越短越优 选路时,AS_PATH 短的胜出(路径经过的 AS 少 = 通常更近/更靠谱)。所以运营商经常用 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 的默认选路算法如下(从最高优先级往下):

  1. Weight(权重):Cisco 私有,本机有效,越大越优。
  2. Local Preference(本地优先级):AS 内一致,越大越优。
  3. 本地起源(Locally Originated):自己 network/redistribute 进来的优先于邻居学的。
  4. AS_PATH 长度:越短越优。
  5. Origin 类型:IGP(i) > EGP(e) > Incomplete(?)。
  6. MED:越小越优(仅当来自同一相邻 AS)。
  7. eBGP 优于 iBGP:从外部学来的优先于从内部学来的。
  8. 到下一跳的 IGP 度量(IGP metric):去往 NEXT_HOP 的内部路由,成本小的优。
  9. 负载均衡:如果以上全平,且开启了 maximum-paths,可等价多路径。
  10. 最老的路径(eBGP):老牌路径优先(稳定优先)。
  11. 最小的 Router-ID:比邻居的 BGP Router-ID,小的赢。
  12. 最小的邻居 IP 地址:最后兜底,比邻居的 IP,小的赢。
⚠️ 记忆口诀 老工程师编了口诀:"权重本地起,路径起源 MED,外内度量老,ID 地址小"。前两条(Weight、Local_Pref)是工程师最能"人工操控"的,所以日常调优 90% 都在玩这两样 + AS_PATH + MED。
! 查看路由器最终为每条前缀选了哪条"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 的精确匹配陷阱 很多人敲 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     ! 关键!把下一跳改成自己
💡 经验法则 凡是 eBGP 学来的路由要透传给 iBGP 邻居,几乎都要在边界做 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
💡 冗余设计 实际部署通常配两台 RR 做冗余(所有 Client 同时挂两台 RR),避免 RR 单点故障把全 AS 路由搞崩。RR 之间可以是普通 iBGP 邻居。

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(联邦内)
⚠️ RR 还是联邦? 现代网络几乎清一色用 RR。联邦配置更绕、运维更麻烦,且子 AS 之间仍可能要 full mesh(如果子 AS 内路由器多)。除非是超大超复杂的场景,否则 RR 是首选。面试时你能把两者区别讲清楚就加分。

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
💡 为什么 as-set 重要 不加 as-set 时,聚合路由的 AS_PATH 只有自己,可能让被聚合的源头 AS 误以为"这条路不经过我"而引发环路或黑洞。as-set 把真实的 AS 集合塞进路径,保守且安全。代价是聚合路由可能因任一成员 AS_PATH 变化而"抖动",需要配合 dampening(第十六章)。

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
💡 route-map 铁律 route-map 有隐式 deny any 在最后!如果你只写了 permit 10,没写 permit 20,那所有没匹配上的路由都会被丢掉。要放行其余路由,务必加一条 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
⚠️ send-community 不写就白忙 在 Cisco 上,默认邻居不会传递 community 属性。你打了标签却忘了 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:最多关多久(防止永久封禁)。
💡 辩证看待 阻尼能稳定网络,但也可能"误伤"正常路由、拖慢收敛。现代很多运营商在 iBGP 上默认不开阻尼,只在 eBGP 边缘针对性开启。RFC 建议的默认值常被调优,别无脑抄。

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
💡 新旧写法 老 IOS 默认所有邻居在 IPv4 单播族下自动激活;新 IOS-XE/IOS-XR 默认不自动激活,必须在 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(RT)是灵魂 每个 VRF 通过 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
⚠️ 防御是分层的 MD5 防"伪装邻居",TTL Security 防"近距中间人",前缀过滤防"乱宣告别人的地址",RPKI 防"资源归属造假"。生产环境建议四者叠加,并配合最大前缀限制(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 次丢了就判死
💡 BFD 的真相 BFD 只负责"快速发现"故障,真正的路由切换还得靠 BGP 重算 + 转发表更新。想做到转发面"无丢包"切换,还得配合下一节的 BGP PIC

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
⚠️ 内存代价 Add-Path 会把 RIB 体积放大数倍(每条前缀多存路径),在路由海量(如运营商 PE)的设备上要评估内存。通常只在"需要快速保护切换"的关键节点开。

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 按客户端拓扑位置重算最优而非按自身
💡 一句话区分 Add-Path 解决"客户端看不到备份";ORR 解决"RR 选的路对客户端不是真最优"。两者常常一起上,构成运营商级 RR 的高可用双保险。

25BGP EVPN:数据中心的"控制平面之王"

如果你管理过数据中心,一定被"大二层"折磨过:VLAN 要跨机房延伸、虚拟机要任意漂移、租户要隔离又要互通。传统靠泛洪(flood-and-learn)的二层网络在规模一大就崩。EVPN(Ethernet VPN,RFC 7432)用 BGP 当控制平面,把 MAC、IP、主机可达性当成"路由"在 BGP 里通告,数据平面再用 VXLAN 或 MPLS 封装转发。

25.1 EVPN 的"路由类型"

类型名字通告什么
Type 2MAC/IP Advertisement主机 MAC + IP 绑定(相当于"ARP 表"发全网)
Type 3Inclusive Multicast广播/未知单播的复制树成员(VTEP 列表)
Type 5IP Prefix整个 IP 子网/外部路由(L3 VNI 互通、连外网)
Type 1 / 4Ethernet 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
💡 为什么数据中心爱 EVPN 它把"二层学习"从数据平面搬到了 BGP 控制平面:主机上线,Leaf 发一条 Type 2 路由,全网立刻知道"这个 IP 在哪儿",不再靠泛洪。规模上千台服务器也不怕,还顺带解决了多租户隔离、虚拟机迁移、双活网关。

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
⚠️ 规则也有"选路" FlowSpec 规则存在优先级,更具体的规则(匹配字段多)优先于宽泛规则。而且规则是自动下发全网的,一旦写错(比如匹配了 0.0.0.0/0 全部丢弃),后果是"全网瞬间断网"。务必在控制器侧加审批与回滚。

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 分发,设备无需手工算路
💡 三者关系一句话 IGP/IS-IS 采集拓扑 → BGP-LS 上报控制器 → 控制器算 SR 路径 → BGP 下发 SR Policy → 设备按标签/Segment 转发。这就是现代"意图驱动网络(IBN)"的骨干逻辑。

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 下联子网
💡 两个数据中心 BGP 小技巧 ① Unnumbered(IPv6 链路本地):Leaf-Spine 互联不配 IP,直接用 link-local 地址当邻居源,省地址、易自动化。② allowas-in / as-override:当多 Leaf 用同一私有 AS(或客户侧 AS 重复)时,用这些命令绕过"AS_PATH 防环拒绝"。
⚠️ 别在数据中心开 dampening 数据中心内部收敛要快,阻尼会拖慢。RFC 7938 明确建议数据中心 BGP不要启用 dampening,且把 eBGP 的 Hold Time 调小(如 3 秒)以加速检测。

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
💡 运维必须盯的指标 接上 BMP 后,重点监控:路由条目数突变(暴涨可能是被注入/劫持)、邻居 withdraw 风暴(可能链路抽风)、某前缀的 AS_PATH 变化(可能路由劫持)、peer 震荡频率。结合 Grafana 做可视化告警,BGP 运维从此"有迹可循"。

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. 打地基:把第 1–7 章的属性与选路规则背熟、能在白板上画状态机。
  2. 练手感:用 GNS3 / EVE-NG / CML 搭双 AS 拓扑,敲完第 8–17 章每一条配置并验证。
  3. 攻难点:RR、联邦、next-hop-self、Community 策略——这是运营商面试硬通货。
  4. 追前沿:EVPN、SRv6、FlowSpec、BMP——云与运营商网络的现在与未来。
  5. 读标准:有余力翻 RFC 4271(BGP-4)、4760(MP-BGP)、7938(数据中心 BGP)、7432(EVPN)。

从"会配 neighbor"到"能设计一张网",差的不是命令,而是对"策略、信任、博弈"的理解。这份手册陪你走完了大半,剩下的路,去真实设备上一行行敲出来吧。🛰️