前言
在日常生活中,你是否遇到过这样的困扰:
- 在家搭建了一个 NAS 或家庭影院系统,想在外面访问却无法实现
- 开发了一个 Web 应用,只能在本地局域网内访问,无法分享给外网的朋友
- 有一台树莓派或内网服务器,想远程控制却因为没有公网 IP 而束手无策
这些问题都可以通过 FRP(Fast Reverse Proxy) 来解决。本文将详细介绍 FRP 的原理、作用以及完整的搭建教程。
一、FRP 是什么?能干什么?
1.1 FRP 简介
FRP(Fast Reverse Proxy)是一个专注于内网穿透的高性能反向代理应用,使用 Go 语言开发,支持 TCP、UDP、HTTP、HTTPS 等多种协议。它可以将内网服务以安全、便捷的方式通过具有公网 IP 的节点中转暴露到公网。
FRP 项目地址:https://github.com/fatedier/frp
1.2 FRP 能干什么?
FRP 的应用场景非常广泛:
| 场景 | 说明 |
|---|---|
| 远程访问家庭 NAS | 在外网访问家里的 NAS,查看文件、播放媒体 |
| 远程开发调试 | 将本地开发的服务暴露到公网,方便第三方测试 |
| 建立私人 VPN | 通过 FRP + SSH 实现安全的远程访问 |
| 访问局域网设备 | 如摄像头、打印机、智能家居设备等 |
| 微信/支付宝等回调开发 | 需要接收外网请求的本地服务 |
| 游戏联机/服务器 | 进行Minecraft联机就可以使用FRP |
二、为什么需要 FRP?
2.1 内网设备的困境
我们都知道,互联网上的主机要互相通信,首先需要知道对方的公网 IP 地址。然而现实情况是:
- IPv4 地址枯竭:全球 IPv4 地址早已不够用,普通用户难以获得公网 IP
- NAT 网络地址转换:大多数用户的网络环境是这样的:
用户设备 → 家庭路由器 → 运营商 NAT → 互联网家庭路由器分配的是 192.168.x.x、172.16.x.x、10.x.x.x 等内网 IP,而运营商可能进一步使用 CGNAT(运营商级 NAT),将大量用户共享少量公网 IP。
结果是:外网无法主动连接到你的任何设备。
2.2 常见解决方案对比
| 方案 | 优点 | 缺点 |
|---|---|---|
| 花生壳等商业工具 | 开箱即用 | 免费版限速限流、有广告、需付费 |
| IPv6 | 直接寻址 | 部分运营商限制,老旧设备不支持 |
| 申请公网 IP | 真实公网访问 | 电信部分可行,移动/联通基本无望 |
| FRP | 完全自主可控、支持多种协议 | 需要一台云服务器 |
2.3 FRP 的优势
相比其他方案,FRP 具有以下优势:
- 完全自主可控:只需一台廉价云服务器,月付 ¥10-30
- 多协议支持:TCP、UDP、HTTP、HTTPS 等
- 高性能:采用 TCP 连接流式复用,节省资源
- 安全:支持 TLS 加密、身份验证
- 跨平台:支持 Linux、Windows、macOS、树莓派等
三、FRP 工作原理详解
3.1 核心组件
FRP 采用 C/S(客户端/服务端)架构,由两个核心程序组成:
| 组件 | 运行位置 | 功能 |
|---|---|---|
| frps(Server) | 公网服务器(云服务器) | 接收外网请求,转发给内网客户端 |
| frpc(Client) | 内网设备(PC/NAS/树莓派) | 主动连接 frps,注册本地服务 |
3.2 工作流程
FRP 的工作原理可以分为以下几个步骤:
┌─────────────────────────────────────────────────────────────┐│ 公网服务器 (frps) ││ ┌─────────┐ ││ │ frps │◄────── 控制连接 (TCP 长连接) ────────► frpc ││ │ │ ││ │ 端口 │◄──────── 数据转发 ─────────────────── 内网服务 ││ │ 映射 │ ││ └─────────┘ │└─────────────────────────────────────────────────────────────┘-
内网主动出站:frpc 启动后,主动连接 frps 的监听端口(默认 7000),建立持久 TCP 长连接
-
服务注册:frpc 告知 frps:“我能代理本地 127.0.0.1:8080 的 HTTP 服务”
-
外网请求到达:用户访问
http://公网IP:端口或http://域名,DNS 解析到 frps 服务器 -
智能路由:frps 根据端口号或 HTTP Host 头,找到对应的 frpc
-
数据透传:frps 通过已有连接通知 frpc,双方建立数据通道,后续流量双向转发
3.3 支持的代理类型
FRP 支持多种代理类型,适应不同的使用场景:
| 代理类型 | 用途 | 特点 |
|---|---|---|
| TCP | 通用端口映射 | 适用于 SSH、RDP、游戏服务器等 |
| UDP | UDP 端口映射 | 适用于 DNS、视频流等 |
| HTTP/HTTPS | Web 服务 | 支持域名虚拟主机、自动 Host 头处理 |
| STCP/SUDP | 安全内网代理 | 无公网端口暴露,需双方部署 frpc |
| XTCP | P2P 直连 | 打洞成功后可绕过服务器,节省带宽 |
四、FRP 搭建实战
4.1 准备工作
在开始之前,你需要准备:
- 一台 Linux 公网服务器(推荐 Ubuntu/CentOS,最低 1核1G)
- 一台 内网设备(Windows/Linux/macOS/树莓派)
- 一个域名(可选,但 HTTP/HTTPS 模式必需)
4.2 下载 FRP
从 GitHub Release 页面下载最新版的二进制文件:
# 下载(根据你的系统架构选择版本)wget https://github.com/fatedier/frp/releases/download/v0.62.0/frp_0.62.0_linux_amd64.tar.gz
# 解压tar -xzf frp_0.62.0_linux_amd64.tar.gzcd frp_0.62.0_linux_amd64解压后你会看到以下文件:
.├── frpc # 客户端程序├── frpc.toml # 客户端配置├── frps # 服务端程序├── frps.toml # 服务端配置└── LICENSE服务端和客户端使用同一份程序,只是配置文件不同。我们将它们分开:
# 创建目录分别存放mkdir -p /opt/frp/server # 服务端mkdir -p /opt/frp/client # 客户端
# 服务端保留 frps 和 frps.tomlmv frps frps.toml /opt/frp/server/
# 客户端保留 frpc 和 frpc.tomlmv frpc frpc.toml /opt/frp/client/4.3 配置服务端 (frps)
编辑服务端的配置文件 /opt/frp/server/frps.toml:
[common]# 服务端监听端口,客户端连接到此端口bindPort = 7000
# HTTP 服务入口端口(如果使用 HTTP 代理)vhostHttpPort = 8080
# HTTPS 服务入口端口(如果使用 HTTPS 代理)# vhostHttpsPort = 8443
# 身份验证auth.method = "token"auth.token = "your_strong_token_here" # 建议使用强密码
# Dashboard 配置(Web 管理界面)webServer.addr = "0.0.0.0"webServer.port = 7500webServer.user = "admin"webServer.password = "your_dashboard_password"
# 日志配置log.to = "/var/log/frp/frps.log"log.level = "info"log.maxDays = 7
# 开启 Prometheus 监控指标(可选)enablePrometheus = true注意:记得在云服务器的安全组中开放
7000、7500、8080等端口。
启动服务端:
# 前台运行(测试用)./frps -c ./frps.toml
# 后台运行nohup ./frps -c ./frps.toml &使用 systemd 管理(推荐):
[Unit]Description = frp serverAfter = network.target
[Service]Type = simpleExecStart = /opt/frp/server/frps -c /opt/frp/server/frps.tomlRestart = alwaysRestartSec = 5
[Install]WantedBy = multi-user.targetsudo systemctl daemon-reloadsudo systemctl enable frpssudo systemctl start frpssudo systemctl status frps访问 http://你的服务器IP:7500,输入 Dashboard 用户名和密码,即可看到管理界面。
4.4 配置客户端 (frpc)
编辑客户端的配置文件 /opt/frp/client/frpc.toml:
[common]# 服务端地址和端口serverAddr = "你的服务器IP"serverPort = 7000
# 身份验证,需与服务端一致auth.method = "token"auth.token = "your_strong_token_here"
# 日志配置log.to = "./frpc.log"log.level = "info"log.maxDays = 7
# ==== TCP 代理示例 ====# 将本地 22 端口映射到服务器 6000 端口[[proxies]]name = "ssh"type = "tcp"localIP = "127.0.0.1"localPort = 22remotePort = 6000
# ==== HTTP 代理示例 ====# 将本地 8080 端口的 Web 服务映射到服务器[[proxies]]name = "web"type = "http"localIP = "127.0.0.1"localPort = 8080customDomains = ["your-domain.com"]启动客户端:
# 前台运行./frpc -c ./frpc.toml
# 后台运行nohup ./frpc -c ./frpc.toml &4.5 进阶配置:使用域名访问
如果你有域名,可以配置 HTTP/HTTPS 代理,通过域名访问内网服务。
服务端额外配置:
# 在 frps.toml 中确保已设置vhostHttpPort = 8080客户端配置:
[[proxies]]name = "web"type = "http"localIP = "127.0.0.1"localPort = 8080customDomains = ["web.your-domain.com"]然后在域名服务商添加 DNS 记录:
web.your-domain.com → 你的服务器IP这样,访问 http://web.your-domain.com:8080 就会自动转发到你的内网服务。
4.6 进阶配置:负载均衡
FRP 支持代理组间的负载均衡,非常适合多实例部署的场景:
[[proxy groups]]name = "web_group"type = "load-balance"selector = "round-robin"servers = [ { name = "web1", localIP = "192.168.1.100", localPort = 8080 }, { name = "web2", localIP = "192.168.1.101", localPort = 8080 },]五、安全加固建议
FRP 功能强大,但配置不当会带来安全风险。以下是一些加固建议:
5.1 必做安全措施
- 使用强 Token:不要使用简单的密码,使用随机生成的强密码
- 限制 Dashboard 访问:使用防火墙规则限制只有特定 IP 可以访问 7500 端口
- 启用 TLS 加密:在
[common]中添加transport.tls.tlsCertFile和transport.tls.tlsKeyFile - 避免使用 root 运行:创建专门的 frp 用户
5.2 TLS 加密配置示例
# 服务端 frps.toml[common]transport.tls.tlsCertFile = "/path/to/cert.pem"transport.tls.tlsKeyFile = "/path/to/key.pem"transport.tls.force = true
# 客户端 frpc.toml[common]transport.tls.tlsCertFile = "/path/to/cert.pem"transport.tls.tlsKeyFile = "/path/to/key.pem"transport.tls.force = true六、常见问题
Q1: 连接失败,提示 “login to server failed”
- 检查服务端是否正常运行
- 确认 serverAddr、serverPort、auth.token 与服务端配置一致
- 检查防火墙和安全组是否放行了端口
Q2: HTTP 服务无法访问
- 确认服务端 vhostHttpPort 配置正确
- 检查客户端 customDomains 是否正确解析到服务器 IP
- 确认域名 DNS 记录生效
Q3: 如何查看连接状态?
- 访问 Dashboard(默认 http://服务器IP:7500)
- 查看日志文件
- 使用
sudo systemctl status frps查看服务状态
七、总结
FRP 是一款功能强大且配置灵活的内网穿透工具,通过本文,你应该已经掌握了:
- FRP 的基本概念和应用场景
- FRP 的工作原理
- 服务端和客户端的完整配置方法
- 常见的安全加固措施
相比商业内网穿透工具,FRP 提供了更高的可控性和灵活性,而且完全开源免费。希望这篇文章能帮助你更好地理解和使用 FRP。
如果你在使用过程中遇到任何问题,欢迎在评论区留言交流!
参考链接:
- FRP 官方 GitHub:https://github.com/fatedier/frp
- FRP 官方文档:https://gofrp.org/zh-cn/docs/