1. 首页
  2. 教程
  3. 在 GLKVM(GL-RM1) 上安装 frp 客户端

在 GLKVM(GL-RM1) 上安装 frp 客户端

  • 发布于 2025-11-03
  • 54 次阅读

前言

GL.iNet 官方提供了云服务,但外网环境中访问需安装应用程序,受限于 macOS/Windows 平台,在个别信创系统中无法使用,故将内网可以访问的 Web 服务映射至公网会是更方便的选择,而大部分家用网络并未提供公网IP,且即使有 IPv6 地址借助 DDNS 也时常伴随着不稳定,更限制了访问端必须拥有 IPv6 环境,所以使用内网穿透工具或者frp会是更好的解决方案。

安装 frp 客户端

  1. 查看系统架构:

arch
  1. 在GitHub项目页:https://github.com/fatedier/frpReleases 中下载最新对应架构的客户端文件(仅保留 frpc frpc.toml 即可)

  2. 提前在本地编辑好 frpc.toml 配置文件,内容参考 frp 文档编写即可,例如:

serverAddr = "0.0.0.0"     # 你的frp服务器IP
serverPort = 7000          # 你的frp服务器端口

loginFailExit=false

auth.method = "token"      # 与服务端一致
auth.token = "123456"

[[proxies]]
name = "glkvm"
type = "tcp"
localIP = "127.0.0.1"      # GLKVM的IP
localPort = 443            # 内网服务中的端口
remotePort = 8080          # 要映射在服务端的端口
  1. 使用 scp 命令分别上传 frpcfrpc.toml 两个文件到指定目录:

scp frpc root@[GLKVM地址]:/usr/bin
scp frpc.toml root@[GLKVM地址]:/etc/frp

选项

作用

-r

递归复制整个目录

-P

指定远程主机的 SSH 端口号(默认是 22)

-p

保留文件的修改时间、访问时间和权限

-v

显示详细的调试信息,有助于排查问题

-C

启用压缩,可以加快传输速度

设置开机自启

  1. 手动创建开机启动文件 /etc/rc.local

touch /etc/rc.local

chmod +x /etc/rc.local

vi /etc/rc.local

按下 i 进入插入模式,粘贴以下内容:

#!/bin/sh
# Buildroot startup script
# Start frpc service (background run + auto-restart on crash)
/etc/init.d/frpc start

按下 esc → 输入 :wq 保存退出;

  1. 创建 frpc 服务脚本

vi /etc/init.d/frpc

按下 i 进入插入模式,粘贴以下内容:

#!/bin/sh
# Pure Shell frpc daemon script (for Buildroot without OpenRC)
# Support start/stop/restart/status, and auto-restart on crash

# Configuration (adjust according to actual paths)
FRPC_BIN="/usr/bin/frpc"
FRPC_CONF="/etc/frp/frpc.toml"
PID_FILE="/var/run/frpc.pid"
RESPAWN_DELAY=5  # Delay before auto-restart (seconds)

# Log output function
log() {
    echo "[$(date +'%Y-%m-%d %H:%M:%S')] frpc: $1"
}

# Check dependencies
check_deps() {
    # Check frpc binary file
    if [ ! -x "${FRPC_BIN}" ]; then
        log "Error: frpc binary not found or not executable (${FRPC_BIN})"
        return 1
    fi
    # Check configuration file
    if [ ! -f "${FRPC_CONF}" ]; then
        log "Error: frpc.toml config file not found (${FRPC_CONF})"
        return 1
    fi
    # Ensure PID directory exists
    mkdir -p /var/run
    return 0
}

# Start frpc (with daemon logic)
start() {
    # Check dependencies first
    if ! check_deps; then
        return 1
    fi

    # Check if already running
    if [ -f "${PID_FILE}" ] && ps -p $(cat "${PID_FILE}") >/dev/null 2>&1; then
        log "Already running (PID: $(cat ${PID_FILE}))"
        return 0
    fi

    # Start frpc with background daemon (core: infinite loop, auto-restart on crash)
    log "Starting..."
    (
        while true; do
            # Start frpc
            ${FRPC_BIN} -c ${FRPC_CONF}
            # Log after exit, delay restart
            log "Crashed, auto-restart in ${RESPAWN_DELAY} seconds..."
            sleep ${RESPAWN_DELAY}
        done
    ) >/var/log/frpc.log 2>&1 &
    # Save PID
    echo $! > "${PID_FILE}"
    log "Started successfully (daemon PID: $(cat ${PID_FILE}))"
    return 0
}

# Stop frpc
stop() {
    if [ -f "${PID_FILE}" ]; then
        PID=$(cat "${PID_FILE}")
        if ps -p ${PID} >/dev/null 2>&1; then
            log "Stopping (PID: ${PID})..."
            kill -9 ${PID} >/dev/null 2>&1
            # Kill all frpc child processes (prevent residue)
            killall -9 frpc >/dev/null 2>&1
            rm -f "${PID_FILE}"
            log "Stopped"
        else
            log "Not running (PID file exists but process not found)"
            rm -f "${PID_FILE}"
        fi
    else
        log "Not running (no PID file)"
    fi
    return 0
}

# Restart frpc
restart() {
    stop
    sleep 2
    start
}

# Check status
status() {
    if [ -f "${PID_FILE}" ] && ps -p $(cat "${PID_FILE}") >/dev/null 2>&1; then
        log "Running (PID: $(cat ${PID_FILE}))"
        # Check if frpc child process exists
        if ps aux | grep -v grep | grep "${FRPC_BIN}" >/dev/null 2>&1; then
            log "frpc process is normal"
        else
            log "Warning: Daemon running but frpc child process exited"
        fi
    else
        log "Not running"
    fi
    return 0
}

# Main logic: handle command parameters
case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart)
        restart
        ;;
    status)
        status
        ;;
    *)
        echo "Usage: $0 {start|stop|restart|status}"
        exit 1
        ;;
esac

exit 0

按下 esc → 输入 :wq 保存退出;

  1. 赋予脚本执行权限并启动

chmod +x /etc/init.d/frpc

/etc/init.d/frpc start