前言
GL.iNet 官方提供了云服务,但外网环境中访问需安装应用程序,受限于 macOS/Windows 平台,在个别信创系统中无法使用,故将内网可以访问的 Web 服务映射至公网会是更方便的选择,而大部分家用网络并未提供公网IP,且即使有 IPv6 地址借助 DDNS 也时常伴随着不稳定,更限制了访问端必须拥有 IPv6 环境,所以使用内网穿透工具或者frp会是更好的解决方案。
安装 frp 客户端
查看系统架构:
arch在GitHub项目页:https://github.com/fatedier/frp 的 Releases 中下载最新对应架构的客户端文件(仅保留
frpc及frpc.toml即可)提前在本地编辑好
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 # 要映射在服务端的端口使用
scp命令分别上传frpc与frpc.toml两个文件到指定目录:
scp frpc root@[GLKVM地址]:/usr/binscp frpc.toml root@[GLKVM地址]:/etc/frp设置开机自启
手动创建开机启动文件
/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 保存退出;
创建
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 保存退出;
赋予脚本执行权限并启动
chmod +x /etc/init.d/frpc
/etc/init.d/frpc start