Skip to content

自动对等运维

自动对等是面向其他 DN42 运营者的自助对等系统:对方用 DN42 身份登录门户 → 选一个接入节点 → 填对端连接参数 → 提交即落成 → 状态页看 BGP 活性 → 不需要时自助拆除。

运维控制点是供给策略,不是逐条审批。 身份已由门户会话背书(ASN 归属验证),配额与容量全部机器可判,因此不设人工闸门:请求要么当场落成,要么整体回滚不留行。

设计原理见 自动对等内部,接口见 自动对等 API管理面供给策略

本文的 /control/v1/admin/* 调用需携带 -H "Authorization: Bearer <admin token>",示例中省略。


开放一个节点

bash
curl -s -X PUT "https://api.natlan.io/control/v1/admin/autopeering/nodes/edge1" \
  -H "Content-Type: application/json" \
  -d '{
        "enabled": true,
        "endpoint_host": "edge1.example.org",
        "region": "east-asia",
        "country_code": "HK",
        "description": "Hong Kong"
      }'

PUT全量替换——未给的字段回默认值。只想改一项用 PATCH

字段作用
enabled是否接受新的自动对等请求
endpoint_host对端拨入用的公网主机名或 IP,不含端口。留空表示只支持本网主动拨出,该节点不出现在可拨入清单里
max_sessions可选的额外人工上限。null 表示只受端口池约束
region / country_code / description / bandwidth_mbps / monthly_quota_gb / notice列表页展示元数据

notice 用来挂节点特有的告诫,例如大陆节点应提示境外网络不要直连。

关闭一个节点

bash
curl -s -X PATCH "https://api.natlan.io/control/v1/admin/autopeering/nodes/edge1" \
  -H "Content-Type: application/json" -d '{"enabled": false}'

关闭后该节点从用户面清单消失、新提交返回 404已落成的对等完全不受影响


容量从哪来

可用连接数的单一事实源是外部端口池的剩余量,不是手工配额。

bash
curl -s "https://api.natlan.io/control/v1/admin/fleet/port-pools"
json
{"pools": {"external": {"start": 51800, "end": 51830},
           "internal": {"start": 52800, "end": 52820}}}

用户面 GET /autopeering/nodes 返回的容量字段全部由此派生:

字段含义
capacity池总席位
used_ports已占席位,含手工建立的对等
free_ports池内空闲
remaining实际可接纳数
provisioned其中经自动对等落成的数量

used_ports 含手工对等这一点很重要:运维手工建的 peer 也占席位,容量条画的是真实占用。

要扩容就改端口池段位,不要去调 max_sessions——后者只是额外的人工上限。


配额规则

每节点每 AS 最多一条。 同一个 AS 可以在多个不同节点各建一条,但对同一节点只能有一条在途或生效的对等。

DB 层有部分唯一索引 UNIQUE(asn, node_id) WHERE status IN ('pending','provisioned') 兜住并发提交竞态。

目标节点已有该 AS 的外部对等(含手工建立的)时,用户提交返回 409


惰性收养

用户拉取自己的请求列表时,控制面会把该 ASN 名下手工建立的外部对等归并成请求行(adopted: truedecided_by='adopted')。

这样门户是单一入口:用户看得到、也能自助拆除运维手工建的那条。多 WG 接口的特调聚合会跳过收养——它们形态特殊,不适合交给用户面管理。


处置已落成的对等

自动对等落成的就是标准 Peering 聚合,没有第二套数据面。所以处置走标准管理 API:

目的做法
临时停用PATCH /admin/bgp-sessions/{id}spec.enabled 置 false,或按 AS 走 flap 处置peer-disable
调 MTU / 改参数PATCH /admin/interfaces/{id} 改 spec。门户展示态是读侧派生的,改完自动跟进
彻底拆除DELETE /admin/peerings/{id}。关联的请求行同事务推进 cancelled,配额位与端口随之释放

不要直接改 peering_requests 表——那些列是提交时刻的审计快照,展示真相在聚合里。


排查用户报的问题

「提交失败 422」:多半是对端隧道内地址不在该 ASN 的 registry route / route6 起源前缀内。让用户先在 registry 登记前缀。也可能是会话形态参数组合非法,错误 detail 会说明。

「提交失败 503」:registry 副本服务不可达。查 GET /ui/registry/status,处理见 registry 副本

「登录不了」:门户登录是 OIDC 依赖方闭环,凭据未配齐时端点 fail-closed 503。查控制面 [portal] 段的 oidc_client_idoidc_client_secret,以及 auth-server 侧的应用注册是否还在。

「BGP 不 up」:详情页的 live 块从节点最新 runtime snapshot 派生。先看 bgp_health;WireGuard 握手正常但 BGP 不 up,多半是 MTU——让用户点一次 probe-mtu,或按 故障排查 定位。

「看不到自己的请求」:请求按会话内 ASN 划权,他人的一律 404。确认用户登录的是正确的 ASN。


观测

用户侧能看到的只读态势(fleet 概述、流量、路由、抖动)与管理面复用同一批 builder 函数,但字段经白名单投影:WG 对端的公钥与 endpoint、节点行的 agent 版本与心跳遥测不出网。

披露口径是:AS 号、前缀、流量占比、抖动明细不脱敏——这些本就在 DN42 registry 与各家 explorer 上公开。

管理面自己的观测入口见 健康与状态