frp内网穿透使用教程
frp(Fast Reverse Proxy)是一个专注于内网穿透的高性能反向代理应用,支持 TCP、UDP、HTTP、HTTPS、STCP、SUDP、XTCP、TCPMUX 等多种协议类型,可以将内网服务以安全、便捷的方式通过具有公网 IP 的节点中转暴露到公网。
本教程基于 frp 最新版本(v0.69.0+),配置文件使用 TOML 格式。
目录
- 一、frp 简介
- 二、架构原理
- 三、安装部署
- 四、服务端配置(frps)
- 五、客户端配置(frpc)
- 六、TCP 代理
- 七、UDP 代理
- 八、HTTP 代理
- 九、HTTPS 代理
- 十、STCP 代理(安全 TCP)
- 十一、SUDP 代理(安全 UDP)
- 十二、XTCP 代理(P2P 穿透)
- 十三、TCPMUX 代理(端口复用)
- 十四、HTTP 转 HTTPS(https2http 插件)
- 十五、静态文件服务(static_file 插件)
- 十六、Unix Domain Socket 转发
- 十七、系统服务配置
- 十八、Dashboard 监控面板
- 十九、安全加固
- 二十、常见问题
一、frp 简介
frp 是一个开源的内网穿透工具,主要由两部分组成:
| 组件 | 名称 | 部署位置 | 作用 |
|---|---|---|---|
| frps | 服务端 | 有公网 IP 的服务器 | 接收公网请求,转发到内网 |
| frpc | 客户端 | 内网机器 | 将内网服务注册到 frps |
支持的代理类型
| 类型 | 说明 | 典型场景 |
|---|---|---|
| tcp | TCP 端口映射 | SSH、远程桌面、数据库 |
| udp | UDP 端口映射 | DNS 查询、游戏服务器 |
| http | HTTP 虚拟主机 | Web 服务(多域名复用端口) |
| https | HTTPS 虚拟主机 | HTTPS Web 服务 |
| stcp | 安全 TCP | 需要鉴权的 TCP 服务 |
| sudp | 安全 UDP | 需要鉴权的 UDP 服务 |
| xtcp | P2P 穿透 | 大文件传输、低延迟场景 |
| tcpmux | 端口复用 | 多服务共享同一端口 |
二、架构原理
┌──────────────┐ ┌──────────────────┐ ┌──────────────┐
│ 公网用户 │─────▶│ frps (公网IP) │◀────▶│ frpc (内网) │
│ 访问服务 │ │ 监听公网端口 │ │ 本地服务映射 │
└──────────────┘ └──────────────────┘ └──────────────┘
│
┌────────▼─────────┐
│ 内网服务 │
│ (SSH/Web/DB...) │
└──────────────────┘
工作流程:
- frpc 启动后连接 frps,注册代理规则
- 公网用户访问 frps 的端口
- frps 将请求通过隧道转发给 frpc
- frpc 将请求转给本地内网服务
- 响应沿原路返回
三、安装部署
3.1 下载
前往 GitHub Releases 页面下载对应平台版本:
https://github.com/fatedier/frp/releases
# Linux amd64(最常见)
wget https://github.com/fatedier/frp/releases/download/v0.69.0/frp_0.69.0_linux_amd64.tar.gz
# Linux arm64(如树莓派)
wget https://github.com/fatedier/frp/releases/download/v0.69.0/frp_0.69.0_linux_arm64.tar.gz
# 解压
tar -zxvf frp_0.69.0_linux_amd64.tar.gz
cd frp_0.69.0_linux_amd64
3.2 目录结构
frp_0.69.0_linux_amd64/
├── frps # 服务端二进制
├── frps.toml # 服务端配置文件
├── frpc # 客户端二进制
├── frpc.toml # 客户端配置文件
├── LICENSE
└── systemd/
├── frps.service # 服务端 systemd 配置
└── frpc.service # 客户端 systemd 配置
3.3 Windows 下载
下载 frp_0.69.0_windows_amd64.zip
解压后得到 frps.exe 和 frpc.exe
四、服务端配置(frps)
4.1 基础配置 frps.toml
# frps.toml - 服务端配置
# 绑定端口,frpc 通过此端口连接 frps
bindPort = 7000
# 认证 token,frpc 必须使用相同的 token 才能连接
auth.token = "your_secure_token_here_请修改"
# Dashboard 监控面板(可选)
webServer.addr = "0.0.0.0"
webServer.port = 7500
webServer.user = "admin"
webServer.password = "admin_password_请修改"
# HTTP 虚拟主机端口(用于 http/https 类型代理)
vhostHTTPPort = 80
vhostHTTPSPort = 443
# TCPMUX 端口复用端口(可选)
tcpmuxHTTPConnectPort = 1337
# 允许的端口范围(frpc 映射的远程端口必须在此范围内)
allowPorts = [
{ start = 6000, end = 7000 },
{ start = 8000, end = 9000 }
]
# 每个代理最大连接数(可选,默认无限制)
maxPortsPerClient = 5
# 日志配置
log.to = "/var/log/frps.log"
log.level = "info"
log.maxDays = 7
4.2 启动 frps
# 前台运行(调试用)
./frps -c frps.toml
# 后台运行
nohup ./frps -c frps.toml > /dev/null 2>&1 &
启动成功输出:
[frps/root.go:105] frps uses config file: frps.toml
[server/service.go:237] frps tcp listen on 0.0.0.0:7000
[server/service.go:305] http service listen on 0.0.0.0:80
[server/service.go:351] dashboard listen on 0.0.0.0:7500
五、客户端配置(frpc)
5.1 基础配置 frpc.toml
# frpc.toml - 客户端配置
# frps 服务器地址
serverAddr = "你的服务器公网IP"
# frps 端口
serverPort = 7000
# 认证 token(必须与 frps 一致)
auth.token = "your_secure_token_here_请修改"
# 日志配置
log.to = "/var/log/frpc.log"
log.level = "info"
log.maxDays = 3
# 管理面板(可选)
webServer.addr = "127.0.0.1"
webServer.port = 7400
webServer.user = "admin"
webServer.password = "admin"
5.2 启动 frpc
# Linux
./frpc -c frpc.toml
# Windows
frpc.exe -c frpc.toml
六、TCP 代理
最常用的代理类型,适用于 SSH、远程桌面、数据库等 TCP 服务。
6.1 SSH 远程连接
场景: 在家访问公司内网的 SSH 服务
# frpc.toml
serverAddr = "x.x.x.x"
serverPort = 7000
auth.token = "your_token"
# SSH 代理
[[proxies]]
name = "ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 6000
使用方式:
# 通过 frps 的 6000 端口 SSH 到内网机器
ssh -p 6000 user@x.x.x.x
6.2 Windows 远程桌面(RDP)
# frpc.toml - Windows 端
serverAddr = "x.x.x.x"
serverPort = 7000
auth.token = "your_token"
# Windows 远程桌面
[[proxies]]
name = "rdp"
type = "tcp"
localIP = "127.0.0.1"
localPort = 3389
remotePort = 7001
使用方式:
打开 Windows 远程桌面连接
计算机:x.x.x.x:7001
6.3 数据库连接(MySQL)
# frpc.toml
serverAddr = "x.x.x.x"
serverPort = 7000
auth.token = "your_token"
# MySQL 数据库
[[proxies]]
name = "mysql"
type = "tcp"
localIP = "127.0.0.1"
localPort = 3306
remotePort = 6001
使用方式:
mysql -h x.x.x.x -P 6001 -u root -p
6.4 多个 TCP 服务
# frpc.toml
serverAddr = "x.x.x.x"
serverPort = 7000
auth.token = "your_token"
# SSH
[[proxies]]
name = "ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 6000
# Web 服务
[[proxies]]
name = "web"
type = "tcp"
localIP = "127.0.0.1"
localPort = 8080
remotePort = 8080
# Redis
[[proxies]]
name = "redis"
type = "tcp"
localIP = "127.0.0.1"
localPort = 6379
remotePort = 6379
七、UDP 代理
适用于 DNS 查询、游戏服务器等 UDP 服务。
7.1 DNS 查询转发
# frpc.toml
serverAddr = "x.x.x.x"
serverPort = 7000
auth.token = "your_token"
# DNS 查询转发
[[proxies]]
name = "dns"
type = "udp"
localIP = "127.0.0.1"
localPort = 53
remotePort = 6000
使用方式:
# 通过 frps 服务器转发 DNS 查询
dig @x.x.x.x -p 6000 example.com
7.2 游戏服务器
# frpc.toml
serverAddr = "x.x.x.x"
serverPort = 7000
auth.token = "your_token"
# Minecraft 游戏服务器
[[proxies]]
name = "minecraft"
type = "udp"
localIP = "127.0.0.1"
localPort = 19132
remotePort = 19132
八、HTTP 代理
HTTP 类型代理支持基于域名的虚拟主机,多个服务共享同一个端口(80),通过域名区分。
8.1 基础 HTTP 代理
前提条件: 需要有域名并解析到 frps 服务器 IP
frps.toml 配置:
bindPort = 7000
vhostHTTPPort = 80
auth.token = "your_token"
frpc.toml 配置:
# frpc.toml
serverAddr = "x.x.x.x"
serverPort = 7000
auth.token = "your_token"
# 本地 Web 服务通过域名访问
[[proxies]]
name = "web"
type = "http"
localIP = "127.0.0.1"
localPort = 8080
customDomains = ["web.example.com"]
使用方式:
浏览器访问 http://web.example.com
8.2 多个 HTTP 服务共享端口
# frpc.toml
serverAddr = "x.x.x.x"
serverPort = 7000
auth.token = "your_token"
# 博客服务
[[proxies]]
name = "blog"
type = "http"
localIP = "127.0.0.1"
localPort = 3000
customDomains = ["blog.example.com"]
# API 服务
[[proxies]]
name = "api"
type = "http"
localIP = "127.0.0.1"
localPort = 9000
customDomains = ["api.example.com"]
# 管理后台
[[proxies]]
name = "admin"
type = "http"
localIP = "127.0.0.1"
localPort = 8080
customDomains = ["admin.example.com"]
以上三个服务都通过 frps 的 80 端口访问,frps 根据请求的 Host 头自动路由到对应的内网服务。
8.3 HTTP 代理高级选项
# frpc.toml
serverAddr = "x.x.x.x"
serverPort = 7000
auth.token = "your_token"
[[proxies]]
name = "web"
type = "http"
localIP = "127.0.0.1"
localPort = 8080
customDomains = ["web.example.com"]
# 重写 Host 头
hostHeaderRewrite = "127.0.0.1"
# 自定义请求头
requestHeaders.set.x-forwarded-for = "real-client-ip"
# HTTP 基本认证
httpUser = "username"
httpPassword = "password"
# 路由规则:按 HTTP User 路由
# routeByHTTPUser = true
8.4 路由规则(routeByHTTPUser)
# frpc.toml - 按用户路由
serverAddr = "x.x.x.x"
serverPort = 7000
auth.token = "your_token"
[[proxies]]
name = "user_a_web"
type = "http"
localIP = "127.0.0.1"
localPort = 8080
customDomains = ["web.example.com"]
routeByHTTPUser = true
httpUser = "userA"
httpPassword = "passA"
[[proxies]]
name = "user_b_web"
type = "http"
localIP = "127.0.0.1"
localPort = 8081
customDomains = ["web.example.com"]
routeByHTTPUser = true
httpUser = "userB"
httpPassword = "passB"
九、HTTPS 代理
9.1 本地 HTTPS 服务直接代理
如果内网服务本身就是 HTTPS(有证书),可以直接用 https 类型:
# frpc.toml
serverAddr = "x.x.x.x"
serverPort = 7000
auth.token = "your_token"
[[proxies]]
name = "secure_web"
type = "https"
localIP = "127.0.0.1"
localPort = 443
customDomains = ["secure.example.com"]
9.2 本地 HTTP 服务通过 HTTPS 暴露(https2http 插件)
场景: 内网只有 HTTP 服务,但想通过 HTTPS 对外提供访问,证书放在 frps 服务器上。
frps.toml:
bindPort = 7000
vhostHTTPPort = 80
vhostHTTPSPort = 443
auth.token = "your_token"
frpc.toml:
# frpc.toml
serverAddr = "x.x.x.x"
serverPort = 7000
auth.token = "your_token"
[[proxies]]
name = "https_web"
type = "https"
customDomains = ["secure.example.com"
[proxies.plugin]
type = "https2http"
localAddr = "127.0.0.1:8080"
# HTTPS 证书配置(证书放在 frps 服务器上)
crtPath = "/path/to/cert.pem"
keyPath = "/path/to/key.pem"
9.3 本地 HTTP 服务通过 HTTPS 暴露(https2https 插件)
场景: 内网服务是 HTTPS,但使用自签名证书;想在 frps 上放正规证书对外提供。
# frpc.toml
serverAddr = "x.x.x.x"
serverPort = 7000
auth.token = "your_token"
[[proxies]]
name = "https_web"
type = "https"
customDomains = ["secure.example.com"
[proxies.plugin]
type = "https2https"
localAddr = "127.0.0.1:443"
# frps 服务器上的证书
crtPath = "/path/to/cert.pem"
keyPath = "/path/to/key.pem"
十、STCP 代理(安全 TCP)
STCP(Secret TCP)提供安全的 TCP 代理,不在公网暴露端口。访问者也需要部署 frpc 并提供相同的 secretKey 才能连接。
适用场景: SSH 等敏感服务,不希望任何人在公网直接访问。
10.1 架构说明
┌──────────────┐ ┌──────────────────┐ ┌──────────────┐
│ 访问者 frpc │◀────▶│ frps (公网IP) │◀────▶│ 服务端 frpc │
│ (本地监听) │ │ 不暴露公网端口 │ │ (内网服务) │
└──────────────┘ └──────────────────┘ └──────────────┘
10.2 完整示例:安全的 SSH 访问
内网机器 frpc.toml(服务端):
# 内网机器 A - 提供 SSH 服务
serverAddr = "x.x.x.x"
serverPort = 7000
auth.token = "your_token"
[[proxies]]
name = "secret_ssh"
type = "stcp"
# 密钥,访问者必须提供相同的密钥
secretKey = "my_secret_key_abc123"
localIP = "127.0.0.1"
localPort = 22
访问者机器 frpc.toml(客户端):
# 访问者机器 B - 要 SSH 到内网机器 A
serverAddr = "x.x.x.x"
serverPort = 7000
auth.token = "your_token"
[[visitors]]
name = "secret_ssh_visitor"
type = "stcp"
# 要访问的 STCP 代理名称
serverName = "secret_ssh"
# 密钥(必须与服务端一致)
secretKey = "my_secret_key_abc123"
# 本地监听地址和端口
bindAddr = "127.0.0.1"
bindPort = 6000
使用方式:
# 在访问者机器上执行
ssh -p 6000 user@127.0.0.1
注意:frps 服务器上不会开放任何端口供外部访问,只有拥有 secretKey 的 frpc 访问者才能连接。
十一、SUDP 代理(安全 UDP)
SUDP 与 STCP 类似,是安全版本的 UDP 代理,不在公网暴露端口。
11.1 完整示例:安全的 DNS 访问
内网机器 frpc.toml(服务端):
# 内网机器 A - 提供 DNS 服务
serverAddr = "x.x.x.x"
serverPort = 7000
auth.token = "your_token"
[[proxies]]
name = "secret_dns"
type = "sudp"
secretKey = "my_secret_key_abc123"
localIP = "127.0.0.1"
localPort = 53
访问者机器 frpc.toml(客户端):
# 访问者机器 B
serverAddr = "x.x.x.x"
serverPort = 7000
auth.token = "your_token"
[[visitors]]
name = "secret_dns_visitor"
type = "sudp"
serverName = "secret_dns"
secretKey = "my_secret_key_abc123"
bindAddr = "127.0.0.1"
bindPort = 6053
使用方式:
dig @127.0.0.1 -p 6053 example.com
十二、XTCP 代理(P2P 穿透)
XTCP 使用 P2P 打洞技术,如果打洞成功,流量直接在两端传输,不经过 frps 中转,不受服务器带宽限制。
注意: 打洞成功率取决于 NAT 类型,不保证一定成功。如果需要稳定连接,建议使用 STCP。
12.1 完整示例:P2P SSH 访问
内网机器 frpc.toml(服务端):
# 内网机器 A
serverAddr = "x.x.x.x"
serverPort = 7000
auth.token = "your_token"
[[proxies]]
name = "p2p_ssh"
type = "xtcp"
secretKey = "abcdefg"
localIP = "127.0.0.1"
localPort = 22
访问者机器 frpc.toml(客户端):
# 访问者机器 B
serverAddr = "x.x.x.x"
serverPort = 7000
auth.token = "your_token"
[[visitors]]
name = "p2p_ssh_visitor"
type = "xtcp"
serverName = "p2p_ssh"
secretKey = "abcdefg"
bindAddr = "127.0.0.1"
bindPort = 6000
# 自动保持隧道开启
keepTunnelOpen = true
使用方式:
ssh -p 6000 user@127.0.0.1
12.2 XTCP 回退到 STCP
如果 P2P 打洞失败,可以自动回退到 STCP 中转模式:
# frpc.toml - 访问者配置
serverAddr = "x.x.x.x"
serverPort = 7000
auth.token = "your_token"
# STCP 回退配置(不需要监听物理端口)
[[visitors]]
name = "stcp_ssh_visitor"
type = "stcp"
serverName = "stcp_ssh"
secretKey = "abcdefg"
bindPort = -1
# XTCP 主配置
[[visitors]]
name = "xtcp_ssh_visitor"
type = "xtcp"
serverName = "xtcp_ssh"
secretKey = "abcdefg"
bindAddr = "127.0.0.1"
bindPort = 6000
# 打洞失败 200ms 后回退到 STCP
fallbackTo = "stcp_ssh_visitor"
fallbackTimeoutMs = 200
12.3 自定义 STUN 服务器
# frpc.toml
serverAddr = "x.x.x.x"
serverPort = 7000
auth.token = "your_token"
# 默认 STUN 服务器不可用时,可自定义
natHoleStunServer = "stun.miwifi.com:3478"
[[proxies]]
name = "p2p_ssh"
type = "xtcp"
secretKey = "abcdefg"
localIP = "127.0.0.1"
localPort = 22
十三、TCPMUX 代理(端口复用)
TCPMUX 允许多个 TCP 服务共享同一个端口,通过 HTTP CONNECT 请求的 Host 区分。
13.1 配置示例
frps.toml:
bindPort = 7000
tcpmuxHTTPConnectPort = 1337
auth.token = "your_token"
frpc.toml:
# frpc.toml
serverAddr = "x.x.x.x"
serverPort = 7000
auth.token = "your_token"
# 多个 SSH 服务共享同一端口
[[proxies]]
name = "ssh_machine_1"
type = "tcpmux"
multiplexer = "httpconnect"
customDomains = ["machine1"]
localIP = "127.0.0.1"
localPort = 22
[[proxies]]
name = "ssh_machine_2"
type = "tcpmux"
multiplexer = "httpconnect"
customDomains = ["machine2"]
localIP = "127.0.0.1"
localPort = 2222
使用方式(需配合支持 HTTP CONNECT 代理的客户端):
# 通过 ProxyCommand 使用
ssh -o ProxyCommand="nc -X connect -x x.x.x.x:1337 %h %p" machine1
# 或者用 cURL
curl --proxy http://x.x.x.x:1337 http://machine1/
十四、HTTP 转 HTTPS(https2http 插件)
将内网的 HTTP 服务转换为 HTTPS 对外提供,SSL 证书放在 frps 服务器上。
# frpc.toml
serverAddr = "x.x.x.x"
serverPort = 7000
auth.token = "your_token"
[[proxies]]
name = "https_blog"
type = "https"
customDomains = ["blog.example.com"]
[proxies.plugin]
type = "https2http"
localAddr = "127.0.0.1:80"
crtPath = "/etc/ssl/certs/blog.pem"
keyPath = "/etc/ssl/private/blog.key"
十五、静态文件服务(static_file 插件)
frpc 内置静态文件服务插件,无需额外部署 Web 服务器。
# frpc.toml
serverAddr = "x.x.x.x"
serverPort = 7000
auth.token = "your_token"
[[proxies]]
name = "file_server"
type = "tcp"
remotePort = 9000
[proxies.plugin]
type = "static_file"
localPath = "/home/user/files"
stripPrefix = "files"
httpUser = "admin"
httpPassword = "password"
使用方式:
http://x.x.x.x:9000/files/readme.txt
十六、Unix Domain Socket 转发
将内网的 Unix Domain Socket 服务通过 TCP 端口暴露。
场景: 远程访问 Docker Daemon
# frpc.toml
serverAddr = "x.x.x.x"
serverPort = 7000
auth.token = "your_token"
[[proxies]]
name = "docker_daemon"
type = "tcp"
localIP = "127.0.0.1"
localPort = 2375
remotePort = 2375
[proxies.plugin]
type = "unix_domain_socket"
unixPath = "/var/run/docker.sock"
使用方式:
# 远程管理 Docker
DOCKER_HOST=tcp://x.x.x.x:2375 docker ps
十七、系统服务配置
17.1 Linux systemd 服务(frps)
创建 /etc/systemd/system/frps.service:
[Unit]
Description=frps service
After=network.target syslog.target
Wants=network.target
[Service]
Type=simple
Restart=on-failure
RestartSec=5s
ExecStart=/usr/local/frp/frps -c /usr/local/frp/frps.toml
LimitNOFILE=1048576
[Install]
WantedBy=multi-user.target
# 启动
systemctl start frps
# 开机自启
systemctl enable frps
# 查看状态
systemctl status frps
# 停止
systemctl stop frps
# 重启
systemctl restart frps
17.2 Linux systemd 服务(frpc)
创建 /etc/systemd/system/frpc.service:
[Unit]
Description=frpc service
After=network.target syslog.target
Wants=network.target
[Service]
Type=simple
Restart=on-failure
RestartSec=5s
ExecStart=/usr/local/frp/frpc -c /usr/local/frp/frpc.toml
LimitNOFILE=1048576
[Install]
WantedBy=multi-user.target
systemctl start frpc
systemctl enable frpc
systemctl status frpc
17.3 Windows 服务
Windows 下推荐使用 NSSM 或 WinSW 将 frpc 注册为系统服务:
# 使用 NSSM
nssm install frpc "C:\frp\frpc.exe" "-c" "C:\frp\frpc.toml"
nssm start frpc
# 设置开机自启
nssm set frpc Start SERVICE_AUTO_START
十八、Dashboard 监控面板
18.1 frps 服务端 Dashboard
frps.toml:
webServer.addr = "0.0.0.0"
webServer.port = 7500
webServer.user = "admin"
webServer.password = "your_dashboard_password"
访问:http://服务器IP:7500
可查看:
- 当前在线的 frpc 客户端
- 所有代理状态
- 流量统计
- 连接数统计
18.2 frpc 客户端管理面板
frpc.toml:
webServer.addr = "127.0.0.1"
webServer.port = 7400
webServer.user = "admin"
webServer.password = "your_password"
访问:http://127.0.0.1:7400
可查看:
- 当前代理列表
- 连接状态
- 动态加载/更新配置
十九、安全加固
19.1 使用强 Token
# 生成随机 token
# openssl rand -hex 32
auth.token = "a1b2c3d4e5f6...使用32位以上的随机字符串"
19.2 限制端口范围
# frps.toml
allowPorts = [
{ start = 6000, end = 6100 }
]
19.3 使用 STCP 替代 TCP
对于 SSH 等敏感服务,使用 STCP 而非 TCP,避免在公网暴露端口:
# 不安全 - 任何人都能扫描到 6000 端口
[[proxies]]
name = "ssh"
type = "tcp"
localPort = 22
remotePort = 6000
# 安全 - 公网不暴露端口,需要密钥才能访问
[[proxies]]
name = "ssh"
type = "stcp"
secretKey = "your_secret_key"
localIP = "127.0.0.1"
localPort = 22
19.4 启用 TLS 加密
# frpc.toml
transport.tls.enable = true
# frps.toml
transport.tls.force = true # 强制所有客户端使用 TLS
19.5 防火墙配置
# 仅开放必要端口
# frps 通信端口
ufw allow 7000/tcp
# Dashboard(建议仅允许特定 IP)
ufw allow from YOUR_IP to any port 7500
# HTTP/HTTPS 虚拟主机端口
ufw allow 80/tcp
ufw allow 443/tcp
# TCP 代理端口范围
ufw allow 6000:6100/tcp
19.6 端口白名单(allowUsers)
# frps.toml - 限制可使用的用户
# (frpc 配置中的 user 字段必须匹配)
二十、常见问题
Q1: frpc 连接 frps 失败?
排查步骤:
- 检查 frps 是否正常运行:
systemctl status frps - 检查端口是否开放:
telnet x.x.x.x 7000 - 检查 token 是否一致
- 检查防火墙是否放行 7000 端口
- 查看日志:
tail -f /var/log/frps.log
Q2: 配置文件用 ini 还是 toml?
frp v0.52.0+ 开始推荐使用 TOML 格式,INI 格式已弃用。新部署请一律使用 .toml 格式。
Q3: XTCP 打洞失败?
P2P 打洞成功率取决于两端的 NAT 类型:
| NAT 类型 | 打洞成功率 |
|---|---|
| Full Cone(锥形) | 高 |
| Restricted Cone | 中 |
| Port Restricted Cone | 低 |
| Symmetric NAT(对称型) | 极低 |
建议:
- 配置
keepTunnelOpen = true保持隧道 - 配置 fallback 回退到 STCP
- 尝试更换 STUN 服务器
- 如果始终失败,直接使用 STCP
Q4: 如何实现开机自启?
- Linux: 使用 systemd(见第十七章)
- Windows: 使用 NSSM 或 WinSW 注册为系统服务
- macOS: 使用 launchd 或将 frpc 添加到登录项
Q5: frpc 和 frps 版本不一致能用吗?
frp 有版本兼容策略:每个小版本支持到有 9 个更新版本发布为止。例如 v0.69.0 可以和 v0.61.0 到 v0.77.0 的版本兼容。补丁版本(同小版本)始终兼容。
建议: 混合版本部署时,先升级 frps,再升级 frpc。
Q6: 如何查看流量使用情况?
- 登录 frps Dashboard(默认 7500 端口)查看
- 登录 frpc 管理面板(默认 7400 端口)查看
- 通过 API 获取:
http://服务器IP:7500/api/proxies(需 Basic Auth)
Q7: 一个 frps 可以连多个 frpc 吗?
可以。一个 frps 可以同时连接多个 frpc,每个 frpc 可以配置多个代理。只需确保代理名称不重复、端口不冲突。
Q8: 如何限制带宽?
# frpc.toml - 单个代理限速
[[proxies]]
name = "web"
type = "tcp"
localIP = "127.0.0.1"
localPort = 8080
remotePort = 6000
transport.bandwidthLimit = "1MB"
transport.bandwidthLimitMode = "client"
Q9: 如何使用 OIDC 认证?
# frps.toml
auth.method = "oidc"
auth.oidc.issuer = "https://your-oidc-provider"
auth.oidc.audience = "frp"
# frpc.toml
auth.method = "oidc"
auth.oidc.clientID = "your_client_id"
auth.oidc.clientSecret = "your_client_secret"
auth.oidc.issuer = "https://your-oidc-provider"
auth.oidc.audience = "frp"
Q10: 配置热更新?
frpc 支持通过管理 API 动态更新配置,无需重启:
# 重新加载配置
curl -u admin:password http://127.0.0.1:7400/api/reload -X POST
附录:完整配置示例
家庭服务器综合配置
场景: 家庭有一台服务器,运行多个服务,想通过公网访问。
frps.toml(云服务器):
bindPort = 7000
auth.token = "random_32_char_token"
vhostHTTPPort = 80
vhostHTTPSPort = 443
webServer.addr = "0.0.0.0"
webServer.port = 7500
webServer.user = "admin"
webServer.password = "strong_password"
allowPorts = [
{ start = 6000, end = 6100 }
]
log.to = "/var/log/frps.log"
log.level = "info"
log.maxDays = 7
transport.tls.force = true
frpc.toml(家庭服务器):
serverAddr = "x.x.x.x"
serverPort = 7000
auth.token = "random_32_char_token"
transport.tls.enable = true
webServer.addr = "127.0.0.1"
webServer.port = 7400
webServer.user = "admin"
webServer.password = "strong_password"
log.to = "/var/log/frpc.log"
log.level = "info"
log.maxDays = 3
# SSH(安全模式)
[[proxies]]
name = "home_ssh"
type = "stcp"
secretKey = "ssh_secret_key_123"
localIP = "127.0.0.1"
localPort = 22
# 博客网站(HTTP)
[[proxies]]
name = "blog"
type = "http"
localIP = "127.0.0.1"
localPort = 3000
customDomains = ["blog.example.com"]
# NAS 管理界面(HTTPS)
[[proxies]]
name = "nas"
type = "https"
customDomains = ["nas.example.com"]
[proxies.plugin]
type = "https2http"
localAddr = "127.0.0.1:5000"
crtPath = "/etc/ssl/certs/nas.pem"
keyPath = "/etc/ssl/private/nas.key"
# 远程桌面(TCP)
[[proxies]]
name = "rdp"
type = "tcp"
localIP = "127.0.0.1"
localPort = 3389
remotePort = 6000
# 文件服务器
[[proxies]]
name = "files"
type = "tcp"
remotePort = 6001
[proxies.plugin]
type = "static_file"
localPath = "/home/user/shared"
stripPrefix = "files"
httpUser = "admin"
httpPassword = "file_password"
访问者 frpc.toml(笔记本/手机热点):
serverAddr = "x.x.x.x"
serverPort = 7000
auth.token = "random_32_char_token"
transport.tls.enable = true
# 访问家庭 SSH
[[visitors]]
name = "home_ssh_visitor"
type = "stcp"
serverName = "home_ssh"
secretKey = "ssh_secret_key_123"
bindAddr = "127.0.0.1"
bindPort = 2222
# SSH 回家
ssh -p 2222 user@127.0.0.1
# 访问博客
# http://blog.example.com
# 访问 NAS
# https://nas.example.com
# 远程桌面
# x.x.x.x:6000
参考资料
- frp 官方文档:https://gofrp.org/en/docs/
- GitHub 仓库:https://github.com/fatedier/frp
- 配置参考:frps_full_example.toml / frpc_full_example.toml(随发行包附带)
本教程基于 frp v0.69.0 编写,配置文件使用 TOML 格式。

浙公网安备 33010602011771号