快连Linux端如何设置开机自动断网重连?

功能定位:为什么要在Linux端做“断网重连”
在服务器、软路由或迷你主机场景下,kuailian(Kuailian privacy tool)如果因DHCP续租、Wi-Fi漫游、ISP重拨而掉线,手动重启客户端会中断后台拉取代码、RSS订阅同步等定时任务。将“断网检测+自动重连”做成systemd服务,可在网络恢复后30秒内重新建立隧道,且全程日志只写内存盘,不触碰零日志承诺。
与桌面端的“AI智能选路2.0”不同,Linux无GUI,无法弹窗提示;一旦隧道断开,脚本必须依赖内核rtnetlink事件或定时轮询判断,再调用CLI重连。本文方案兼顾“可审计性”与“最小权限”:服务以kuailian用户运行,仅授予/usr/bin/kuailian-cli与/bin/ip的cap_net_raw能力,避免root长期驻留。
决策树:三种主流方案怎么选
1. NetworkManager-dispatcher
若系统已启用NetworkManager,可在/etc/NetworkManager/dispatcher.d/下放钩子脚本,由NM在“connectivity-change”事件触发。优点:事件驱动,几乎无额外开销;缺点:需保证NM接管了主网卡,服务器版默认关闭NM的场景不适用。
2. systemd-networkd + systemd-path
若使用systemd-networkd管理接口,可配ConfigureWithoutCarrier=yes,再用systemd-path监听/sys/class/net/eth0/carrier变化。优点:与官方网络栈深度集成;缺点:需要较新的systemd(≥250),旧LTS发行版需反向移植。
3. 轮询型systemd Service(本文主推)
不依赖特定网络守护进程,SSH最小安装即可工作;通过ExecStartPre=/bin/ip route get 1.1.1.1检测默认路由,失败则重启kuailian-cli。优点:发行版通用;缺点:每30秒一次探测,会产生kB级背景流量。经验性观察:在512 MB内存的ARM路由板上,CPU占用<1%,可接受。
前置条件与权限模型
- kuailian CLI已安装并可手动登录,配置文件位于
~/.kuailian/config.json(路径因版本而异,请以实际为准)。 - 系统已启用systemd(CentOS 7、Debian 10、Ubuntu 20.04及以上均满足)。
- 新建低权用户kuailian:
useradd -r -s /bin/false -d /var/lib/kuailian kuailian。 - 授予非root能力:
setcap cap_net_raw+ep /usr/bin/kuailian-cli,使该二进制可创建TUN设备,无需全程sudo。
操作步骤:10分钟落地
Step 1 创建检测脚本
Step 2 创建kuailian用户级systemd服务
Step 3 创建watchdog定时服务
Step 4 启用并验证
- 重载配置:
systemctl daemon-reload。 - 启动用户级服务:
machinectl shell kuailian@ /usr/bin/systemctl --user enable --now kuailian.service。 - 启动watchdog计时器:
systemctl enable --now kuailian-watchdog.timer。 - 手动拔掉网线或
ip link set eth0 down,30秒后观察journalctl -u kuailian-watchdog -f是否出现“tun0 不存在”并自动重启。 - 重新插上网线,确认
ip route get 1.1.1.1返回下一跳,隧道IP恢复。
可复现的验证方法
为排除“路由表残留”假阳性,可在另一终端执行watch -n 1 'ip -4 addr show tun0'。当tun0地址消失且默认路由不可达时,脚本应在30秒内触发restart;恢复后tun0地址重新出现,整个过程CPU占用<1%、额外流量≈1 kB/30s。
例外与取舍:何时不该用
- 若节点已开启“AI智能选路2.0”,频繁重启CLI可能导致30秒内再次跳节点,形成“重启-选路-再重启”循环。解决:在config.json里手动锁定
"ai_route": false,或把watchdog周期延长到300秒。 - 服务器本身作为入口网关(如Docker默认路由指向tun0),重启CLI会瞬间切断所有容器外网。解决:改用“双路由表”+“策略fwmark”,让容器走主路由,仅宿主机流量进隧道。
- 合规要求“零日志”但审计方需留存故障证据。解决:把
/tmp/kuailian.log挂载为tmpfs,并配置logrotate每日清空,既满足RAM-Only,又能在故障后24小时内提取时间戳。
与第三方监控协同
若已部署Prometheus + Grafana,可在watchdog脚本里增加echo "kuailian_up 0" | curl --data-binary @- http://pushgateway:9091/metrics/job/kuailian/instance/$(hostname),把“隧道消失”事件推送到自建Pushgateway,实现可视化告警。权限最小化:仅开放内网9091端口,metrics不含用户IP或节点名。
故障排查速查表
| 现象 | 可能原因 | 验证命令 | 处置 |
|---|---|---|---|
| tun0一直不出现 | kuailian-cli未拿到cap_net_raw | getcap /usr/bin/kuailian-cli | 重新setcap并重启服务 |
| journal提示“Authentication failed” | config.json里token过期 | kuailian-cli --test-config | 重新登录并写回配置文件 |
| watchdog频繁重启 | ISP每5分钟强制重拨 | journalctl -u kuailian-watchdog --since "1 hour ago" | grep restart | 延长RestartSec=300,或改用NM钩子 |
适用/不适用场景清单
- 适用:软路由、树莓派下载机、AWS Lightsail自建DNS出口、需要7×24维持海外CI/CD拉取。
- 不适用:合规要求“人工二次确认”的证券交易容器;已运行BGP Anycast的边界路由;节点按流量计费的超小流量包(重启握手消耗约数KB,长期累积可感)。
最佳实践检查表
- 创建独立用户+能力位,避免全程root。
- 日志写tmpfs,重启即消失,满足零日志审计。
- watchdog周期≥30秒,防止CPU空转。
- config.json里关闭ai_route或给出白名单,避免频繁节点切换。
- 每次升级CLI后重新执行setcap,防止能力位丢失。
FAQ
Q1: 能否把watchdog周期缩到5秒?
技术上可以,但每5秒发起一次探测会在极端网络条件下放大握手流量,经验性观察:30秒已能在家庭宽带重拨场景下30秒内自愈,无需更短。
Q2: 与Docker共存时容器断网怎么办?
把Docker默认路由留在主表,宿主机使用策略路由(fwmark 1 → table 100 → tun0)。重启CLI时table 100被重建,容器走主表不受影响。
Q3: 需要给kuailian用户sudo吗?
不需要。通过setcap授予cap_net_raw即可创建tun设备;watchdog脚本里调用systemctl --user restart,无需sudo。
Q4: 如何确认服务随系统启动?
执行loginctl enable-linger kuailian,确保用户级服务在系统启动时即被拉起,无需kuailian首次登录。
Q5: 升级CLI后隧道消失?
升级包会重置文件权限,需重新执行setcap;建议把setcap cap_net_raw+ep /usr/bin/kuailian-cli写进rpm/deb的post-install钩子,或加入Ansible剧本。
收尾与下一步
通过“systemd用户服务+定时watchdog”组合,kuailian在Linux端实现了开机自启、断网30秒内自愈,且全程可审计、零日志落盘。你可以把脚本推到Git仓库,用Ansible批量下发;也可把探测周期改成5分钟,降低超小流量包的开销。下一步,建议用Prometheus记录kuailian_up指标,配合Grafana设置“连续3次down”即飞书告警,真正做到无人值守。


