Skip to main content

DN42 运维、排障与 Looking Glass

· 5 min read

DN42 节点上线后,真正消耗时间的是运维:peer flap、ROA 过期、MTU 黑洞、BGP 过滤器误杀、监控缺失。本文整理一套新手可用的检查和观测方式。

分层排障思路#

遇到“不通”时,按层排查:

1. WireGuard 是否 handshake2. BGP session 是否 established3. BIRD 是否收到路由4. filter/ROA 是否拒绝路由5. kernel 是否安装路由6. 防火墙是否允许转发7. MTU 是否导致大包黑洞

不要一上来重启所有服务。先定位在哪一层断了。

WireGuard 检查#

sudo wg showsudo wg show wg-peer1ip addr show wg-peer1

关注:

latest handshake 是否近期更新transfer rx/tx 是否增长endpoint 是否正确allowed ips 是否包含 DN42 地址和 fe80::/10

抓包:

sudo tcpdump -ni any udp port 23777

BIRD 检查#

sudo birdc show statussudo birdc show protocolssudo birdc show protocols all peer1

常见状态:

Established  正常Active       BIRD 正在尝试连接Connect      TCP 连接阶段Idle/Down    配置、接口或对端问题

查看路由:

sudo birdc show route countsudo birdc show route protocol peer1sudo birdc show route filtered protocol peer1sudo birdc show route export peer1

如果 filtered 中有大量路由,重点看 filter 和 ROA。

Kernel 路由检查#

BIRD 里有路由不代表 Linux kernel 一定能转发。检查:

ip route get 172.20.0.1ip -6 route get fd00::1ip route show proto birdip -6 route show proto bird

如果 BIRD log 中出现 netlink 相关错误,检查:

  • dummy 接口上是否配置了本机 DN42 地址。
  • krt_prefsrc 是否合理。
  • kernel protocol 是否启用。
  • 路由 next-hop 是否可达。

MTU 排查#

小包通、大包不通时优先看 MTU:

tracepath 172.20.0.1tracepath6 fd00::1ping -M do -s 1372 172.20.0.1ping6 -M do -s 1352 fd00::1

如果底层有多层封装,WireGuard MTU 可能需要降到 13801360 甚至更低。TCP MSS clamp 可以缓解 TCP,但不能代替正确 MTU。

BGP flap 监控#

BGP flap 指 session 频繁 up/down。它通常由以下原因导致:

  • 隧道不稳定。
  • 对端重启。
  • MTU 或丢包导致 keepalive 超时。
  • BIRD 配置频繁 reload。
  • 防火墙或 NAT 映射过期。

简单人工查看:

journalctl -u bird --since "1 hour ago"sudo birdc show protocols all peer1

Prometheus 监控时,建议采集:

BGP session stateBGP established 时间BGP flap/change 次数每个 peer 的 import/export route 数量WireGuard latest handshakeWireGuard rx/tx bytes节点 CPU、内存、磁盘、网络

如果使用 bird_exporter,Grafana 中应重点做:

  • BGP session 状态表。
  • peer up/down 时间线。
  • prefix import/export 数量。
  • flap 计数或 state changes。
  • WireGuard handshake 延迟。

bird-lg-go Looking Glass#

Looking Glass 可以让外部用户查询你的 BGP 状态、路由、traceroute 和 whois。bird-lg-go 分为 frontend 和 proxy:

frontend: 面向用户,默认监听 :5000proxy:    部署在每个 BIRD 节点,默认监听 :8000

frontend Docker Compose 示例:

services:  bird-lg:    image: xddxdd/bird-lg-go    container_name: bird-lg    restart: unless-stopped    environment:      - BIRDLG_SERVERS=cn,jp,us,sg      - BIRDLG_DOMAIN=lg.example.com      - BIRDLG_PROXY_PORT=8000      - BIRDLG_WHOIS=whois.dn42      - BIRDLG_NET_SPECIFIC_MODE=dn42      - BIRDLG_PROTOCOL_FILTER=BGP    ports:      - "5000:5000"

这意味着 frontend 会尝试访问:

cn.lg.example.com:8000jp.lg.example.com:8000us.lg.example.com:8000sg.lg.example.com:8000

每个节点都需要对应 DNS 记录和 proxy。

proxy 安全#

proxy 可以执行 BIRD 查询和 traceroute,不应无保护暴露到公网。

bird-lg-go proxy 支持 ALLOWED_IPS,也可以配合防火墙限制来源。

systemd 示例:

[Unit]Description=bird-lg-go proxyAfter=network-online.target bird.serviceWants=network-online.target
[Service]User=bird-lgGroup=birdEnvironment=BIRD_SOCKET=/run/bird/bird.ctlEnvironment=BIRDLG_LISTEN=0.0.0.0:8000Environment=ALLOWED_IPS=203.0.113.10ExecStart=/usr/local/bin/bird-lgproxy-goRestart=on-failureNoNewPrivileges=truePrivateTmp=trueProtectSystem=fullProtectHome=true
[Install]WantedBy=multi-user.target

bird-lg-go 当前 proxy 使用 BIRD_SOCKET 指定 BIRD socket。实际路径请用下面命令确认:

ls -l /run/bird/bird.ctl /var/run/bird/bird.ctl 2>/dev/null

再用防火墙限制 8000 端口来源:

sudo iptables -A INPUT -p tcp -s 203.0.113.10 --dport 8000 -j ACCEPTsudo iptables -A INPUT -p tcp --dport 8000 -j DROP

日常维护清单#

每天或每次改配置后检查:

sudo wg showsudo birdc show protocolssudo birdc show route countsystemctl status dn42-roa.timerjournalctl -u bird --since "1 hour ago"

每次新增 peer 后检查:

sudo birdc configure checksudo birdc configuresudo birdc show protocols all <peer>sudo birdc show route protocol <peer>sudo birdc show route export <peer>

每次怀疑路由问题时检查:

sudo birdc show route filtered protocol <peer>ip route get <target-ipv4>ip -6 route get <target-ipv6>

参考资料#