
快连在OpenWrt里如何实现开机自启并守护进程?
在OpenWrt中为kuailian配置procd自启与守护,实现掉线秒级重连,兼顾合规日志与可审计。
功能定位:为什么要在OpenWrt守护快连
kuailian(Kuailian privacy tool)在路由器侧常以kuailian-core进程形态运行,默认仅提供一条裸命令,无重启、无日志、无掉线保护。一旦节点闪断,全屋设备瞬间“裸奔”。把进程托管给OpenWrt原生初始化系统procd,可在掉线后亚秒级拉起,并把stdout/stderr重定向到/var/log/kuailian.log,满足“本地可审计”的合规底线,也省去手动写crontab的碎片脚本。
前置检查:版本、空间与依赖
1. 系统版本门槛
经验性观察:19.07 之后的官方发行版均已内置procd;若您停留在18.06或社区魔改固件,请先确认/sbin/procd存在,否则后续init.d脚本无法注册。
2. 剩余空间与依赖库
快连官方二进制(截至当前的最新版本)压缩后约5.8 MB,解压后12 MB,加上日志轮转建议预留≥30 MB。依赖:libopenssl、librt、libpthread,均可通过opkg install libopenssl pthread在线补齐。
安装与初次运行:先保证“裸命令”能通
1. 把官方bin上传到/usr/bin/kuailian-core并chmod +x。
2. 手动执行一次:kuailian-core -c /etc/kuailian/config.json --log-level info
3. 观察能否正常输出“Login succeed”且curl ipinfo.io返回非本地IP;若失败,请先在命令行排错,再进入守护阶段,否则procd会陷入无限重启。
编写procd启动脚本:最小可运行模板
在/etc/init.d/新建文件kuailian,内容如下(已合并日志重定向与掉线保护):
#!/bin/sh /etc/rc.common
START=99
STOP=10
USE_PROCD=1
PROG=/usr/bin/kuailian-core
CONF=/etc/kuailian/config.json
start_service() {
procd_open_instance
procd_set_param command "$PROG" -c "$CONF" --log-level info
procd_set_param respawn # 核心:掉线即重启
procd_set_param stdout 1 # 日志进procd
procd_set_param stderr 1
procd_set_param pidfile /var/run/kuailian.pid
procd_close_instance
}
stop_service() {
killall kuailian-core 2>/dev/null
}
保存后执行chmod +x /etc/init.d/kuailian。
注册开机自启并首次启动
提示:以下命令均在SSH(Dropbear)下完成,Luci界面无对应按钮。
/etc/init.d/kuailian enable# 创建/etc/rc.d/S99kuailian符号链接,实现开机自启/etc/init.d/kuailian start# 立即启动并托管logread -e kuailian# 若看到“procd: Instance kuailian::instance1 started”即注册成功
验证守护效果:手动杀进程看是否秒级重生
1. 记录PID:pgrep kuailian-core
2. 强制杀掉:kill -9 <PID>
3. 立即再次pgrep,若新PID出现且时间戳相差不足1 s,则procd respawn生效。
日志留存与轮转:防止/var/log撑爆
procd默认把stdout/stderr送进ring buffer(logread),重启路由即丢失。若当地法规要求“留存≥15 天”,需额外配置logrotate或写入外置U盘:
- 方案A:安装
logrotate,新建/etc/logrotate.d/kuailian,限制单文件1 MB,保留5份。 - 方案B:在start_service里把
--log-file /mnt/sda1/kuailian.log直接写死,跳过syslog,适合长期插U盘的环境。
边界条件:何时不该用procd守护
经验性观察:若节点本身被GFW短时黑洞,频繁重连可能导致“封IP+封端口”双杀,日志里会出现连续“handshake timeout”。此时应让进程冷却数分钟而非立即重启,可改用respawn_threshold & respawn_timeout参数或外部cron脚本做指数退避。
与Kill Switch协同:掉线后切断外网
快连自带--kill-switch参数,会在TUN down时写入iptables规则。若您把进程托管给procd,还需在stop_service()里显式清理防火墙,否则重启路由前会一直断网。示例:
iptables -F kill_switch_guard ip6tables -F kill_switch_guard
多拨与负载均衡:procd脚本如何扩展
若您使用mwan3做多拨,可在start_service()前先用ip route add table 100把kuailian-core绑定到指定出口,避免重启后路由表被mwan3刷掉。该做法属于“进阶可选”,不在官方文档范围,但经社区验证可复现。
故障排查速查表
| 现象 | 可能原因 | 验证命令 | 处置 |
|---|---|---|---|
| logread无kuailian字样 | 脚本未给执行位 | ls -l /etc/init.d/kuailian | chmod +x |
| S99kuailian未生成 | enable失败 | ls /etc/rc.d/S99* | 重新enable |
| 无限重启 | 配置.json语法错 | kuailian-core -t -c config.json | 修正JSON |
| 重启后TUN权限拒 | 用户非root | ps | grep kuailian | procd默认root,勿降权 |
常见问答(FAQ Schema)
Q1:procd与systemd有何区别?
OpenWrt使用轻量级procd,而非桌面Linux的systemd;语法与命令集完全不同,不可混用。
Q2:能否把kuailian-core降权到nobody?
TUN设备需要CAP_NET_ADMIN,降权后无法创建接口;procd默认以root运行,建议保持。
Q3:日志太大撑满内存怎么办?
安装logrotate或把--log-file指向外置U盘,并限制单文件1 MB、保留5份。
Q4:如何临时关闭自启?
执行/etc/init.d/kuailian disable && /etc/init.d/kuailian stop即可,下次升级固件前有效。
Q5:procd respawn阈值能否自定义?
可以,在procd_set_param respawn 3600 5 0里把“5”改成更高值,实现一小时最多5次重启,降低被封概率。
最佳实践清单(可打印)
- 永远先手动跑通裸命令,再交给procd。
- 给脚本加
set -e,出错即退出,避免静默失败。 - 日志与配置分盘存放,U盘掉线时进程仍可写内存日志。
- 升级固件后重新enable,防止rc.d链接被刷掉。
- 每季度检查一次
logread -e kuailian,确认无“handshake timeout”风暴。
收尾:下一步行动建议
完成上述步骤后,kuailian已在OpenWrt实现“开机自启+掉线秒重连+本地可审计”。建议您立即做一次“断电重启—杀进程—查日志”三连环测试,确认无误后再把路由器交付家人或公司使用。若节点出现连续被封,可回到respawn阈值或使用外部冷却脚本,而非盲目升级带宽。路由侧稳定了,再把Kill Switch与DNS over HTTPS串进同一procd实例,全屋流量就能在合规与性能之间取得平衡。
📺 相关视频教程
【2024年】保姆级openclash教程,避免在openclash在使用中可能遇到的各种问题
分享这篇文章:


