frp内网穿透使用教程

frp(Fast Reverse Proxy)是一个专注于内网穿透的高性能反向代理应用,支持 TCP、UDP、HTTP、HTTPS、STCP、SUDP、XTCP、TCPMUX 等多种协议类型,可以将内网服务以安全、便捷的方式通过具有公网 IP 的节点中转暴露到公网。

本教程基于 frp 最新版本(v0.69.0+),配置文件使用 TOML 格式。


目录


一、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...) │
                                               └──────────────────┘

工作流程:

  1. frpc 启动后连接 frps,注册代理规则
  2. 公网用户访问 frps 的端口
  3. frps 将请求通过隧道转发给 frpc
  4. frpc 将请求转给本地内网服务
  5. 响应沿原路返回

三、安装部署

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 失败?

排查步骤:

  1. 检查 frps 是否正常运行:systemctl status frps
  2. 检查端口是否开放:telnet x.x.x.x 7000
  3. 检查 token 是否一致
  4. 检查防火墙是否放行 7000 端口
  5. 查看日志: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 v0.69.0 编写,配置文件使用 TOML 格式。

posted @ 2026-09-29 10:40  直角漫步  阅读(61)  评论(0)    收藏  举报