网站Logo 爱絮叨的充电桩

frp 详解:从原理到部署的完整指南

alan
8
2025-09-03

一、什么是 frp?

frp 是一个高性能的反向代理工具,专注于内网穿透场景。它通过在公网服务器和内网设备之间建立安全连接,让你能够从互联网访问处于内网环境中的服务(如 Web 服务器、SSH 端口、远程桌面等)。

frp 的核心组件

  • frps:服务端程序,需要部署在具有公网 IP 的服务器上,负责接收客户端的连接并转发请求

  • frpc:客户端程序,部署在内网设备上,负责与服务端建立连接并提供本地服务

frp 的工作原理

  1. 客户端(frpc)主动与公网服务端(frps)建立连接并保持

  2. 当外部用户需要访问内网服务时,先连接到公网服务端的指定端口

  3. 服务端通过已建立的连接,将请求转发给内网客户端

  4. 客户端将请求转发给本地对应的服务,并将响应通过原路返回

这种方式巧妙地绕过了内网设备没有公网 IP、被 NAT 隔离等限制,实现了从公网访问内网服务的需求。

二、如何部署 frp?(TOML 配置版)

下面以 Linux 系统为例,详细介绍 frp 的部署过程,包括服务端和客户端的配置,所有配置文件将使用 TOML 格式。

步骤 1:准备工作

  1. 公网服务器:需要一台具有固定公网 IP 的服务器(云服务器即可,如阿里云、腾讯云等)

  2. 内网设备:需要被访问的内网设备(可以是服务器、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)

  1. 配置服务端:创建并编辑 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 frps
sudo systemctl enable frps
sudo systemctl start frps

开放防火墙端口

需开放配置文件中指定的 bind_portdashboard_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)

  1. 配置客户端:创建并编辑 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 &
  1. 设置开机自启

    类似服务端,创建 systemd 服务文件 /etc/systemd/system/frpc.service 并启用。

步骤 4:验证部署

  1. 访问服务端 dashboard:http://your_server_ip:7500,使用配置的账号密码登录,查看客户端连接状态

  2. 测试各种服务是否能正常访问:

    • 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 以下),防止与系统服务冲突

  • 调整日志级别:生产环境中可将日志级别设为 warnerror,减少磁盘占用

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 相同,保持了配置的可读性

四、常见问题排查

  1. 连接失败

    • 检查服务端和客户端的 token 是否一致

    • 确认服务端防火墙是否开放了 bind_port

    • 检查客户端是否能访问服务端的 bind_port

  2. 服务无法访问

    • 检查对应服务的配置是否正确(local_ip、local_port)

    • 确认服务端是否开放了对应的 remote_port

    • 查看 frp 日志,分析具体错误信息

  3. 连接不稳定

    • 检查网络质量,特别是客户端到服务端的网络稳定性

    • 尝试调整 heartbeat_intervalheartbeat_timeout 参数

    • 考虑更换更高性能的公网服务器

frp 作为一款优秀的内网穿透工具,配置简单但功能强大,能够满足大多数场景下的内网穿透需求。使用 TOML 格式配置文件可以使配置更加清晰易读,尤其适合复杂场景的配置管理。只要掌握了基本配置方法并注意安全事项,就能轻松实现从公网访问内网服务的目标。

动物装饰