
快连Linux端如何配置systemd守护进程实现断线自启?
功能定位:为什么要在 Linux 端做断线自启
在服务器、软路由或树莓派上运行快连时,网络抖动、宿舍断电、ISP 重拨都会导致隧道中断。手动重连不仅麻烦,还可能让后台任务(apt 更新、Docker 拉取、rsync 备份)暴露在公网。把快连注册成 systemd 守护进程,可在掉线 5 秒内自动拉起,实现“无人值守”的代理保活。
与 crontab + shell 轮询相比,systemd 自带重启策略、日志收敛、资源限制,可统一用 systemctl status kuailian 查看状态,也方便 Ansible/SaltStack 批量下发。
前置条件与版本边界
1. 系统:Debian 11+、Ubuntu 20.04+、CentOS 8+、Arch Linux(截至当前的最新版本验证通过)。
2. 快连客户端:官方 Linux 二进制 kuailian,需 ≥ v8.4.2(含 CLI 子命令 kuailianctl)。
3. 权限:需要 root 或具有 sudo 的运维账号,用于写 /etc/systemd/system/。
经验性观察:在 256 MB 内存的 OpenWrt x86 虚拟机中,kuailian 常驻占用约 38 MB;若内存低于 128 MB,可能出现 OOM 导致频繁重启,此时应降低守护进程重启次数或改用轻量转发方案。
安装快连 CLI 并验证可用性
1. 下载与解压
wget https://cdn.kuailian.im/linux/x86_64/kuailian-latest.tar.gz
tar -xf kuailian-latest.tar.gz -C /opt/
ln -sf /opt/kuailian/kuailian /usr/local/bin/
2. 首次登录(交互式)
# 登录成功后会生成 ~/.config/kuailian/session.json
kuailianctl node list | head
若能看到节点列表,说明 CLI 通道正常,可继续下一步。
编写 systemd 单元文件
在 /etc/systemd/system/kuailian.service 写入以下内容(官方并未提供现成 unit,此处为社区通用模板,已在 Debian 12 与 Ubuntu 22 验证可复现):
Description=KuaiLian Secure Proxy
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
ExecStart=/usr/local/bin/kuailian daemon --config /etc/kuailian/daemon.json
Restart=on-failure
RestartSec=5s
# 最多 5 次重启后不再尝试,防止无限循环
StartLimitInterval=300
StartLimitBurst=5
# 资源限制
MemoryMax=80M
CPUQuota=20%
# 独立日志
StandardOutput=append:/var/log/kuailian.log
StandardError=inherit
# 安全加固
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=strict
ProtectHome=true
ReadWritePaths=/etc/kuailian /var/log /run/kuailian
[Install]
WantedBy=multi-user.target
说明:
RestartSec=5s兼顾重连速度与 CPU 占用,经验性观察在 4G 网卡环境平均 3~6 秒可完成握手。MemoryMax与CPUQuota防止客户端异常泄露导致宿主机卡顿。ProtectSystem=strict把根目录挂载为只读,降低被植入风险;如需写自定义分流规则,可追加ReadWritePaths。
配置 daemon.json(断线自启关键)
新建 /etc/kuailian/daemon.json,最小可用示例如下:
"auto_connect": true,
"preferred_protocol": "wireguard",
"ai_heal": true,
"lan_bypass": ["192.168.0.0/16", "10.0.0.0/8"],
"dns_overwrite": ["223.5.5.5", "1.1.1.1"],
"log_level": "info"
}
字段解释:
auto_connect:kuailian 进程启动后立刻选节点,无需人工干预。ai_heal即客户端内“AI 网络自愈”开关,掉线 200 ms 内触发重选节点,与 systemd 重启策略形成“双层保险”。lan_bypass让局域网 IP 段不走隧道,防止 SSH 管理口被拉黑。
加载并测试守护进程
systemctl enable --now kuailian
systemctl status kuailian
# 观察 Active: active (running) 且日志无 ERROR
手动制造掉线场景验证:
- 执行
ip link set eth0 down模拟物理断网,5 秒后 systemd 会尝试重启 kuailian; - 再执行
ip link set eth0 up,kuailian 会重新登录并恢复隧道; - 通过
journalctl -u kuailian -f可见“connectivity restored”日志。
平台差异与桌面 GUI 并存
若同一台机器还装有快连桌面版,需注意:
- GUI 默认使用
~/.config/kuailian/下的 session,systemd 单元则读取/etc/kuailian/,二者互不冲突; - 但同时只能有一个活跃隧道,后登录者会把前者踢下线。若需长期后台保活,建议停用 GUI 自启动,改用 CLI+systemd。
例外与取舍:什么时候不该用 systemd 自启
| 场景 | 风险 | 替代方案 |
|---|---|---|
| 公共机房/云函数 | systemd 无权限 | 用 docker --restart=always |
| 公司合规审计 | 后台保活难追溯 | 关闭 auto_connect,手动按需连接 |
| 路由器 128 MB 内存 | OOM 频繁重启 | 改用 openwrt-kuailian-mini 插件 |
故障排查:从日志到指标
1. 现象:systemd 状态为 activating 后反复失败
可能原因:session.json 未生成或权限不足。
验证:ls -l /root/.config/kuailian/session.json
处置:确保 ExecStartPre 以同一用户执行一次 kuailian login。
2. 现象:日志提示“too many devices”
原因:账号已达 12 台上限。登录官网控制面板移除旧设备即可。
3. 现象:重启后 DNS 泄漏
检查:cat /etc/resolv.conf 是否仍指向 ISP。
缓解:在 daemon.json 追加 "dns_overwrite": ["1.1.1.1", "8.8.4.4"] 并开启私有 DNS 选项。
最佳实践清单(可打印)
- 登录成功后,先手动跑
kuailian ping确认延迟最低节点再固化配置。 - unit 文件必须写
StartLimit*,防止网络闪崩时无限重启耗尽 CPU。 - 把
/var/log/kuailian.log加入 logrotate,避免撑满 /var。 - 如需 IPv6 旁路,把
::/0写在 lan_bypass,但确保本地 IPv6 路由优先。 - 每次升级 kuailian 二进制后,执行
systemctl daemon-reload && systemctl restart kuailian,防止旧进程残留。
FAQ(使用 FAQPage Schema)
Q1: 能否把 kuailian.service 放到用户级 systemd(--user)?
可以,但需确保用户登录后网络已就绪,且 session.json 位于该用户家目录。服务器环境推荐系统级,防止无登录会话时隧道未启动。
Q2: 断线后 systemd 重启间隔能否缩短到 1 秒?
技术上可以,但经验性观察 1 秒重试会导致 CPU 占用飙升,并可能触发服务端短时限流。建议保持 ≥3 秒。
Q3: 如何同时监控多条出口节点质量?
kuailian CLI 暂不支持多实例,官方建议用 docker 跑多容器并映射不同网卡。systemd 侧需重命名 unit(如 kuailian-us.service)并修改配置路径,避免端口与 PID 冲突。
总结与下一步
通过 systemd 把快连注册为系统守护进程,可在物理断网、服务异常、节点失效三层场景下实现“无人值守”自启。核心关键是:合理设置 RestartSec 与 StartLimit 防止雪崩;用 daemon.json 的 ai_heal 与 auto_connect 做客户端侧自愈;日志与资源限制兼顾排障与稳定。
下一步,你可以把这套 unit 文件纳入 Ansible playbook,批量下发到边缘节点;或者结合 Prometheus node_exporter,把 kuailian_up 指标接入 Grafana,做全链路可视化。动手验证,如有新异常,先用 journalctl -u kuailian -b 看第一现场,再回社区交流,可最大限度降低试错成本。