Skip to content

Instantly share code, notes, and snippets.

@mofelee
Last active May 11, 2026 05:37
Show Gist options
  • Select an option

  • Save mofelee/f723107d8739cde44192e7971a38cd14 to your computer and use it in GitHub Desktop.

Select an option

Save mofelee/f723107d8739cde44192e7971a38cd14 to your computer and use it in GitHub Desktop.

BIRD2 BGP 查询 Cheatsheet:SQL 类比版

这份笔记分两层:

先看前面的 Cheatsheet:日常排障够用。
后面的字段字典:忘记字段含义时再查。

0. 一页速查版

0.1 你最常查的 4 张“表”

SQL 类比表 BIRD2 里看什么 常用命令
protocols BGP peer/session 状态 birdc show protocols
loc_rib 当前路由表 / 最佳路由 birdc show route
adj_rib_in 某 peer 发给我的路由 birdc show route import table bgp_x.ipv4 all
adj_rib_out 我要发给某 peer 的路由 birdc show route export table bgp_x.ipv4 all

0.2 最常用字段

字段 含义 常见查询
prefix 目的网段 show route 1.1.1.0/24 all
source_protocol 路由来自哪个 peer/protocol show route protocol bgp_isp_a all
bgp_path AS_PATH where bgp_path ~ [= * 15169 * =]
bgp_next_hop BGP UPDATE 里的 NEXT_HOP where bgp_next_hop = 203.0.113.1
gw 实际转发下一跳 where gw = 203.0.113.1
bgp_local_pref 本 AS 内选路优先级,越大越优先 where bgp_local_pref > 150
bgp_med MED,通常越小越优先 where bgp_med = 50
bgp_community 普通 community where bgp_community ~ [(65000,100)]
* 当前最佳路由 show route 输出里看 *

0.3 最常用命令

你想知道 命令
BGP peer 是否起来 birdc show protocols
某个 peer 详细状态 birdc show protocols all bgp_isp_a
当前路由表 birdc show route
去某 IP 走哪条路 birdc show route for 8.8.8.8 all
查某个前缀 birdc show route 198.51.100.0/24 all
查某 peer 给我的路由 birdc show route protocol bgp_isp_a all
查 AS_PATH 包含某 AS birdc show route where bgp_path ~ [= * 15169 * =] all
查 BGP NEXT_HOP birdc show route where bgp_next_hop = 203.0.113.1 all
查实际下一跳 birdc show route where gw = 203.0.113.1 all
查 community birdc show route where bgp_community ~ [(65000,100)] all
查会不会 export 给 peer birdc show route export bgp_isp_b all
查被 export filter 拒绝的路由 birdc show route noexport bgp_isp_b all

0.4 最小排障流程

看 peer 是否正常

birdc show protocols all bgp_isp_a

看 peer 给了我什么路由

birdc show route protocol bgp_isp_a all

看去某个 IP 最终走哪里

birdc show route for 8.8.8.8 all

看为什么没发给某个 peer

birdc show route preexport bgp_isp_b all
birdc show route export bgp_isp_b all
birdc show route noexport bgp_isp_b all

0.5 最核心区别

bgp_next_hop = BGP 报文里说的 NEXT_HOP
gw = BIRD 算出来真正发包用的下一跳

日常排障时:

看 BGP 属性,用 bgp_next_hop。
看实际转发,用 gw。

1. 总体心智模型

BGP daemon 内部可以粗略理解为几类“表”:

Peer / Protocols   :BGP 邻居与协议状态
Adj-RIB-In         :从每个 peer 收到的路由
Loc-RIB            :本机经过策略和选路后保留的路由表
Adj-RIB-Out        :准备通告给每个 peer 的路由
Kernel / FIB       :真正安装到系统内核里的转发表

在 BIRD2 里,常用查询入口是:

birdc show protocols
birdc show route

可以把 birdc 想象成一个只读 SQL 客户端。


2. 概念表对应关系

