Skip to content

建立互联(Peering)

本文讲怎么建立对外 eBGP 对等连接、怎么组织内部 iBGP/OSPF、以及 route collector 喂送。eBGP 走 peerings + bgp_sessions;内部互联走 internal_topology(不是 bgp_sessions)。

概念区分

类型怎么建真相源
eBGP 对外 peeringWeb「一键互联」向导 / provision / 逐资源 CRUDpeerings + wg_interfaces + bgp_sessions
内部 iBGP / OSPF编辑节点 base_template.bird.internal_topologyinternal_topology(见 ../internals/internal-routing.md
route collector 喂送加一条 policy=route_collector 的会话bgp_sessions(多跳、无隧道)

Peering 是聚合根:一条逻辑互联聚合其下的 WireGuard 接口与 BGP 会话,可关联远端节点(remote_node_id)。模型见 ../reference/database.md,聚合根设计见 ../internals/control-server.md

用 Web 一键互联向导(推荐)

节点详情 → 概览页点 ⚡ 一键互联,四步把建立一条对等连接所需配置填好,无需手写 JSON。提交时 peering + WireGuard 接口 + 首条 BGP 会话走 provision 端点同事务建立,其余会话用返回的 peering_id 补建。

  1. 基本:peer 名、对端 ASN、是否内部、标签 / 备注。
  2. WireGuard:接口名、监听端口、MTU、本端地址、私钥引用(secret://)、对端公钥、endpoint、allowed_ips、keepalive、peer_routes。
  3. BGP:加 0..N 条会话;三个预设 + IPv4 / + IPv6 链路本地 / + MP-BGP 各带合理默认。纯传输 peer 可不加会话。
  4. 确认:摘要 + 只读预览,提交。

界面细节见 web-ui.md

用 API 建立

向导背后就是这些接口(见 ../reference/api.md)。以下示例用本地基址 127.0.0.1:8000,生产环境基址为主控制面 https://api.natlan.io

bash
# 一次性建 peering + 接口 + 首条会话
curl -s -X POST "http://127.0.0.1:8000/api/v1/admin/nodes/edge1/peerings/provision" \
  -H "Content-Type: application/json" -d @peer-foo.provision.json

# 之后补一条 v6 会话(用返回的 peering_id 关联)
curl -s -X POST "http://127.0.0.1:8000/api/v1/admin/nodes/edge1/bgp-sessions" \
  -H "Content-Type: application/json" -d @peer-foo-v6-session.json

也可逐资源 CRUD:POST /nodes/{id}/peerings/interfaces/bgp-sessions,或对聚合根整体 PUT。字段见 ../reference/desired-state.mddeploy/examples/deploy/peer-*.provision.json 有可参考的样例载荷。

地址要点

  • eBGP-over-link-local:节点 LLA(fe80::X)是一节点一个、由 NodeSpec.link_local 单源派生到所有外部 eBGP WG 接口(见 ../reference/addressing-model.md)。建外部 eBGP 接口时不用手填本端 LLA。
  • 链路 p2p 地址(/31 + /127)与 source_address 目前仍是各写一份的"副本",注意两端一致。
  • 入站 WireGuard 的监听端口必须落在节点 wireguard_port_range 内并对外发布,否则握不上手。

eBGP import 过滤策略

外部会话的导入侧由渲染出的 BIRD 过滤器统一把关,判定顺序:前缀越界(非 DN42 合法范围)→ self-net → AS path 过长(>8)→ 拒收 ASN → RPKI。RPKI 三态里只拒 invalid、放行 validnot-found(DN42 大量前缀无 ROA,拒 not-found 会误伤)。另有导入前缀上限防灌表 / 震荡:节点级默认 import_limit=8500(超限动作 block),可按会话覆盖,字段见 ../reference/desired-state.md

agent 同时采集 import-table 的过滤前 RPKI 分布(per-peer),可在路由页定位"谁在发非法路由";被拒路由的首要原因归类(out_of_range / self_net / as_path_too_long / blocked_asn / policy)随路由快照上报。

互联抖动的处置

对端持续 flap(会话反复断连、或其后前缀路径反复震荡)时,可用 fleet 级处置端点做声明式、可撤销的止血:

  • 按对端断开 / 恢复POST /admin/fleet/mitigations/peer-disable / peer-enable(按对端 AS 置会话 enabled);
  • 拒收 / 恢复指定前缀POST /admin/fleet/mitigations/prefix-block / prefix-unblock(合并进 base_template.bird.blocked_prefixes 并重物化)。

处置只改期望状态、经正常物化下发,撤销即恢复原状。观测→定位→处置的完整操作见 flap-response.md,检测与处置模型见 ../internals/flap-detection.md

route collector 喂送

route collector(如 Kioubit GRC)是把本节点路由喂给收集器、用于全局可视化的特殊会话——多跳、无隧道。加一条 policy=route_collectorbgp_sessions 即可(neighbor 指向收集器地址,无需 WireGuard 接口)。重连收集器可清掉其侧的陈旧前缀幽灵数据。会话字段见 ../reference/desired-state.md

验证

bash
# 路由摘要(peers 分桶看最优来源)
curl -s "http://127.0.0.1:8000/api/v1/admin/nodes/edge1/routing/summary"
# 节点本机
docker exec dn42-edge1-dn42-bird-router-1 birdc show protocols

会话起不来 / 缺路由的排错见 monitoring-and-troubleshooting.md