斐讯N1盒子安装Openwrt系统,部署Frp服务教程

斐讯N1盒子安装Openwrt系统,部署Frp服务教程

问题:N1安装Openwrt系统后,需要安装Frpc指定版本的客户端,但系统自带的软件包无法通过图形界面安装frpc_0.51.3-r1版本,目前只能通过命令行安装frpc0.51.3版本。安装Frpc后,遇到几个致命问题。

1.luci-app-frpc界面保存并应用时,生成的配置信息完全正确,配置文件路径: /etc/config/frpc

注意事项:/etc/config/frpc 这个文件通常是由 LuCI 的图形界面程序(luci-app-frpc)在您保存配置时自动生成的。严格来说,/etc/config/frpc 这个路径是专门为 LuCI 界面服务的 UCI 配置文件。它和 frp 客户端默认读取的 frpc.ini 有所不同。luci-app-frpc 插件会读取这个 UCI 文件,并将其转换为 frp 客户端能识别的 frpc.ini 格式,再启动服务

2.点击保存和应用时,图形界面专用的/etc/config/frpc配置信息文件,配置无法自动同步到/var/etc/frpc.ini文件中,导致Frpc客户端无法读取frpc.ini正确配置,运行失败。

3.由于不是通过软件包安装的Frpc应用,界面上保存和应用后,进入到终端,只有手动启动脚本/etc/init.d/frpc restart/reload时,/etc/init.d/frpc启动器中的执行逻辑代码,才能读取/etc/config/frpc文件,写入配置信息到/var/etc/frpc.ini中。

4.在新的 LuCI 系统中,页面点击“保存并应用”时,后台是通过 RPCD 去调用 /etc/init.d/frpc reload。要让系统在修改网页时自动刷新配置文件,必须满足两个条件

启动脚本必须向系统的 service 管理层注册 reload 响应能力

启动脚本中包含 service_triggers()(监听 /etc/config/frpc 变化)

Frpc安装教程:

# 1. 进入临时目录
cd /tmp

# 2. 下载 frp 0.51.3 的 Linux ARM64 原版程序
wget https://github.com/fatedier/frp/releases/download/v0.51.3/frp_0.51.3_linux_arm64.tar.gz

# 3. 解压
tar -zxvf frp_0.51.3_linux_arm64.tar.gz

# 4. 停止 frpc 服务
/etc/init.d/frpc stop 2>/dev/null

# 5. 替换系统现有的 frpc 主程序
cp -f /tmp/frp_0.51.3_linux_arm64/frpc /usr/bin/frpc
chmod +x /usr/bin/frpc

# 6. 验证版本
frpc -v

注意点:wget在线下载时,速度非常慢,可以用Window先下载安装包,再上传到N1的tmp目录下进行安装

Windows 10/11 系统终端已内置 scp 命令,无需安装任何软件即可直接上传。

语法格式
PowerShell

scp "Windows本地文件路径" 用户名@Linux_IP:Linux指定绝对路径

常用实例
1. 上传单个文件

打开 Windows 的 PowerShell(或 CMD),执行:
PowerShell

# 将本地 D 盘下的 test.txt 上传到 Linux 的 /www/wwwroot 目录下
scp D:\test.txt root@192.168.1.100:/www/wwwroot/

2. 上传整个文件夹(加 -r 参数)
PowerShell

# 将本地 D 盘的 my_project 文件夹整体上传到 Linux 的 /tmp 目录下
scp -r D:\my_project root@192.168.1.100:/tmp/

3. 如果 Linux 的 SSH 端口不是 22(注意大写 -P)
PowerShell

scp -P 2222 D:\test.txt root@192.168.1.100:/www/

提示:按回车后,终端会提示输入 Linux 服务器的密码,输入时屏幕不会显示字符,输完直接按回车即可。

针对以上4个坑的具体解决方案:

第一步:覆盖写入最新的 /etc/init.d/frpc 启动脚本

这段脚本包含了针对现代 OpenWrt 的 service_triggers 以及标准 reload_service:,复现下面的代码,在终端中执行,自动生成/etc/init.d/frpc启动脚本文件。