BGP / BIRD2 概念 SQL 类比表 说明
Protocol / Peer protocols / bgp_peers BGP 邻居、协议状态、session 信息
Routing table loc_rib BIRD 当前保存和选择的路由表
Best route loc_rib WHERE best = true 某个 prefix 当前选中的最优路由
Import table adj_rib_in 某个 peer 发来的原始接收路由,需开启 import table
Export table adj_rib_out 准备发给某个 peer 的路由,需开启 export table
Kernel route fib 被安装进内核的实际转发表
BGP attributes path_attributes AS_PATH、NEXT_HOP、LOCAL_PREF、MED、community 等

3. 表与字段对应关系

这一节把前面类比出来的“SQL 表”拆成字段字典。字段名不是 BIRD2 内部真实数据库字段,而是为了理解和排障抽象出来的逻辑字段。


3.1 protocols / bgp_peers:BGP 邻居与协议状态表

对应 BIRD2 查询:

birdc show protocols
birdc show protocols all <protocol_name>
SQL 类比字段 BIRD2 对应信息 / 常见输出 描述
name Name / protocol 名 BIRD 配置里的协议实例名,例如 bgp_isp_a。很多查询都用它作为 peer/protocol 标识。
proto Proto 协议类型,例如 BGPKernelDeviceStatic
table Table / channel table 该协议连接的 routing table,例如 master4master6
state State BIRD protocol 状态,例如 updownstart
info Info 协议补充状态。BGP 常见为 EstablishedIdleActive 等。
since Since 当前状态从什么时候开始。用于判断 session 是否刚 flap 过。
local_as Local AS / 配置项 local ... as ... 本机 AS 号。eBGP/iBGP 判断和 AS_PATH 处理都会用到。
peer_as Neighbor AS / 配置项 neighbor ... as ... 对端 BGP 邻居的 AS 号。
local_ip local address 本机与 peer 建立 BGP session 使用的地址。
peer_ip neighbor address 对端 BGP peer 地址。
router_id Router ID 本机 BGP Router ID,通常是 IPv4 格式标识符,不一定是真实转发地址。
session_state BGP state BGP FSM 状态,例如 IdleConnectActiveOpenSentOpenConfirmEstablished
hold_time Hold timer BGP hold timer。超时没收到 KEEPALIVE/UPDATE 时会断 session。
keepalive_interval Keepalive timer KEEPALIVE 发送间隔,通常约为 hold time 的三分之一。
capabilities Capabilities BGP OPEN 中协商的能力,例如 4-byte ASN、MP-BGP、Route Refresh、Graceful Restart、Add-Path。
import_filter Import filter 接收路由进入本地表之前应用的过滤规则。
export_filter Export filter 本地路由通告给该 peer 前应用的过滤规则。
rx_routes Import updates / routes 统计 从该 peer 接收的路由或 UPDATE 统计,用于粗略判断是否在收路由。
tx_routes Export updates / routes 统计 发给该 peer 的路由或 UPDATE 统计,用于粗略判断是否在出路由。
last_error Last error 最近一次 session 错误或断开原因。

3.2 loc_rib:本机当前路由表 / 最优路由候选表

对应 BIRD2 查询:

birdc show route
birdc show route all
birdc show route for <ip> all
birdc show route <prefix> all
SQL 类比字段 BIRD2 对应信息 / 属性 描述
table Table master4: / Table master6: 路由所在的 BIRD routing table。IPv4/IPv6 常分不同表。
afi channel / table 类型 地址族,例如 IPv4、IPv6。BIRD 中常通过 ipv4 / ipv6 channel 和 master4 / master6 体现。
safi channel 类型 子地址族,例如 unicast。简单 IPv4/IPv6 BGP 通常是 unicast。
prefix 路由前缀 目的网络,例如 198.51.100.0/24
prefix_len 前缀长度 CIDR 长度,例如 /24 中的 24
source_protocol [bgp_isp_a ...] 这条路由来自哪个 BIRD protocol。
selected / best * 是否为当前 prefix 被选中的最佳路由。
preference (100) BIRD route preference。不同协议/策略可设置不同 preference。
route_type unicast / blackhole / unreachable 路由类型。BGP 常见是 unicast
gw via <ip> on <iface> BIRD 计算出的实际 immediate gateway,真正转发时用。
interface on eth0 实际出接口。
metric route metric / IGP metric 到下一跳的内部成本,可能影响 BGP tie-break 或内核安装。
installed kernel protocol 状态 / 是否导入 kernel 是否已经被安装到内核 FIB。BIRD 路由表有路由,不代表一定进了内核。
updated_at route timestamp 这条路由进入当前状态的时间。
best_reason 无固定单字段,需结合属性判断 为什么这条赢,例如 local-pref 更高、AS_PATH 更短、MED 更低等。BIRD 输出通常需要人工推断。

