功能定位:为什么要在 Linux 端做 systemd 自启
快连 privacy tool 的 Linux 客户端默认只提供 kuailian-daemon 二进制,安装后不会自动注册为系统服务。对需要 7×24 维持海外节点、跑在无头服务器或 NAS 的场景,手动重连既麻烦又容易遗漏。用 systemd 把守护进程托管给系统,可在开机、断网、崩溃三种情况下自动拉起,实现“无人值守”的透明翻墙。
与 crontab @reboot 相比,systemd 自带退避重启、依赖网络就绪、日志统一收集三大优势;与 Docker 化相比,systemd 无需额外镜像层,更新时直接替换二进制即可,资源占用更低。下文以 Debian 12、Ubuntu 22/24 与 CentOS Stream 9 为基准,给出最小可用单元文件及常见回退方案。
前置检查:确认安装路径与运行权限
截至当前的最新版本,官方提供两种安装方式:A) .deb 包自动把可执行文件放到 /opt/kuailian/bin/kuailian-daemon;B) 通用 .tar.xz 解压后需自行决定目录。无论哪种方式,都请先用 which kuailian-daemon 或 find /opt /usr/local -name kuailian-daemon 找到绝对路径,并确认具有 755 权限与 root 可执行标记。
User= 字段写进单元文件,并保证该用户拥有 /var/log/kuailian 写权限与 /dev/net/tun 读写权限。
方案 A:最简 systemd 单元文件(推荐)
创建文件 /etc/systemd/system/kuailian.service,内容如下:
[Unit] Description=Kuailian privacy tool daemon After=network-online.target Wants=network-online.target [Service] Type=simple ExecStart=/opt/kuailian/bin/kuailian-daemon --config /etc/kuailian/config.json Restart=on-failure RestartSec=5s LimitNOFILE=65536 # 如需非 root 运行,取消下行注释并修改用户名 # User=kuailian [Install] WantedBy=multi-user.target
保存后执行:
sudo systemctl daemon-reloadsudo systemctl enable --now kuailian.servicesystemctl status kuailian看到active (running)即成功。
listen 端口且与其他服务冲突,systemd 会在 5 s 后反复重启;先确保端口独占或改用随机端口。
方案 B:一次性脚本 + systemd 路径监控
某些 NAS 系统(如群晖 DSM 7)在系统完全就绪后会覆盖 /etc/resolv.conf,导致 kuailian-daemon 提前启动时 DNS 解析失败。此时可把启动命令拆成脚本 /usr/local/bin/kuailian-wrapper.sh,内部先 sleep 10 直到能解析 google.com 再启动 daemon,然后用 systemd path 单元监控 /run/nameserver.ready 文件触发启动。经验性观察,这种方式能把“开机后首次握手失败”概率降到肉眼不可见水平。
如何回退:禁用自启与日志清理
若升级后发现节点无法连接,可立即回退:
sudo systemctl disable kuailian.servicesudo systemctl stop kuailian.service- 删除或重命名单元文件,再
daemon-reload。
日志占用方面,systemd 默认把标准输出写入 journald,可在单元里加 StandardOutput=null 或设置 SystemMaxUse=100M 限制总量。
验证与观测:三条命令判断生效
systemctl is-enabled kuailian应输出enabled。systemctl show kuailian -p NRestarts重启次数为 0 表示稳定。curl -x socks5h://127.0.0.1:1080 https://ipinfo.io返回海外地址即隧道已通。
建议在 /etc/cron.d 里再加一条每 10 分钟检测,若 curl 超时则 systemctl restart kuailian,形成双层保险。
常见故障排查表
| 现象 | 可能原因 | 验证方法 | 处置 |
|---|---|---|---|
| 启动 2 s 即退出 | 配置文件 JSON 语法错误 | journalctl -u kuailian | 用 jq 检验 config.json |
| TUN 无法创建 | 缺少 CAP_NET_ADMIN | ls -l /dev/net/tun | 加 User= 时同步加 AmbientCapabilities=CAP_NET_ADMIN |
| 重启后 DNS 泄漏 | systemd-resolved 优先级高 | systemd-resolve --status | 在单元里 ExecStartPre=/bin/resolvectl dns tun0 8.8.8.8 |
适用 / 不适用场景清单
适用:1. 需要长期维持海外住宅 IP 的跨境电商 VPS;2. 跑在树莓派、N100 软路由上的透明网关;3. 实验室下载机定时同步 GitHub 大文件。
不适用:1. 多人共享登录同一账号,触发官方并发上限;2. 本地网络对 UDP 高频心跳限流,导致 systemd 反复重启;3. 合规要求不允许隧道出口 IP 每日变动。
最佳实践 5 条
- 单元文件里写
RestartSec=5s即可,过短会放大 API 限流。 - 把
--log-level info输出到journald,方便与系统日志关联。 - 升级前先在测试机
systemctl mask kuailian,防止自动重启打断旧隧道。 - 若跑在云服务器,记得安全组放行 UDP 监听端口,否则握手永远失败。
- 每季度跑一次
journalctl --vacuum-time=30d,防止日志挤满系统盘。
FAQ - 常见问题
一定要 root 才能自启吗?
不是。单元文件里加 User= 普通用户即可,但需给该用户授予 /dev/net/tun 读写和 CAP_NET_ADMIN 能力。
和 crontab @reboot 比哪个更稳?
systemd 能等网络真正就绪再启动,且自带退避重启;经验性观察,在弱网 VPS 上能减少约一半的“首次握手失败”。
升级客户端后需要重新配置吗?
只要二进制路径与配置文件路径不变,无需动单元文件;若官方更换路径,只需修改 ExecStart 并重载。
journal 日志增长太快怎么办?
在单元里加 StandardOutput=null 关闭标准输出,或系统级 /etc/systemd/journald.conf 里设置 SystemMaxUse=100M。
如何确认隧道真的在工作?
用 curl -x socks5h://127.0.0.1:1080 https://ipinfo.io 查看出口 IP;若返回海外且与你选择的节点一致,即表示生效。
结论与下一步行动
通过 systemd 托管快连 privacy tool 守护进程,你能在 Linux 端实现“开机即翻墙、断网自恢复”的无人值守体验。整篇流程只需 5 分钟:确认路径→写单元→enable→验证→加监控。建议立即在测试机重演一遍,确认日志无报错后再推到生产环境;随后把单元文件纳入 Ansible/Chef 仓库,即可批量管理所有 VPS 节点。下次官方升级时,只要路径不变,一条 systemctl daemon-reload 就能平滑迁移,真正做到“配置一次,终身受益”。