cat << 'EOF' > /etc/init.d/frpc
#!/bin/sh /etc/rc.common

START=90
STOP=10
USE_PROCD=1
CONF_FILE="/var/etc/frpc.ini"

generate_config() {
    mkdir -p /var/etc

    # 1. 解析 common 节点
    local server_addr=$(uci -q get frpc.common.server_addr || echo "127.0.0.1")
    local server_port=$(uci -q get frpc.common.server_port || echo "7000")
    local token=$(uci -q get frpc.common.token)
    local admin_port=$(uci -q get frpc.common.admin_port)
    local admin_user=$(uci -q get frpc.common.admin_user)
    local admin_pwd=$(uci -q get frpc.common.admin_pwd)

    cat <<INICONTENT > $CONF_FILE
[common]
server_addr = $server_addr
server_port = $server_port
INICONTENT

    [ -n "$token" ] && echo "token = $token" >> $CONF_FILE
    [ -n "$admin_port" ] && echo "admin_port = $admin_port" >> $CONF_FILE
    [ -n "$admin_user" ] && echo "admin_user = $admin_user" >> $CONF_FILE
    [ -n "$admin_pwd" ] && echo "admin_pwd = $admin_pwd" >> $CONF_FILE

    # 2. 遍历解析所有的 conf 规则节点
    config_load frpc
    config_foreach parse_conf conf
}

parse_conf() {
    local section="$1"

    # 跳过 common 节点
    [ "$section" = "common" ] && return 0

    # 使用 OpenWrt 标准 config_get 取值
    local name type local_ip local_port remote_port enabled
    config_get name "$section" name "$section"
    config_get type "$section" type
    config_get local_ip "$section" local_ip
    config_get local_port "$section" local_port
    config_get remote_port "$section" remote_port "0"
    config_get enabled "$section" enabled "1"

    # 如果节点未启用,或者关键参数为空,则跳过
    [ "$enabled" = "0" ] && return 0
    if [ -z "$type" ] || [ -z "$local_ip" ] || [ -z "$local_port" ]; then
        return 0
    fi

    cat <<INICONTENT >> $CONF_FILE

[$name]
type = $type
local_ip = $local_ip
local_port = $local_port
remote_port = $remote_port
INICONTENT
}

start_service() {
    generate_config

    procd_open_instance
    procd_set_param command /usr/bin/frpc -c $CONF_FILE
    procd_set_param respawn
    procd_close_instance
}

reload_service() {
    generate_config
    procd_send_signal frpc
    start_service
}

# procd 监控配置变化,保存应用时自动重新生成 ini
service_triggers() {
    procd_add_reload_trigger "frpc"
}

stop_service() {
    ps | grep /usr/bin/frpc | grep -v grep | awk '{print $1}' | xargs kill -9 2>/dev/null
}
EOF

chmod +x /etc/init.d/frpc

第二步:更新 RPCD 服务缓存并开启服务注册

在终端运行以下命令,强制系统的 RPCD 服务重新扫描并认领 /etc/init.d/frpc 脚本:

# 1. 确保 frpc 已设为开机自启并注册到系统中
/etc/init.d/frpc enable

# 2. 重启 RPCD 服务(核心步骤:让 LuCI 网页端重新读取 init.d 脚本里的 triggers)
/etc/init.d/rpcd restart

# 3. 重启 frpc
/etc/init.d/frpc restart

验证

完成上述操作后,直接去 LuCI 界面新增或修改一个穿透规则,点击 保存并应用

然后直接在终端执行:

cat /var/etc/frpc.ini

你就会发现无需手动 restart,/var/etc/frpc.ini 已经实时更新了!

=======================执行环境系统版本号===================

Kwrt 06.27.2026 by Kiddin’

OpenWrt Kernel: 6.18.36-ophub

Powered by LuCI main branch (27.161.22447~40792d9)

ArgonTheme v2.4.3

Kwrt 25.12-SNAPSHOT-06.27.2026

注意点:Nano PC-T4安装FriendlyWrt系统,配置Frpc时不存在上面兼容性问题,安装Frpc成功后,所有配置都已经正常。直接使用即可。

Comments are closed.