3.3 path_attributes:BGP 路径属性表

对应 BIRD2 查询:

birdc show route <prefix> all
birdc show route where ... all
SQL 类比字段 BIRD2 属性名 / 输出 描述
bgp_next_hop bgp_next_hop BGP UPDATE 里携带的 NEXT_HOP attribute。注意它不一定等于实际 gw
gw via ... / gw BIRD 递归解析后得到的实际下一跳。转发查这个更直接。
bgp_path bgp_path AS_PATH,表示到达该 prefix 需要经过的 AS 序列。用于防环和选路。
bgp_origin bgp_origin ORIGIN 属性,常见值有 ORIGIN_IGPORIGIN_EGPORIGIN_INCOMPLETE
bgp_local_pref bgp_local_pref LOCAL_PREF。本 AS 内部选路常用,值越大越优先。通常 iBGP 内传播。
bgp_med bgp_med MED。通常用于告诉相邻 AS 从哪个入口进来更好,值越小越优先。
bgp_community bgp_community 普通 BGP community 列表。BIRD 中普通 community 写作 (asn,value)
bgp_large_community bgp_large_community Large Community,通常写成三元组,例如 (65000,1,100)。适合 4-byte ASN 场景。
bgp_ext_community bgp_ext_community Extended Community,常用于 VPN、RT/RD、流量工程等场景。
bgp_originator_id bgp_originator_id Route Reflector 场景使用,表示原始发起路由的 router-id。
bgp_cluster_list bgp_cluster_list Route Reflector 防环使用,记录经过的 cluster。
atomic_aggregate bgp_atomic_aggr / 相关属性 表示路由经过聚合,可能丢失了更具体的 AS_PATH 信息。
aggregator_as aggregator 相关属性 表示执行聚合的 AS。
aggregator_router_id aggregator 相关属性 表示执行聚合的 router-id。

3.4 adj_rib_in:从某个 peer 收到的路由表

对应 BIRD2 查询:

birdc show route import table <protocol>.<channel>
birdc show route import table <protocol>.<channel> all

前提是 BGP channel 中开启:

import table on;
SQL 类比字段 BIRD2 对应信息 / 属性 描述
peer <protocol> 路由来自哪个 BGP peer,例如 bgp_isp_a
channel <protocol>.ipv4 / <protocol>.ipv6 BIRD2 BGP channel 名,常见是 ipv4ipv6
prefix route prefix peer 通告的目的前缀。
bgp_next_hop bgp_next_hop peer 在 UPDATE 中携带的 BGP NEXT_HOP。
bgp_path bgp_path peer 通告来的 AS_PATH。
bgp_origin bgp_origin peer 通告来的 ORIGIN。
bgp_med bgp_med peer 通告来的 MED。
bgp_local_pref bgp_local_pref iBGP 场景可能出现;eBGP 通常不会从外部收到 local-pref。
communities bgp_community / large / ext peer 通告来的 community 集合。
received_at route timestamp 该路由被接收或更新的时间。
import_policy_result import filter 结果 是否通过 import filter。BIRD 查询视图不同,能看到的信息也不同。
rejected_reason filter debug / log 如果被 import filter 拒绝,原因通常要看 filter 逻辑或日志。

3.5 adj_rib_out:准备发给某个 peer 的路由表

对应 BIRD2 查询:

birdc show route export table <protocol>.<channel>
birdc show route export table <protocol>.<channel> all

前提是 BGP channel 中开启:

