外观
建立互联(Peering)
本文讲怎么建立对外 eBGP 对等连接、怎么组织内部 iBGP/OSPF、以及 route collector 喂送。eBGP 走 peerings + bgp_sessions;内部互联走 internal_topology(不是 bgp_sessions)。
概念区分
| 类型 | 怎么建 | 真相源 |
|---|---|---|
| eBGP 对外 peering | Web「一键互联」向导 / provision / 逐资源 CRUD | peerings + wg_interfaces + bgp_sessions |
| 内部 iBGP / OSPF | 编辑节点 base_template.bird.internal_topology | internal_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 补建。
- 基本:peer 名、对端 ASN、是否内部、标签 / 备注。
- WireGuard:接口名、监听端口、MTU、本端地址、私钥引用(
secret://)、对端公钥、endpoint、allowed_ips、keepalive、peer_routes。 - BGP:加 0..N 条会话;三个预设 + IPv4 / + IPv6 链路本地 / + MP-BGP 各带合理默认。纯传输 peer 可不加会话。
- 确认:摘要 + 只读预览,提交。
界面细节见 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.md。deploy/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、放行 valid 与 not-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_collector 的 bgp_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。