一、什么是 frp?
frp 是一个高性能的反向代理工具,专注于内网穿透场景。它通过在公网服务器和内网设备之间建立安全连接,让你能够从互联网访问处于内网环境中的服务(如 Web 服务器、SSH 端口、远程桌面等)。
frp 的核心组件
-
frps:服务端程序,需要部署在具有公网 IP 的服务器上,负责接收客户端的连接并转发请求
-
frpc:客户端程序,部署在内网设备上,负责与服务端建立连接并提供本地服务
frp 的工作原理
-
客户端(frpc)主动与公网服务端(frps)建立连接并保持
-
当外部用户需要访问内网服务时,先连接到公网服务端的指定端口
-
服务端通过已建立的连接,将请求转发给内网客户端
-
客户端将请求转发给本地对应的服务,并将响应通过原路返回
这种方式巧妙地绕过了内网设备没有公网 IP、被 NAT 隔离等限制,实现了从公网访问内网服务的需求。
二、如何部署 frp?(TOML 配置版)
下面以 Linux 系统为例,详细介绍 frp 的部署过程,包括服务端和客户端的配置,所有配置文件将使用 TOML 格式。
步骤 1:准备工作
-
公网服务器:需要一台具有固定公网 IP 的服务器(云服务器即可,如阿里云、腾讯云等)
-
内网设备:需要被访问的内网设备(可以是服务器、PC、树莓派等)
下载 frp:从 frp 官方仓库 下载对应系统的版本,注意服务端和客户端需使用相同版本
# 查看系统架构
arch
# 下载示例(请替换为最新版本)
wget https://github.com/fatedier/frp/releases/download/v0.51.3/frp_0.51.3_linux_amd64.tar.gz
# 解压
tar -zxvf frp_0.51.3_linux_amd64.tar.gz
cd frp_0.51.3_linux_amd64# 查看系统架构
arch
# 下载示例(请替换为最新版本)
wget https://github.com/fatedier/frp/releases/download/v0.51.3/frp_0.51.3_linux_amd64.tar.gz
# 解压
tar -zxvf frp_0.51.3_linux_amd64.tar.gz
cd frp_0.51.3_linux_amd64步骤 2:部署服务端(frps)
-
配置服务端:创建并编辑
frps.toml文件(frp 支持 TOML 格式,只需将配置文件扩展名改为 .toml 即可)
frp 服务端 TOML 配置文件
[common]
# frps 监听客户端连接的端口
bind_port = 7000
# 授权令牌(客户端需与服务端一致)
token = "your_secure_token"
# 可选:dashboard 配置,用于查看 frp 运行状态
dashboard_port = 7500
dashboard_user = "admin"
dashboard_pwd = "your_dashboard_password"
# 可选:日志配置
log_file = "./frps.log"
log_level = "info"
log_max_days = 3
# 可选:设置允许的端口范围,增强安全性
allow_ports = [
{ start = 6000, end = 7000 }, # 允许 6000-7000 范围内的端口
8000, # 允许单个端口 8000
9000 # 允许单个端口 9000
]
启动服务端:
# 直接启动(测试用)
./frps -c ./frps.toml
# 后台启动(生产环境用)
nohup ./frps -c ./frps.toml &# 直接启动(测试用)
./frps -c ./frps.toml
# 后台启动(生产环境用)
nohup ./frps -c ./frps.toml &设置开机自启:
创建 systemd 服务文件 /etc/systemd/system/frps.service:
[Unit]
Description=frp server
After=network.target
[Service]
Type=simple
ExecStart=/path/to/frps -c /path/to/frps.toml
Restart=on-failure
[Install]
WantedBy=multi-user.target[Unit]
Description=frp server
After=network.target
[Service]
Type=simple
ExecStart=/path/to/frps -c /path/to/frps.toml
Restart=on-failure
[Install]
WantedBy=multi-user.target然后启用并启动服务:
sudo systemctl enable frps
sudo systemctl start frpssudo systemctl enable frps
sudo systemctl start frps开放防火墙端口:
需开放配置文件中指定的 bind_port、dashboard_port 以及后续要用到的端口:
# 以 ufw 为例
sudo ufw allow 7000/tcp
sudo ufw allow 7500/tcp
# 根据需要开放其他端口# 以 ufw 为例
sudo ufw allow 7000/tcp
sudo ufw allow 7500/tcp
# 根据需要开放其他端口步骤 3:部署客户端(frpc)
-
配置客户端:创建并编辑
frpc.toml文件
frp 客户端 TOML 配置文件
ver_ip"
# 与服务端 bind_port 一致
server_port = 7000
# 与服务端 token 一致
token = "your_secure_token"
# 可选:启用加密和压缩
use_encryption = true
use_compression = true
# 示例 1:暴露 SSH 服务(22 端口)
[ssh]
type = "tcp"
local_ip = "127.0.0.1"
local_port = 22
# 公网服务器上用于访问该服务的端口
remote_port = 6000
# 示例 2:暴露 Web 服务(80 端口)
[web]
type = "http"
local_ip = "127.0.0.1"
local_port = 80
# 自定义域名(需解析到公网服务器 IP)
custom_domains = ["your_domain.com", "www.your_domain.com"]
# 示例 3:暴露远程桌面服务(Windows RDP,3389 端口)
[rdp]
type = "tcp"
local_ip = "127.0.0.1"
local_port = 3389
remote_port = 33890
# 示例 4:暴露多个端口范围(如 6001-6003 映射到本地 8001-8003)
[range]
type = "tcp"
local_ip = "127.0.0.1"
local_port = "8001-8003"
remote_port = "6001-6003"
启动客户端:
# 直接启动(测试用)
./frpc -c ./frpc.toml
# 后台启动(生产环境用)
nohup ./frpc -c ./frpc.toml &
-
设置开机自启:
类似服务端,创建 systemd 服务文件
/etc/systemd/system/frpc.service并启用。
步骤 4:验证部署
-
访问服务端 dashboard:
http://your_server_ip:7500,使用配置的账号密码登录,查看客户端连接状态 -
测试各种服务是否能正常访问:
-
SSH:
ssh -p 6000 username@your_server_ip -
Web:在浏览器访问
http://your_domain.com -
远程桌面:使用远程桌面工具连接
your_server_ip:33890
-
三、使用 frp 的注意事项
1. 安全性考虑
-
务必设置 token:这是防止未授权客户端连接的基本措施,在 TOML 中以字符串形式配置
-
限制端口范围:在服务端配置
allow_ports限制可使用的端口范围,增强安全性 -
使用加密传输:在客户端配置中添加
use_encryption = true开启传输加密 -
启用压缩:可选项,
use_compression = true可以压缩传输数据,节省带宽 -
定期更新:及时更新 frp 到最新版本,修复已知安全漏洞
2. 性能优化
-
选择合适的服务器:公网服务器的带宽和性能直接影响访问速度
-
合理规划端口:避免使用过低的端口号(1024 以下),防止与系统服务冲突
-
调整日志级别:生产环境中可将日志级别设为
warn或error,减少磁盘占用
3. 稳定性保障
-
设置自动重连:frp 自带重连机制,但可通过
login_fail_exit = false确保失败后不退出 -
监控服务状态:使用监控工具(如 Prometheus + Grafana)监控 frp 服务状态
-
配置日志轮转:设置
log_max_days自动清理旧日志,或使用 logrotate 工具 -
避免频繁重启:频繁重启可能导致服务端暂时拒绝连接
4. TOML 配置的优势与注意事项
-
结构清晰:TOML 使用分区和键值对结构,比 INI 更清晰地组织复杂配置
-
字符串处理:TOML 中字符串可以使用双引号或单引号,特殊字符需要适当转义
-
数组支持:TOML 原生支持数组类型,如
custom_domains = ["a.com", "b.com"]比 INI 更简洁 -
注释格式:TOML 使用
#进行注释,与 INI 相同,保持了配置的可读性
四、常见问题排查
-
连接失败:
-
检查服务端和客户端的 token 是否一致
-
确认服务端防火墙是否开放了
bind_port -
检查客户端是否能访问服务端的
bind_port
-
-
服务无法访问:
-
检查对应服务的配置是否正确(local_ip、local_port)
-
确认服务端是否开放了对应的 remote_port
-
查看 frp 日志,分析具体错误信息
-
-
连接不稳定:
-
检查网络质量,特别是客户端到服务端的网络稳定性
-
尝试调整
heartbeat_interval和heartbeat_timeout参数 -
考虑更换更高性能的公网服务器
-
frp 作为一款优秀的内网穿透工具,配置简单但功能强大,能够满足大多数场景下的内网穿透需求。使用 TOML 格式配置文件可以使配置更加清晰易读,尤其适合复杂场景的配置管理。只要掌握了基本配置方法并注意安全事项,就能轻松实现从公网访问内网服务的目标。