export table on;
SQL 类比字段 BIRD2 对应信息 / 属性 描述
peer <protocol> 目标 BGP peer,例如 bgp_isp_b
channel <protocol>.ipv4 / <protocol>.ipv6 对应的 BGP address family channel。
prefix route prefix 准备通告给 peer 的前缀。
bgp_next_hop bgp_next_hop 出口方向最终携带的 BGP NEXT_HOP。可能被 export policy 或 next-hop self 修改。
bgp_path bgp_path 出口方向最终携带的 AS_PATH。eBGP 通告时通常会 prepend 本 AS。
bgp_origin bgp_origin 出口方向携带的 ORIGIN。
bgp_med bgp_med 出口方向携带的 MED。可能被 export policy 设置或删除。
bgp_community bgp_community 出口方向携带的普通 community。可能被 export policy 增删改。
bgp_large_community bgp_large_community 出口方向携带的 large community。
bgp_ext_community bgp_ext_community 出口方向携带的 extended community。
export_policy_result export filter 结果 该路由是否通过 export filter。
advertised export table 中存在 / UPDATE 已发送 是否已经准备或实际通告给 peer。
withdrawn withdraw 状态 / 不再存在 如果路由撤销,会从 Adj-RIB-Out 消失或产生 withdraw 行为。

3.6 fib / kernel_routes:内核转发表

对应 BIRD2 查询:

birdc show protocols all kernel1
birdc show route
ip route
ip -6 route
SQL 类比字段 BIRD2 / Linux 对应信息 描述
prefix ip route 中的目的前缀 内核实际用于转发匹配的目的网络。
gateway via <ip> 内核实际下一跳。
interface dev <iface> 出接口。
metric metric 内核路由 metric。
source_protocol BIRD kernel protocol / proto bird 路由来源,可能显示为 BIRD 安装。
installed_at 无统一字段 进入内核的时间通常需要从 BIRD 状态或日志判断。
sync_status kernel protocol 状态 BIRD 路由表与内核 FIB 是否同步。

注意:

Loc-RIB 有路由 ≠ 内核一定有路由。

可能因为 kernel export filter、路由类型、下一跳不可达、权限或冲突导致没有安装进内核。


3.7 字段名速查:BIRD2 属性 vs SQL 类比

BIRD2 字段 / 属性 SQL 类比字段 所属逻辑表 说明
Name name protocols protocol 实例名
Proto proto protocols 协议类型
Table table protocols / loc_rib 路由表名
State state protocols 协议状态
Info info protocols 协议补充状态
* best / selected loc_rib 当前最佳路由
via ... gw / gateway loc_rib / fib 实际下一跳
on <iface> interface loc_rib / fib 出接口
(100) preference loc_rib BIRD route preference
bgp_path bgp_path path_attributes AS_PATH
bgp_next_hop bgp_next_hop path_attributes BGP NEXT_HOP attribute
bgp_local_pref local_pref path_attributes LOCAL_PREF
bgp_med med path_attributes MED
bgp_origin origin path_attributes ORIGIN
bgp_community communities path_attributes 普通 community
bgp_large_community large_communities path_attributes large community
bgp_ext_community extended_communities path_attributes extended community
import table adj_rib_in adj_rib_in 接收侧原始/近原始路由视图
export table adj_rib_out adj_rib_out 出口侧准备通告的路由视图

4. 查 BGP peer / protocol 状态

SQL 类比

SELECT name, proto, table, state, since, info
FROM protocols;

BIRD2 命令

birdc show protocols

示例输出:

Name       Proto      Table      State  Since         Info
kernel1    Kernel     master4    up     10:00:01
bgp_isp_a  BGP        master4    up     10:00:05    Established
bgp_isp_b  BGP        master4    up     10:00:07    Established

字段含义:

输出字段 含义
Name BIRD 配置里的 protocol 名称
Proto 协议类型,例如 BGP、Kernel、Device
Table 连接的 routing table
State 协议是否 up
Info BGP 是否 Established 等补充状态

4. 查某个 BGP peer 详情

SQL 类比

SELECT *
FROM protocols
WHERE name = 'bgp_isp_a';

BIRD2 命令

birdc show protocols all bgp_isp_a

常用于查看:

BGP session 状态
neighbor AS
local AS
BGP capabilities
import/export filter 状态
channel 状态
收发路由数量
上次 flap / error 信息

5. 查 Loc-RIB:当前路由表

SQL 类比

SELECT *
FROM loc_rib;

BIRD2 命令

birdc show route

示例输出:

Table master4:
198.51.100.0/24    unicast [bgp_isp_a 10:02:01] * (100) [AS64496i]
        via 203.0.113.1 on eth0
                   unicast [bgp_isp_b 10:02:03] (100) [AS64502i]
        via 198.51.100.1 on eth1

