这份笔记分两层:
先看前面的 Cheatsheet:日常排障够用。
后面的字段字典:忘记字段含义时再查。
| 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 |
| 字段 | 含义 | 常见查询 |
|---|---|---|
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 输出里看 * |
| 你想知道 | 命令 |
|---|---|
| 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 |
birdc show protocols all bgp_isp_abirdc show route protocol bgp_isp_a allbirdc show route for 8.8.8.8 allbirdc show route preexport bgp_isp_b all
birdc show route export bgp_isp_b all
birdc show route noexport bgp_isp_b allbgp_next_hop = BGP 报文里说的 NEXT_HOP
gw = BIRD 算出来真正发包用的下一跳
日常排障时:
看 BGP 属性,用 bgp_next_hop。
看实际转发,用 gw。
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 客户端。
| 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 等 |
这一节把前面类比出来的“SQL 表”拆成字段字典。字段名不是 BIRD2 内部真实数据库字段,而是为了理解和排障抽象出来的逻辑字段。
对应 BIRD2 查询:
birdc show protocols
birdc show protocols all <protocol_name>| SQL 类比字段 | BIRD2 对应信息 / 常见输出 | 描述 |
|---|---|---|
name |
Name / protocol 名 |
BIRD 配置里的协议实例名,例如 bgp_isp_a。很多查询都用它作为 peer/protocol 标识。 |
proto |
Proto |
协议类型,例如 BGP、Kernel、Device、Static。 |
table |
Table / channel table |
该协议连接的 routing table,例如 master4、master6。 |
state |
State |
BIRD protocol 状态,例如 up、down、start。 |
info |
Info |
协议补充状态。BGP 常见为 Established、Idle、Active 等。 |
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 状态,例如 Idle、Connect、Active、OpenSent、OpenConfirm、Established。 |
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 错误或断开原因。 |
对应 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 输出通常需要人工推断。 |
对应 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_IGP、ORIGIN_EGP、ORIGIN_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。 |
对应 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 名,常见是 ipv4 或 ipv6。 |
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 逻辑或日志。 |
对应 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 行为。 |
对应 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、路由类型、下一跳不可达、权限或冲突导致没有安装进内核。
| 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 |
出口侧准备通告的路由视图 |
SELECT name, proto, table, state, since, info
FROM protocols;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 等补充状态 |
SELECT *
FROM protocols
WHERE name = 'bgp_isp_a';birdc show protocols all bgp_isp_a常用于查看:
BGP session 状态
neighbor AS
local AS
BGP capabilities
import/export filter 状态
channel 状态
收发路由数量
上次 flap / error 信息
SELECT *
FROM loc_rib;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 的简写 |
SELECT *
FROM loc_rib
WHERE best = true;birdc show route primarySELECT *
FROM loc_rib
WHERE prefix CONTAINS '8.8.8.8'
ORDER BY best DESC
LIMIT 1;birdc show route for 8.8.8.8看完整属性:
birdc show route for 8.8.8.8 all这条命令很常用于排障,因为它直接回答:
如果现在发包去 8.8.8.8,BIRD 会选择哪条路?
SELECT *
FROM loc_rib
WHERE prefix = '198.51.100.0/24';birdc show route 198.51.100.0/24看完整属性:
birdc show route 198.51.100.0/24 allSELECT *
FROM loc_rib
WHERE source_protocol = 'bgp_isp_a';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,它可能不会被保留下来。
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;
};
}
SELECT *
FROM adj_rib_in
WHERE peer = 'bgp_isp_a';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 之前或接近原始接收侧的路由视图。
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;
};
}
SELECT *
FROM adj_rib_out
WHERE peer = 'bgp_isp_b';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 的路由。
BIRD2 的 show route where ... 可以类比 SQL 的 WHERE。
SELECT *
FROM loc_rib
WHERE bgp_path CONTAINS 15169;birdc show route where bgp_path ~ [= * 15169 * =]看完整属性:
birdc show route where bgp_path ~ [= * 15169 * =] all含义:
查所有 AS_PATH 里出现过 AS15169 的路由。
SELECT *
FROM loc_rib
WHERE source_protocol = 'bgp_isp_a'
AND bgp_path CONTAINS 15169;birdc show route protocol bgp_isp_a where bgp_path ~ [= * 15169 * =] allBIRD2 里要区分两个字段:
| 字段 | 含义 |
|---|---|
bgp_next_hop |
BGP UPDATE 里的 NEXT_HOP attribute |
gw |
BIRD 计算出的实际 immediate gateway,用于转发 |
SELECT *
FROM loc_rib
WHERE bgp_next_hop = '203.0.113.1';birdc show route where bgp_next_hop = 203.0.113.1 allSELECT *
FROM loc_rib
WHERE gw = '203.0.113.1';birdc show route where gw = 203.0.113.1 allSELECT *
FROM loc_rib
WHERE communities CONTAINS '65000:100';birdc show route where bgp_community ~ [(65000,100)] all注意:
BIRD2 普通 community 写作 pair:
(65000,100)
不是字符串:
65000:100
SELECT *
FROM loc_rib
WHERE bgp_local_pref > 150;birdc show route where bgp_local_pref > 150 allSELECT *
FROM loc_rib
WHERE bgp_med = 50;birdc show route where bgp_med = 50 allSELECT *
FROM loc_rib
WHERE bgp_origin = 'IGP';birdc show route where bgp_origin = ORIGIN_IGP all常见 origin:
ORIGIN_IGP
ORIGIN_EGP
ORIGIN_INCOMPLETE
这不是直接查 export table,而是问:如果这些路由经过某个 protocol 的 export filter,会不会被导出。
SELECT *
FROM loc_rib
WHERE export_policy('bgp_isp_b') = true;birdc show route export bgp_isp_b看完整属性:
birdc show route export bgp_isp_b allSELECT *
FROM loc_rib
WHERE export_candidate_before_filter('bgp_isp_b') = true;birdc show route preexport bgp_isp_b all用途:
确认某条路由在进入 export filter 之前是否存在。
SELECT *
FROM loc_rib
WHERE export_policy('bgp_isp_b') = false;birdc show route noexport bgp_isp_b all用途:
排查为什么某条路由没有通告给某个 BGP neighbor。
| 目标 | 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 |
birdc show protocols all bgp_isp_a对应问题:
BGP session 是否 Established?
neighbor AS / local AS 对不对?
import/export channel 是否正常?
有没有报错?
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 allbirdc show route for 8.8.8.8 all对应问题:
目的 IP 匹配哪个 prefix?
当前 best route 是哪条?
下一跳是谁?
AS_PATH 是什么?
为什么可能没有走另一个 peer?
按顺序查:
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 中可见的候选
按顺序查:
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、邻居侧过滤问题 |
这是 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 allshow 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';
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。