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 23777BIRD 检查#
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 可能需要降到 1380、1360 甚至更低。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 peer1Prometheus 监控时,建议采集:
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 节点,默认监听 :8000frontend 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.targetbird-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>