重要符号:

字段 / 符号 含义
198.51.100.0/24 目的前缀
bgp_isp_a 路由来源 protocol
* 当前被选中的最佳路由
(100) BIRD route preference
via 203.0.113.1 实际 gateway / 下一跳
[AS64496i] BGP path/origin 的简写

6. 查当前最佳路由

SQL 类比

SELECT *
FROM loc_rib
WHERE best = true;

BIRD2 命令

birdc show route primary

7. 查某个目的 IP 会走哪条路

SQL 类比

SELECT *
FROM loc_rib
WHERE prefix CONTAINS '8.8.8.8'
ORDER BY best DESC
LIMIT 1;

BIRD2 命令

birdc show route for 8.8.8.8

看完整属性:

birdc show route for 8.8.8.8 all

这条命令很常用于排障,因为它直接回答:

如果现在发包去 8.8.8.8,BIRD 会选择哪条路?

8. 查某个 prefix

SQL 类比

SELECT *
FROM loc_rib
WHERE prefix = '198.51.100.0/24';

BIRD2 命令

birdc show route 198.51.100.0/24

看完整属性:

birdc show route 198.51.100.0/24 all

9. 查某个 peer 导入到路由表里的路由

SQL 类比

SELECT *
FROM loc_rib
WHERE source_protocol = 'bgp_isp_a';

BIRD2 命令

birdc show route protocol bgp_isp_a

看完整属性:

birdc show route protocol bgp_isp_a all

注意:这查的是已经进入 BIRD routing table 的路由,不一定等于完整 Adj-RIB-In。

如果某条路由被 import filter 拒绝,而且没有开启 import table,它可能不会被保留下来。


10. 查 Adj-RIB-In:从 peer 收到的原始路由

前提:配置里开启 import table

protocol bgp bgp_isp_a {
    local 203.0.113.2 as 65000;
    neighbor 203.0.113.1 as 64501;

    ipv4 {
        import table on;
        import all;
        export none;
    };
}

SQL 类比

SELECT *
FROM adj_rib_in
WHERE peer = 'bgp_isp_a';

BIRD2 命令

birdc show route import table bgp_isp_a.ipv4

看完整属性:

birdc show route import table bgp_isp_a.ipv4 all

说明:

import table ≈ Adj-RIB-In

它表示某个 BGP peer 发来的、进入 import filter 之前或接近原始接收侧的路由视图。


11. 查 Adj-RIB-Out:准备发给某个 peer 的路由

前提:配置里开启 export table

protocol bgp bgp_isp_b {
    local 198.51.100.2 as 65000;
    neighbor 198.51.100.1 as 64502;

    ipv4 {
        export table on;
        import all;
        export all;
    };
}

SQL 类比

SELECT *
FROM adj_rib_out
WHERE peer = 'bgp_isp_b';

BIRD2 命令

birdc show route export table bgp_isp_b.ipv4

看完整属性:

birdc show route export table bgp_isp_b.ipv4 all

说明:

export table ≈ Adj-RIB-Out

它表示经过 export filter 后,准备通告给指定 peer 的路由。


12. 用 WHERE 条件过滤

BIRD2 的 show route where ... 可以类比 SQL 的 WHERE


12.1 查 AS_PATH 包含某个 AS

SQL 类比

SELECT *
FROM loc_rib
WHERE bgp_path CONTAINS 15169;

BIRD2 命令

birdc show route where bgp_path ~ [= * 15169 * =]

看完整属性:

birdc show route where bgp_path ~ [= * 15169 * =] all

含义:

查所有 AS_PATH 里出现过 AS15169 的路由。

12.2 查来自某个 peer 且 AS_PATH 包含某 AS

SQL 类比

SELECT *
FROM loc_rib
WHERE source_protocol = 'bgp_isp_a'
  AND bgp_path CONTAINS 15169;

BIRD2 命令

birdc show route protocol bgp_isp_a where bgp_path ~ [= * 15169 * =] all

12.3 查 BGP NEXT_HOP

BIRD2 里要区分两个字段:

字段 含义
bgp_next_hop BGP UPDATE 里的 NEXT_HOP attribute
gw BIRD 计算出的实际 immediate gateway,用于转发

SQL 类比

SELECT *
FROM loc_rib
WHERE bgp_next_hop = '203.0.113.1';

BIRD2 命令

birdc show route where bgp_next_hop = 203.0.113.1 all

12.4 查实际 gateway

SQL 类比

SELECT *
FROM loc_rib
WHERE gw = '203.0.113.1';

BIRD2 命令

birdc show route where gw = 203.0.113.1 all

12.5 查 community

SQL 类比

SELECT *
FROM loc_rib
WHERE communities CONTAINS '65000:100';

BIRD2 命令

birdc show route where bgp_community ~ [(65000,100)] all

注意:

BIRD2 普通 community 写作 pair:
(65000,100)

不是字符串:

65000:100

12.6 查 local-pref

SQL 类比

SELECT *
FROM loc_rib
WHERE bgp_local_pref > 150;

BIRD2 命令

birdc show route where bgp_local_pref > 150 all

12.7 查 MED

SQL 类比

SELECT *
FROM loc_rib
WHERE bgp_med = 50;

BIRD2 命令

birdc show route where bgp_med = 50 all

12.8 查 ORIGIN

SQL 类比

SELECT *
FROM loc_rib
WHERE bgp_origin = 'IGP';

BIRD2 命令

birdc show route where bgp_origin = ORIGIN_IGP all

常见 origin:

ORIGIN_IGP
ORIGIN_EGP
ORIGIN_INCOMPLETE

13. 查是否会 export 给某个 peer

这不是直接查 export table,而是问:如果这些路由经过某个 protocol 的 export filter,会不会被导出。

SQL 类比

SELECT *
FROM loc_rib
WHERE export_policy('bgp_isp_b') = true;

BIRD2 命令

birdc show route export bgp_isp_b

看完整属性:

birdc show route export bgp_isp_b all

14. 查 export filter 之前的候选路由

SQL 类比

SELECT *
FROM loc_rib
WHERE export_candidate_before_filter('bgp_isp_b') = true;

BIRD2 命令

birdc show route preexport bgp_isp_b all

用途:

确认某条路由在进入 export filter 之前是否存在。

15. 查被 export filter 拒绝的路由

SQL 类比

SELECT *
FROM loc_rib
WHERE export_policy('bgp_isp_b') = false;

BIRD2 命令

birdc show route noexport bgp_isp_b all

用途:

排查为什么某条路由没有通告给某个 BGP neighbor。

16. 常用查询速查表

目标 SQL 类比 BIRD2 命令
查所有协议/邻居 SELECT * FROM protocols; birdc show protocols
查某 peer 详情 SELECT * FROM protocols WHERE name='bgp_isp_a'; birdc show protocols all bgp_isp_a
查当前路由表 SELECT * FROM loc_rib; birdc show route
查最佳路由 SELECT * FROM loc_rib WHERE best=true; birdc show route primary
查到某 IP 的路由 SELECT * FROM loc_rib WHERE prefix CONTAINS '8.8.8.8'; birdc show route for 8.8.8.8
查某前缀 SELECT * FROM loc_rib WHERE prefix='198.51.100.0/24'; birdc show route 198.51.100.0/24 all
查某 peer 导入路由 SELECT * FROM loc_rib WHERE source_protocol='bgp_isp_a'; birdc show route protocol bgp_isp_a all
查 AS_PATH 包含某 AS WHERE bgp_path CONTAINS 15169 birdc show route where bgp_path ~ [= * 15169 * =] all
查 BGP NEXT_HOP WHERE bgp_next_hop='203.0.113.1' birdc show route where bgp_next_hop = 203.0.113.1 all
查实际 gateway WHERE gw='203.0.113.1' birdc show route where gw = 203.0.113.1 all
查 community WHERE communities CONTAINS '65000:100' birdc show route where bgp_community ~ [(65000,100)] all
查 local-pref WHERE bgp_local_pref > 150 birdc show route where bgp_local_pref > 150 all
查 MED WHERE bgp_med = 50 birdc show route where bgp_med = 50 all
查会 export 给 peer 的路由 WHERE export_policy(peer)=true birdc show route export bgp_isp_b all
查 export 前候选路由 WHERE export_candidate_before_filter(peer)=true birdc show route preexport bgp_isp_b all
查被 export filter 拒绝的路由 WHERE export_policy(peer)=false birdc show route noexport bgp_isp_b all
查 Adj-RIB-In SELECT * FROM adj_rib_in WHERE peer='bgp_isp_a'; birdc show route import table bgp_isp_a.ipv4 all
查 Adj-RIB-Out SELECT * FROM adj_rib_out WHERE peer='bgp_isp_b'; birdc show route export table bgp_isp_b.ipv4 all

