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项目,支持告警通知