什么是内网穿透?
通过一台拥有 "公共网络地址" 的服务器作为中转媒介,和内网服务主机建立通信关系,以此实现通过外部网络访问内网的效果。

frp 是什么?
frp 是一款高性能的反向代理应用,专注于内网穿透。它支持多种协议,包括 TCP、UDP、HTTP、HTTPS 等,并且具备 P2P 通信功能。使用 frp,您可以安全、便捷地将内网服务暴露到公网,通过拥有公网 IP 的节点进行中转。
为什么选择 frp?
通过在具有公网 IP 的节点上部署 frp 服务端,您可以轻松地将内网服务穿透到公网,并享受以下专业特性:
多种协议支持:客户端服务端通信支持 TCP、QUIC、KCP 和 Websocket 等多种协议。
TCP 连接流式复用:在单个连接上承载多个请求,减少连接建立时间,降低请求延迟。
代理组间的负载均衡。
端口复用:多个服务可以通过同一个服务端端口暴露。
P2P 通信:流量不必经过服务器中转,充分利用带宽资源。
客户端插件:提供多个原生支持的客户端插件,如静态文件查看、HTTPS/HTTP 协议转换、HTTP、SOCKS5 代理等,以便满足各种需求。
服务端插件系统:高度可扩展的服务端插件系统,便于根据自身需求进行功能扩展。
用户友好的 UI 页面:提供服务端和客户端的用户界面,使配置和监控变得更加方便。
frp 采用 Go 语言编写,支持跨平台,只需下载适用于您平台的二进制文件即可执行,无需额外依赖。
https://github.com/fatedier/frp/releases
开始使用
编写配置文件,目前支持的文件格式包括 TOML/YAML/JSON,旧的 INI 格式仍然支持,但已经不再推荐。
使用以下命令启动服务器:./frps -c ./frps.toml。
使用以下命令启动客户端:./frpc -c ./frpc.toml。
如果需要在后台长期运行,建议结合其他工具,如 systemd 和 supervisor。
如果您是 Windows 用户,需要在命令提示符中执行相同的命令。
场景示例
https://gofrp.org/zh-cn/docs/examples/
配置参考
https://gofrp.org/zh-cn/docs/reference/
一个完整使用样例:
在CentOS7,或者Ubuntu上,在home下创建文件夹frp,然后把安装包上传到该目录,例如我的服务器下载的是:frp_0.66.0_linux_amd64.tar.gz,但是客户机由于是一个ARM的工控板,所以用:frp_0.66.0_linux_arm64.tar.gz。
然后解压和移动文件目录:
cd /home/frp tar -zxvf frp_0.66.0_linux_amd64.tar.gz cp -avf frp_0.66.0_linux_amd64/* ./ rm -rf frp_0.66.0_linux_amd64
修改服务端配置文件 frps.toml
# frps.toml - 服务端配置
# 基础配置
bindPort = 7000 # frps 监听端口
# 端口限制(可选,提升安全性)
allowPorts = [
{ start = 10000, end = 20000 }
]
# 安全配置
[auth]
method = "token"
token = "123456" # 请修改为复杂密码
# Web 管理界面(可选)
[webServer]
addr = "0.0.0.0"
port = 7500
user = "admin"
password = "123456"
# 日志配置
[log]
to = "./frps.log"
level = "info"
maxDays = 7启动命令(如果启动失败,需要先设置防火墙开放端口),编写一个启动脚本start.sh
/home/frp/frps -c /home/frp/frps.toml &
启动成功可以去浏览器验证一下仪表盘页面,仪表盘访问地址:公网IP:[刚才配置的仪表盘端口]

至此服务器的安装配置和启动就完成
客户端安装和配置
安装步骤与服务端基本相同,除最后一步修改文件不同
服务端修改的是 frps.toml
客户端修改的是 frpc.toml
# frps.toml - 服务端配置 serverAddr = "22.22.22.22" serverPort = 22 [auth] method = "token" token = "123456" # 与服务端保持一致 # slam板8888 服务穿透 [[proxies]] name = "slam" type = "tcp" localIP = "192.168.11.1" localPort = 8888 remotePort = 18888 transport.useEncryption = true transport.useCompression = true # slam板22 服务穿透 [[proxies]] name = "slam" type = "tcp" localIP = "192.168.11.1" localPort = 22 remotePort = 10022 transport.useEncryption = true transport.useCompression = true # 日志配置 [log] to = "/home/frp/frpc.log" level = "info" maxDays = 7
启动客户端,同样编写一个启动脚本start.sh
/home/frp/frpc -c /home/frp/frpc.toml &
可以通过仪表盘来监控连接情况

为了保证客户端自动启动和守护,创建一个检测脚本 check_frpc.sh
#!/bin/bash
# 定义变量,方便后续修改
FRPC_BIN="/home/frp/frpc"
CONFIG_FILE="/home/frp/frpc.toml"
START_SCRIPT="/home/frp/start.sh"
# 获取当前时间戳(格式:YYYY-MM-DD HH:MM:SS)
LOG_TIME=$(date "+%Y-%m-%d %H:%M:%S")
# 1. 检查进程是否存活
# 使用 ps -ef | grep 过滤出目标进程
# 注意:这里需要精确匹配命令行参数,避免误杀其他同名进程
PID=$(ps -ef | grep "[f]rpc -c $CONFIG_FILE" | awk '{print $2}')
if [ -z "$PID" ]; then
echo "[$LOG_TIME] ❌ FRP Client 已停止,正在尝试重启..."
# 2. 执行启动脚本
# 假设 start.sh 是一个可执行文件,或者你需要直接运行二进制文件
# 如果 start.sh 只是一个包含启动命令的文本文件,请使用 source 或 . 来执行它
# 为了保险起见,这里直接调用二进制文件启动
# 如果你确定 start.sh 是一个脚本,可以替换为: . $START_SCRIPT
$FRPC_BIN -c $CONFIG_FILE &
if [ $? -eq 0 ]; then
echo "[$LOG_TIME] ✅ 重启成功!"
else
echo "[$LOG_TIME] ⚠️ 重启失败,请检查日志。"
fi
else
echo "[$LOG_TIME] ✅ FRP Client 正常运行 (PID: $PID)"
fi编辑Linux定时任务列表
crontab -e
增加内容
* * * * * /home/frp/check_frpc.sh >> /home/frp/monitor.log 2>&1
Linux系统会每分钟检查一次程序是否启动,检查日志输出到monitor.log中。
至此,如果你想要访问192.168.11.1的22端口时,直接访问,代理服务器的10022端口即可。
Java小强
未曾清贫难成人,不经打击老天真。
自古英雄出炼狱,从来富贵入凡尘。
发表评论: