OpenWrt 配置 开机启动 服务

提示

查看此教程前请确保您已阅读 frpc 基本使用指南 中的 Linux 安装 部分

安装

SakuraFrp 分发的 frpc 均已经过 UPX 压缩 (除了 mips64 架构),如果您的路由器剩余存储空间不足以存放 frpc,可能需要换一个路由器 请自行寻找解决方案(例如插一个 U 盘)。

首先您需要下载 SakuraFrp 版本的 frpc 至您的路由器,并将其放置在 /sbin 目录下

将其中的 <下载链接> 根据您路由器的架构替换为 软件下载页在新窗口打开 中具体的链接,具体如何选择请参考 Linux 使用文档

wget <下载链接> -O /sbin/natfrpc && \
chmod a+wx /sbin/natfrpc # 修改可执行权限和可写权限(用于更新)

此时您就可以使用 natfrpc 命令来执行 frpc 了,但是还需下面的操作实现自启动

开机自启动

我们这里以 Procd Init Script在新窗口打开 实现自启动

需要注意的是 OpenWrt 自 bb(Barrier Breaker) 后引入了该系统,如果您使用 aa 或更早的上古系统,您可能需要使用 sysV 格式写启动脚本

创建一个名为 /etc/init.d/natfrpc 的文件,内容如下(请注意修改下面的启动参数):

#!/bin/sh /etc/rc.common

USE_PROCD=1
START=90

start_service() {
    ####### 第一条隧道 #######
    procd_open_instance SakuraFrp
    procd_set_param command /sbin/natfrpc

    procd_append_param command -f <您的隧道启动参数> --update # 请修改此行为您的隧道启动参数,同时可添加远程控制隧道启停等配置
 
    procd_set_param env LANG=zh_CN.UTF-8 # 用于显示中文日志,删除即显示英文日志
    procd_set_param limits nofile="unlimited"
    procd_set_param respawn 300 5 10
    procd_set_param stdout 1
    procd_set_param stderr 1
    procd_add_jail natfrp log
    procd_close_instance

    ####### 第二条隧道 #######
    procd_open_instance SakuraFrp2 # 注意这里的名字是 SakuraFrp2,后面有个数字编号
    procd_set_param command /sbin/natfrpc

    procd_append_param command -f <另外一个启动参数> --update # 请修改此行为您的隧道启动参数,同时可添加远程控制隧道启停等配置
 
    procd_set_param env LANG=zh_CN.UTF-8 # 用于显示中文日志,删除即显示英文日志
    procd_set_param limits nofile="unlimited"
    procd_set_param respawn 300 5 10
    procd_set_param stdout 1
    procd_set_param stderr 1
    procd_add_jail natfrp log
    procd_close_instance
}

然后执行:

sed -i 's/\r//' /etc/init.d/natfrpc # 如果您在 Windows 创建了上述文件并上传,执行此命令去除 \r 换行符
chmod +x /etc/init.d/natfrpc # 为其赋予可执行权限
/etc/init.d/natfrpc start # 启动服务
/etc/init.d/natfrpc enable # 如果需要,启用开机自启动

网页控制台

此时您已经可以在 OpenWrt 的 Web 面板,即 LuCI 中查看 frpc 的状态

如在 状态 - 系统日志 可以看到 frpc 的运行日志和连接信息(新日志内容在底部,请下滑):

系统 - 启动项 中可以看到名为 natfrpc 的项目,并控制开机自启情况,启动/停止/重启等操作

问题排除

jail 错误

提示

理论上,这个问题在 OpenWrt v23 版本已经修复,但并非所有人都会升级

frpc 使用的是静态编译,而 jail 依旧会报动态 section 缺失错误,像这样:

jail: failed to load the .dynamic section from /sbin/natfrpc

此时只需要通过禁用 jail 即可解决。将 /etc/init.d/natfrpc 下相应代码删除或注释即可:

...
procd_set_param stderr 1
#procd_add_jail natfrp log
procd_close_instance
...

注意

所有隧道的相应字段都要删除或注释

证书错误

对于 OpenWrt 用户来说,因为路由器的软件常年永不更新,视固件的年代,可能出现这样的错误:

x509: certificate signed by unknown authority

此时可以通过更新ca-certificates包来修复:

opkg update
opkg install ca-certificates

对于年代更为久远的,已经散发出老坛香气的固件,在线更新 ca-certificates 很可能不能做到或者不可能,此时请跟随下面步骤:

  1. 找到一个其他版本的 OpenWrt 源中的 ca-certificates包,如此文件在新窗口打开
  2. 下载到路由器中,如果您的网络仍正常工作,可以使用 wget https://downloads.openwrt.org/releases/21.02.1/packages/aarch64_generic/base/ca-certificates_20210119-1_all.ipk -O /tmp/ca-certificates.ipk
  3. 如果上一步执行出错,请手动下载后将文件上传到 /tmp/ca-certificates.ipk
  4. 执行 opkg install /tmp/ca-certificates.ipk 安装