2442 字
FRP 内网穿透完整指南
2026-06-06

前言#

在日常生活中,你是否遇到过这样的困扰:

  • 在家搭建了一个 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 │
│ │ │ │
│ │ 端口 │◄──────── 数据转发 ─────────────────── 内网服务 │
│ │ 映射 │ │
│ └─────────┘ │
└─────────────────────────────────────────────────────────────┘
  1. 内网主动出站:frpc 启动后,主动连接 frps 的监听端口(默认 7000),建立持久 TCP 长连接

  2. 服务注册:frpc 告知 frps:“我能代理本地 127.0.0.1:8080 的 HTTP 服务”

  3. 外网请求到达:用户访问 http://公网IP:端口http://域名,DNS 解析到 frps 服务器

  4. 智能路由:frps 根据端口号或 HTTP Host 头,找到对应的 frpc

  5. 数据透传:frps 通过已有连接通知 frpc,双方建立数据通道,后续流量双向转发

3.3 支持的代理类型#

FRP 支持多种代理类型,适应不同的使用场景:

代理类型用途特点
TCP通用端口映射适用于 SSH、RDP、游戏服务器等
UDPUDP 端口映射适用于 DNS、视频流等
HTTP/HTTPSWeb 服务支持域名虚拟主机、自动 Host 头处理
STCP/SUDP安全内网代理无公网端口暴露,需双方部署 frpc
XTCPP2P 直连打洞成功后可绕过服务器,节省带宽

四、FRP 搭建实战#

4.1 准备工作#

在开始之前,你需要准备:

  • 一台 Linux 公网服务器(推荐 Ubuntu/CentOS,最低 1核1G)
  • 一台 内网设备(Windows/Linux/macOS/树莓派)
  • 一个域名(可选,但 HTTP/HTTPS 模式必需)

4.2 下载 FRP#

从 GitHub Release 页面下载最新版的二进制文件:

Terminal window
# 下载(根据你的系统架构选择版本)
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.gz
cd frp_0.62.0_linux_amd64

解压后你会看到以下文件:

.
├── frpc # 客户端程序
├── frpc.toml # 客户端配置
├── frps # 服务端程序
├── frps.toml # 服务端配置
└── LICENSE

服务端和客户端使用同一份程序,只是配置文件不同。我们将它们分开:

Terminal window
# 创建目录分别存放
mkdir -p /opt/frp/server # 服务端
mkdir -p /opt/frp/client # 客户端
# 服务端保留 frps 和 frps.toml
mv frps frps.toml /opt/frp/server/
# 客户端保留 frpc 和 frpc.toml
mv 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 = 7500
webServer.user = "admin"
webServer.password = "your_dashboard_password"
# 日志配置
log.to = "/var/log/frp/frps.log"
log.level = "info"
log.maxDays = 7
# 开启 Prometheus 监控指标(可选)
enablePrometheus = true

注意:记得在云服务器的安全组中开放 700075008080 等端口。

启动服务端:

Terminal window
# 前台运行(测试用)
./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 = /opt/frp/server/frps -c /opt/frp/server/frps.toml
Restart = always
RestartSec = 5
[Install]
WantedBy = multi-user.target
Terminal window
sudo systemctl daemon-reload
sudo systemctl enable frps
sudo systemctl start frps
sudo 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 = 22
remotePort = 6000
# ==== HTTP 代理示例 ====
# 将本地 8080 端口的 Web 服务映射到服务器
[[proxies]]
name = "web"
type = "http"
localIP = "127.0.0.1"
localPort = 8080
customDomains = ["your-domain.com"]

启动客户端:

Terminal window
# 前台运行
./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 = 8080
customDomains = ["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 必做安全措施#

  1. 使用强 Token:不要使用简单的密码,使用随机生成的强密码
  2. 限制 Dashboard 访问:使用防火墙规则限制只有特定 IP 可以访问 7500 端口
  3. 启用 TLS 加密:在 [common] 中添加 transport.tls.tlsCertFiletransport.tls.tlsKeyFile
  4. 避免使用 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: 如何查看连接状态?#

七、总结#

FRP 是一款功能强大且配置灵活的内网穿透工具,通过本文,你应该已经掌握了:

  • FRP 的基本概念和应用场景
  • FRP 的工作原理
  • 服务端和客户端的完整配置方法
  • 常见的安全加固措施

相比商业内网穿透工具,FRP 提供了更高的可控性和灵活性,而且完全开源免费。希望这篇文章能帮助你更好地理解和使用 FRP。

如果你在使用过程中遇到任何问题,欢迎在评论区留言交流!


参考链接

发布于
2026-06-06
许可协议
CC BY-NC-SA 4.0