NetBird 客户端运行中偶遇 management server 不稳定时会断开连接,且不会自动恢复。需要手动 netbird down && netbird up 才能重连。

问题特征 链接到标题

日志如下:

WARN management/client/grpc.go: job stream disconnected, will retry silently.
  Reason: unexpected HTTP status code received from server: 504 (Gateway Timeout)
ERRO management/client/grpc.go: stream receive error
INFO engine.go: stopped Netbird Engine
INFO server.go: service is down

daemon 进程存活,但内部引擎已永久退出。只有手动重连才能恢复。

原因 链接到标题

NetBird 客户端内部有一个 backoff 重试循环:

// 简化示意
backoff.Retry(func() error {
    return s.connect(ctx, ...)
}, backOff)

重试耗尽后 giveUpChan 关闭,引擎永久退出。此后即使网络恢复,客户端也不会再次尝试连接。

触发条件通常是 management server 的 gRPC job stream 空闲超时(反向代理默认 60s 断开),导致 504。链路恢复后客户端不会自动重试。

方案:systemd watchdog 链接到标题

用 systemd timer 定期检查连接状态,断开时自动执行 down && up。这是社区多个 issue(#6424#1361#5107)中验证的有效方法。

watchdog service 链接到标题

# /etc/systemd/system/netbird-watchdog.service
[Unit]
Description=NetBird connection watchdog

[Service]
Type=oneshot
ExecStart=/bin/bash -c 'netbird status 2>&1 | grep -q "Management: Connected" || (netbird down 2>/dev/null; netbird up)'

watchdog timer 链接到标题

# /etc/systemd/system/netbird-watchdog.timer
[Unit]
Description=Periodic check NetBird connection

[Timer]
OnBootSec=2min
OnUnitActiveSec=3min

[Install]
WantedBy=timers.target

部署 链接到标题

sudo systemctl daemon-reload
sudo systemctl enable netbird-watchdog.timer
sudo systemctl start netbird-watchdog.timer

验证 链接到标题

# 查看 timer 状态
systemctl status netbird-watchdog.timer

# 查看执行记录
journalctl -u netbird-watchdog.service

# 手动触发一次
sudo systemctl start netbird-watchdog.service

timer 每 3 分钟检查一次,断开时自动恢复,连接正常时静默退出。

要点 链接到标题

  • grep -q 匹配到 “Management: Connected” 时退出码 0,不触发 down/up
  • 只在 Management 断开时才执行 down && up,避免不必要的中断
  • 3 分钟间隔平衡了恢复速度和 API 负载
  • 该方案不影响 NetBird 自有的自动重连逻辑,仅作为兜底
  • 社区有更完整的 netbird-monitoring-service 项目,支持告警通知