Java小强个人技术博客站点    手机版
当前位置: 首页 >> 开源 >> 内网穿透FRP

内网穿透FRP

40 开源 | 2026-1-16

什么是内网穿透?

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

内网穿透.jpg

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:[刚才配置的仪表盘端口]

frp.jpg

至此服务器的安装配置和启动就完成


客户端安装和配置

安装步骤与服务端基本相同,除最后一步修改文件不同

服务端修改的是 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 &

可以通过仪表盘来监控连接情况

image.png

为了保证客户端自动启动和守护,创建一个检测脚本 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端口即可。

推荐您阅读更多有关于“ tcp HTTP UDP 内网穿透 FRP ”的文章

下一篇:Coqui.ai 文本转语音 Ubuntu安装

猜你喜欢

发表评论: