快连Linux端断线后如何自动重连并写入系统日志?

功能定位:为什么要在 Linux 端做“断线自救”
kuailian(Kuailian privacy tool)在 Windows 与 macOS 上自带“智能重连”开关,但 Linux 端长期保持最小化设计:只提供 kuailian-daemon 二进制与 JSON-RPC 接口,GUI 由社区自行封装。官方在2026-03 文档中明确:Linux 场景以“服务器、NAS、软路由”为主,重连逻辑交给 systemd 或 Docker HealthCheck,客户端本身不驻留托盘。于是“断线后如何自动重连并写入系统日志”就成了运维侧刚需——既要把隧道拉起,也要让 journald 留下审计痕迹,方便后续排障。
版本演进:官方重连策略的两次迁移
截至当前的最新版本(7.3.0)里,Linux 端重连策略经历过两次可见变动:
- 6.x 时代:客户端内置
--auto-reconnect参数,实际是在主进程内每 30 s 发送心跳;一旦握手超时即重新拨号。优点是无依赖,缺点是崩溃后无人守护。 - 7.0-7.2:官方把重连逻辑移出主进程,改用
kuailian-watchdog独立二进制;systemd 用户可通过Restart=always保活。但 watchdog 默认不写 syslog,需要手动加--log-driver=journald。 - 7.3.0 起:watchdog 被合并回主包,统一子命令
kuailian-daemon --guard;同时支持--syslog标志,日志等级可直接被journalctl过滤。
因此,如果你仍在用 6.x,建议先升级到 7.3 以上,再采用下文方案;否则会出现“参数不识别”或“日志缺失”现象。
决策树:选 systemd 还是 Docker/Crontab?
快速判断
- 主机已经运行 systemd 且你拥有 root → 直接用 systemd Service,最省 CPU,日志天然进 journald。
- NAS 系统(Synology、QTS)自带 Docker 但没有完整 systemd → 用官方镜像 + HealthCheck,日志通过
--log-driver=syslog转发。 - VPS 最小镜像连 systemd 都没装 → 用
@rebootcrontab + while 循环脚本,但需自行写 logger。
systemd 方案的优劣
优点:崩溃、断电、升级后都能自启;RestartSec=5 可防短间隔死循环;日志与系统其余服务统一时序。缺点:需要 root 写 unit 文件;若配置错误可能触发“启动风暴”把主机 CPU 占满。
Docker HealthCheck 方案的优劣
优点:镜像与主机隔离,升级只需拉取新镜像;NAS 用户可在图形界面里勾选“自动重启”。缺点:网络命名空间与主机不完全一致,部分分流规则需额外加 --cap-add=NET_ADMIN;日志若走 syslog 需映射 /dev/log。
操作步骤:systemd 完整落地
1. 安装 7.3.0 以上二进制
# 以 Debian 12 为例 wget https://dl.kuailian.com/cli/kuailian_7.3.0_linux_amd64.deb sudo dpkg -i kuailian_7.3.0_linux_amd64.deb kuailian-daemon --version # 确认出现 7.3.x
2. 创建最小配置
sudo mkdir -p /etc/kuailian
sudo nano /etc/kuailian/daemon.json
{
"token": "YOUR_TOKEN",
"protocol": "k-udp",
"region": "auto",
"syslog": true,
"guard": true
}
3. 编写 systemd unit
sudo nano /etc/systemd/system/kuailian.service [Unit] Description=Kuailian privacy tool daemon with auto-reconnect After=network-online.target Wants=network-online.target [Service] Type=simple ExecStart=/usr/bin/kuailian-daemon --config /etc/kuailian/daemon.json Restart=on-failure RestartSec=5 StandardOutput=journal StandardError=journal [Install] WantedBy=multi-user.target
4. 启动并验证
sudo systemctl daemon-reload sudo systemctl enable --now kuailian journalctl -u kuailian -f
看到 Tunnel established, ip=x.x.x.x 即算成功。此时拔掉网线或手动 ip link set eth0 down,等待 5 s 应能观察到“Guard detected link loss, reconnecting…”以及新的 IP。
操作步骤:Docker HealthCheck 方案
# 创建只含 token 的环境文件 echo "KL_TOKEN=YOUR_TOKEN" >> /volume1/docker/kuailian/env # 运行容器 docker run -d --name kl \ --cap-add=NET_ADMIN --sysctl net.ipv4.conf.all.src_valid_mark=1 \ -v /volume1/docker/kuailian:/data \ --env-file /volume1/docker/kuailian/env \ --log-driver=syslog --log-opt syslog-tag=kuailian \ --health-cmd="ping -c 3 1.1.1.1 || exit 1" \ --restart=unless-stopped \ kuailian/kuailian:7.3.0
NAS 用户可在 DSM “容器管理”界面勾选“自动重启”,日志会出现在 /var/log/messages,可用 LogCenter 检索。
日志写入:让 journald 一眼看懂
7.3.0 的 --syslog 标志会把 stderr 映射到 LOG_DAEMON 设备,级别遵循 RFC5424。你可以用:
journalctl -u kuailian -p 4..0 # 只看 Warning 及以上 journalctl -u kuailian --since "10 min ago" -o short-full | grep "link loss"
若需转发到中央日志平台,只需在 /etc/systemd/journald.conf 打开 ForwardToSyslog=yes,rsyslog 即可通过 :programname, isequal, "kuailian" 做过滤。
故障排查:重连失败常见三现象
现象 A:systemd 一直 Restart 但隧道起不来
原因:token 过期或复制多了换行符。验证:kuailian-daemon --once --config /etc/kuailian/daemon.json 若提示“license expired”,需先在官网续费,再 systemctl restart kuailian。
现象 B:Docker 容器无限重启,HealthCheck 一直失败
原因:NAS 本身没外网,HealthCheck 的 ping 先失败。缓解:把 HealthCheck 改成 curl -f https://1.1.1.1 或延长 --interval=60s。
现象 C:journald 出现“TUN device busy”
原因:上一次退出没释放 /dev/net/tun。处置:在 unit 里加 ExecStartPre=/bin/sleep 2 给内核留回收时间;或显式 ExecStopPost=/bin/ip tuntap del mode tun kuailian0。
适用/不适用场景清单
| 场景 | 建议方案 | 备注 |
|---|---|---|
| 个人 VPS 科学上网 | systemd | 资源占用最低,日志集中 |
| 软路由(OpenWrt) | procd + ujail | 7.3.0 已提供 opkg,需手动加 procd 脚本 |
| 团队 NAS 24h 下载 | Docker HealthCheck | 升级不影响宿主机,失败可自动回滚镜像 |
| 临时测试机无 systemd | tmux + while 循环 | 仅临时使用,重启后需手动拉起 |
| 合规要求“必须本地审计” | systemd + journald + rsyslog 转发 | 满足多数企业 SIEM 对接需求 |
最佳实践 6 条
- 永远把 token 放 env 或 0600 权限文件,避免
ps aux泄漏。 - unit 里加
StartLimitIntervalSec=60StartLimitBurst=3,防止网络抖动时雪崩。 - 升级前先在测试机
systemctl edit kuailian加Conflicts=kuailian-test.service,跑并行实例验证。 - 若主机跑 kubelet,请把 kuailian 放宿主机层而非 Pod 内,避免 CNI 与隧道互相抢占路由表。
- 日志量经验性观察:一条隧道每天约 6–8 MB,
journald 默认压缩后 2 MB;若 VPS 磁盘<10 GB,建议加SystemMaxUse=200M。 - 家庭盾若开“广告拦截”,会把
telemetry.kt.com也拦掉,导致心跳失败;记得在“工作域”白名单加*.kt.com。
FAQ(结构化数据)
快连 Linux 端最低内核版本要求?
官方文档写明需 3.10+,但若要用 K-UDP 2.0,建议 5.4+,以便开启 QUIC 内核加速。
能否同时跑多个 kuailian-daemon 实例?
可以,但需指定不同配置目录与 TUN 名称,例如 --tun-name=kuailian1,并在路由表里区分优先级。
journald 日志太多如何快速清理?
执行 sudo journalctl --vacuum-time=7d --unit=kuailian 即可保留最近 7 天。
升级后 unit 文件被覆盖怎么办?
把自定义字段放到 /etc/systemd/system/kuailian.service.d/override.conf,升级时 pacman/apt 不会动它。
家庭盾误杀游戏流量如何快速定位?
先关家庭盾复测,若延迟恢复,再在“工作域”分组逐条放行域名;日志可在 journalctl -u kuailian | grep blocked 看到被拦截域名。
收尾:下一步行动清单
读完本文,你只需 10 分钟即可让快连 Linux 端具备“断线 5 秒内重连 + 系统日志永久留存”能力。先确认版本≥7.3.0,再选 systemd 或 Docker 其一落地;unit 文件里记得加 StartLimit 防雪崩,日志量用 journalctl --vacuum-time 定期修剪。最后把本文最佳实践 6 条贴进团队 Wiki,后续升级、迁移、扩容都能按图索骥,不再踩坑。