一、概述

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 进程 排查顺序:

  1. 确认云服务器安全组已放行对应端口
  2. 确认服务器系统防火墙已放行对应端口
  3. 确认 frps 进程正常运行且正在监听该端口
  4. 确认 frpc 对应代理已启动成功

7.2 no route found / FRP 内置 404 页面

核心原因:请求已到达 frps 的 vhost 端口,但找不到对应域名的转发规则 排查顺序:

  1. 确认 frpc 中对应 HTTP 代理已启动成功
  2. 确认代理类型为 http,而非 tcp
  3. 确认 custom_domains 与浏览器地址栏域名完全一致
  4. 确认子域名 DNS 解析正确指向公网服务器 IP

7.3 start error: port unavailable

核心原因:frpc 无法连接到配置的内网服务端口 排查顺序:

  1. 在 frpc 所在机器上直接访问内网 IP:端口,确认服务正常
  2. 确认内网防火墙未拦截 frpc 机器的访问
  3. 确认 frpc 与目标服务在同一网段,路由可达

7.4 login to server failed: i/o timeout

核心原因:frpc 无法连接到 frps 的控制隧道 排查顺序:

  1. 确认公网服务器 IP 正确
  2. 确认 bind_port(默认 7000)已在安全组和防火墙放行
  3. 确认两端 token 完全一致
  4. 确认客户端网络可正常访问公网

八、方案对比:FRP 穿透 vs 公网 IP 端口转发

维度 FRP 内网穿透 公网 IP + 路由器端口转发
公网 IP 要求 不需要,仅服务端需要公网 IP 必须有独立公网 IP
速度 受服务端带宽限制,有中转损耗 直连,速度最快延迟最低
端口占用 Web 服务可共用端口,节省端口 每个服务独占一个外部端口
安全性 不暴露内网真实出口 IP 暴露家庭公网 IP
配置复杂度 需部署服务端和客户端 仅路由器配置端口转发
适用场景 无公网 IP、多服务共用端口、隐藏源地址 有独立公网 IP,追求极致速度

九、最佳实践与扩展

9.1 配置规范

  • 代理命名采用「服务名-类型」格式,便于排查
  • 所有服务优先使用 HTTP 虚拟主机,减少公网端口占用
  • 核心控制端口建议修改为非默认值,降低扫描风险
  • token 设置为复杂字符串,防止未授权接入

9.2 扩展能力

  • 支持带宽限制,可对单个代理设置最大带宽
  • 支持健康检查,配合负载均衡实现高可用
  • 支持加密与压缩传输,提升安全性和传输效率
  • 支持插件体系,可扩展静态文件、HTTPS 转 HTTP 等功能

9.3 运维建议

  • 客户端配置开机自启,保证断网重启后自动恢复
  • 定期查看日志,排查异常重连和代理启动失败
  • 保留备用访问路径,避免单链路故障