一、概述
1.1 什么是 FRP
FRP 是一款开源的反向代理工具,专注于内网穿透场景,可将位于 NAT / 防火墙后的内网服务暴露到公网,支持 TCP、UDP、HTTP、HTTPS 等多种协议。
1.2 核心适用场景
- 内网无公网 IP,需要外网访问内网服务
- 多 Web 服务共用公网端口,通过域名区分
- 非 HTTP 类 TCP / UDP 服务的公网暴露
- 隐藏内网服务真实公网地址,提升安全性
二、核心架构与原理
2.1 组件构成
- frps(服务端):部署在具有公网 IP 的服务器上,负责监听公网请求,通过隧道转发给内网客户端
- frpc(客户端):部署在内网环境中,主动向外连接 frps,建立持久化隧道,接收转发流量并传递给内网服务
2.2 流量流向(以 TCP 代理为例)
公网用户 → 公网服务器端口 → frps → 加密隧道 → frpc → 内网目标服务
三、部署前准备
3.1 环境要求
- 服务端:具有公网 IP 的服务器(Windows / Linux 均可)
- 客户端:内网任意可访问目标服务的主机(Windows / Linux / 嵌入式设备均可)
- 网络:客户端可正常访问公网,服务端可开放指定端口
3.2 端口规划建议
| 端口 | 作用 | 说明 |
|---|---|---|
| 7000 | 控制隧道端口 | frpc 与 frps 通信的核心端口,必须放行 |
| 8080 | HTTP 虚拟主机端口 | 所有 HTTP 类服务共用,靠域名区分 |
| 8443 | HTTPS 虚拟主机端口 | 所有 HTTPS 类服务共用,靠域名区分 |
| 自定义 | TCP 业务端口 | 每个非 HTTP 业务独占一个公网端口 |
四、服务端(frps)配置
4.1 基础最小配置
[common]
bind_addr = 0.0.0.0
bind_port = 7000
vhost_http_port = 8080
vhost_https_port = 8443
token = 自定义认证密钥
tcp_mux = true
4.2 核心参数说明
bind_addr:服务端监听地址,0.0.0.0表示监听所有网卡bind_port:控制隧道端口,客户端连接服务端使用vhost_http_port:HTTP 虚拟主机端口,所有 HTTP 代理共用vhost_https_port:HTTPS 虚拟主机端口,所有 HTTPS 代理共用token:客户端认证密钥,两端必须完全一致tcp_mux:TCP 多路复用,开启后提升连接效率
4.3 启动方式
# Linux
./frps -c frps.ini
# Windows
frps.exe -c frps.ini
五、客户端(frpc)配置
5.1 基础公共配置
[common]
server_addr = 公网服务器IP
server_port = 7000
token = 与服务端一致的密钥
log_file = ./frpc.log
log_level = info
5.2 TCP 纯端口转发代理
适用于非 HTTP 类服务,如 SSH、数据库、游戏服务、管理后台等。
[服务名称-tcp]
type = tcp
local_ip = 内网服务IP
local_port = 内网服务端口
remote_port = 公网暴露端口
- 特点:每个服务独占一个公网端口,协议透明,转发损耗最低
- 注意:每个
remote_port都需要在服务端安全组和防火墙放行
5.3 HTTP 虚拟主机代理
适用于 Web 类服务,多个服务可共用同一个公网端口,通过域名区分。
[服务名称-http]
type = http
local_ip = 内网服务IP
local_port = 内网服务端口
custom_domains = 子域名.主域名.com
- 特点:多个 Web 服务共用 8080 端口,新增服务无需新开公网端口
- 前提:所有子域名都解析到公网服务器 IP
5.4 HTTPS 虚拟主机代理
适用于 HTTPS 加密的 Web 服务,共用 8443 端口。
[服务名称-https]
type = https
local_ip = 内网服务IP
local_port = 内网HTTPS端口
custom_domains = 子域名.主域名.com
5.5 客户端启动方式
# Linux
./frpc -c frpc.ini
# Windows
frpc.exe -c frpc.ini
六、配套环境配置
6.1 云服务器安全组
所有 frps 使用的公网端口,都需要在云服务器控制台的安全组中添加入站放行规则:
- 协议:TCP
- 端口范围:对应端口号
- 授权对象:
0.0.0.0/0(按需可限制访问源)
6.2 服务器系统防火墙
服务端操作系统的防火墙也需要放行对应 TCP 端口的入站规则:
- Windows:高级安全 Windows 防火墙 → 入站规则 → 新建规则
- Linux:iptables / firewalld 放行对应端口
七、常见故障排查
7.1 ERR_CONNECTION_TIMED_OUT(连接超时)
核心原因:流量未到达 frps 进程 排查顺序:
- 确认云服务器安全组已放行对应端口
- 确认服务器系统防火墙已放行对应端口
- 确认 frps 进程正常运行且正在监听该端口
- 确认 frpc 对应代理已启动成功
7.2 no route found / FRP 内置 404 页面
核心原因:请求已到达 frps 的 vhost 端口,但找不到对应域名的转发规则 排查顺序:
- 确认 frpc 中对应 HTTP 代理已启动成功
- 确认代理类型为
http,而非tcp - 确认
custom_domains与浏览器地址栏域名完全一致 - 确认子域名 DNS 解析正确指向公网服务器 IP
7.3 start error: port unavailable
核心原因:frpc 无法连接到配置的内网服务端口 排查顺序:
- 在 frpc 所在机器上直接访问内网 IP:端口,确认服务正常
- 确认内网防火墙未拦截 frpc 机器的访问
- 确认 frpc 与目标服务在同一网段,路由可达
7.4 login to server failed: i/o timeout
核心原因:frpc 无法连接到 frps 的控制隧道 排查顺序:
- 确认公网服务器 IP 正确
- 确认
bind_port(默认 7000)已在安全组和防火墙放行 - 确认两端 token 完全一致
- 确认客户端网络可正常访问公网
八、方案对比:FRP 穿透 vs 公网 IP 端口转发
| 维度 | FRP 内网穿透 | 公网 IP + 路由器端口转发 |
|---|---|---|
| 公网 IP 要求 | 不需要,仅服务端需要公网 IP | 必须有独立公网 IP |
| 速度 | 受服务端带宽限制,有中转损耗 | 直连,速度最快延迟最低 |
| 端口占用 | Web 服务可共用端口,节省端口 | 每个服务独占一个外部端口 |
| 安全性 | 不暴露内网真实出口 IP | 暴露家庭公网 IP |
| 配置复杂度 | 需部署服务端和客户端 | 仅路由器配置端口转发 |
| 适用场景 | 无公网 IP、多服务共用端口、隐藏源地址 | 有独立公网 IP,追求极致速度 |
九、最佳实践与扩展
9.1 配置规范
- 代理命名采用「服务名-类型」格式,便于排查
- 所有服务优先使用 HTTP 虚拟主机,减少公网端口占用
- 核心控制端口建议修改为非默认值,降低扫描风险
- token 设置为复杂字符串,防止未授权接入
9.2 扩展能力
- 支持带宽限制,可对单个代理设置最大带宽
- 支持健康检查,配合负载均衡实现高可用
- 支持加密与压缩传输,提升安全性和传输效率
- 支持插件体系,可扩展静态文件、HTTPS 转 HTTP 等功能
9.3 运维建议
- 客户端配置开机自启,保证断网重启后自动恢复
- 定期查看日志,排查异常重连和代理启动失败
- 保留备用访问路径,避免单链路故障