17. 常用排障三连

1. Peer 活着吗?

birdc show protocols all bgp_isp_a

对应问题:

BGP session 是否 Established?
neighbor AS / local AS 对不对?
import/export channel 是否正常?
有没有报错?

2. 这个 peer 给了我哪些路由?

birdc show route protocol bgp_isp_a all

对应问题:

从这个 BGP peer 学到了哪些路由?
这些路由有没有进入当前 routing table?
它们的 AS_PATH / NEXT_HOP / community 是什么?

如果开启了 import table,可以进一步看 Adj-RIB-In:

birdc show route import table bgp_isp_a.ipv4 all

3. 去某个目的 IP 最终选了哪条路?

birdc show route for 8.8.8.8 all

对应问题:

目的 IP 匹配哪个 prefix?
当前 best route 是哪条?
下一跳是谁?
AS_PATH 是什么?
为什么可能没有走另一个 peer?

18. Import / Export 排障套路

问题:为什么我没有收到某条路由?

按顺序查:

birdc show protocols all bgp_isp_a
birdc show route protocol bgp_isp_a all
birdc show route import table bgp_isp_a.ipv4 all

如果 import table 里有,但 show route protocol 里没有,通常说明:

路由可能被 import filter 拒绝
或者没有成为当前 routing table 中可见的候选

问题:为什么我没有把某条路由发给 peer?

按顺序查:

birdc show route 198.51.100.0/24 all
birdc show route preexport bgp_isp_b all
birdc show route export bgp_isp_b all
birdc show route noexport bgp_isp_b all

判断逻辑:

现象 可能原因
show route 里都没有 本机根本没有这条路由
preexport 有,export 没有 被 export filter 拒绝
noexport 里有 明确被 export filter 拒绝
export 有,但邻居没收到 可能是 BGP session、policy、next-hop、邻居侧过滤问题

19. bgp_next_hopgw 的区别

这是 BIRD2 里很容易混淆的点。

字段 类比 含义
bgp_next_hop path_attributes.bgp_next_hop BGP UPDATE 里携带的 NEXT_HOP attribute
gw route.gateway BIRD 解析后真正用于转发的 immediate gateway

例子:

BGP 属性:
  bgp_next_hop = 203.0.113.1

BIRD 解析后:
  gw = 192.0.2.254

含义可能是:

BGP 说下一跳是 203.0.113.1,
但本机到 203.0.113.1 还需要递归查路由,
最后真正发包给 192.0.2.254。

排障时:

birdc show route where bgp_next_hop = 203.0.113.1 all
birdc show route where gw = 192.0.2.254 all

20. 最小记忆版

show protocols
≈ SELECT * FROM protocols;
show route
≈ SELECT * FROM loc_rib;
show route protocol bgp_x
≈ SELECT * FROM loc_rib WHERE source_protocol = 'bgp_x';
show route for 8.8.8.8
≈ SELECT * FROM loc_rib WHERE prefix CONTAINS '8.8.8.8';
show route where bgp_path ~ [= * 15169 * =]
≈ SELECT * FROM loc_rib WHERE bgp_path CONTAINS 15169;
show route import table bgp_x.ipv4
≈ SELECT * FROM adj_rib_in WHERE peer = 'bgp_x';
show route export table bgp_x.ipv4
≈ SELECT * FROM adj_rib_out WHERE peer = 'bgp_x';

21. 一句话总结

BIRD2 里:
show protocols 看 peer/session,
show route 看 Loc-RIB,
show route protocol 看某 peer 导入后的路由,
show route import table 看 Adj-RIB-In,
show route export table 看 Adj-RIB-Out,
show route where ... 就像 SQL WHERE。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment