家里的服务器、办公室电脑或 NAS 通常只能在局域网里访问。需要远程预览一个网站、接收 Webhook,或者连接内网设备的 SSH 时,可以用 frp 在公网服务器和内网设备之间建立转发通道。

本文从设备准备开始,以一个运行在内网 8080 端口的 Web 服务为例,完成安装、配置、测试与长期运行。主流程使用 Linux,另外补充 Windows 和 macOS 的客户端启动方式。

frp 的工作流程

frp 分为两个程序:frps 运行在公网服务器上,负责接收连接和转发流量;frpc 运行在内网,主动连接 frps,再将收到的请求转交给内网应用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
公网访问者
|
| http://公网服务器IP:18080
v
公网服务器:frps
| 7000:接收 frpc 连接
| 18080:Web 代理入口
|
| 经 frpc 主动建立的连接转发请求
v
内网设备:frpc
|
| http://127.0.0.1:8080
v
内网 Web 应用

内网没有公网 IP、路由器没有端口映射权限,都不妨碍这个基本流程。前提是内网设备能够向外连接公网服务器,且公网服务器的相关端口可达。frp 官方安装与部署说明

需要准备哪些设备

设备或条件 是否必需 用途与要求
一台有公网 IP 的服务器 必需 运行 frps,能够管理端口和防火墙;通常使用云服务器或 VPS
一台能持续联网的内网设备 必需 运行 frpc,可以是电脑、Linux 主机、NAS 或支持对应程序的设备
内网应用 必需 已经可以从 frpc 所在环境访问,如 Web 服务、SSH 服务
外网测试设备 建议 手机关闭 Wi-Fi 后用移动网络验证实际公网访问
域名 可选 直接用公网 IP 和端口测试时不需要;通过常规域名证书提供 HTTPS 时使用
家用路由器公网 IP 不需要 内网客户端主动向外连接,无需做家用路由器端口映射

frpc 不一定要和应用装在同一台设备上。例如 frpc 在一台 Linux 主机上,应用在局域网另一台 NAS 上,只要前者能访问后者的 IP 和端口即可。

硬件配置取决于连接数、吞吐量和应用负载。小规模测试可以从已有的轻量主机开始;实际体验往往更受公网服务器带宽、内网上传带宽和两端线路影响。内网设备休眠、断电或失去网络,转发也会中断。

本文使用的端口

参数 示例值 属于哪台设备
serverAddr frp.example.com 指向公网服务器的 DNS 记录,可直接改成公网 IP
bindPort / serverPort 7000 公网服务器接收内网客户端连接
localPort 8080 内网 Web 应用的监听端口
remotePort 18080 公网服务器上给访问者使用的转发端口

7000 是 frp 连接入口,浏览器访问的是 18080,这两个端口的作用不同。域名、路径和 token 都是示例,应替换为实际环境的值。

第一步:确认内网服务可以访问

在准备运行 frpc 的设备上执行:

1
curl -i http://127.0.0.1:8080/

响应正常后再继续。如果应用在另一台设备上,例如 192.168.1.20,应改为检查:

1
curl -i http://192.168.1.20:8080/

如果还没有测试应用,且机器已经安装 Python 3,可以在一个没有私密文件的空目录中临时启动静态服务:

1
2
3
mkdir -p frp-demo
cd frp-demo
python3 -m http.server 8080 --bind 127.0.0.1

测试时保留这个终端。该服务仅用于验证转发,不作为生产 Web 服务;目录中的文件可能被访问者读取。

第二步:下载并安装 frp

从 frp 官方 Releases 下载程序。下面固定使用 v0.68.0 演示安装,两端使用相同版本,方便复现配置;它不代表任何时候的最新版本。

选择操作系统和 CPU 架构

Linux 和 macOS 可用下面命令查看环境:

1
2
uname -s
uname -m
环境 发行包标识
Linux,x86_64 linux_amd64
Linux,aarch64 / ARM64 linux_arm64
Intel Mac darwin_amd64
Apple Silicon Mac darwin_arm64
Windows x64 windows_amd64

NAS、路由器和其他架构应单独确认系统兼容性。下载预编译程序不需要额外安装 Go 开发环境。

公网服务器安装

以下命令适用于 Linux x86_64,需要已有 curl 和 tar。ARM64 服务器将 FRP_PLATFORM 改为 linux_arm64:

1
2
3
4
5
6
7
8
9
10
11
12
13
FRP_VERSION="0.68.0"
FRP_PLATFORM="linux_amd64"
FRP_PACKAGE="frp_${FRP_VERSION}_${FRP_PLATFORM}"

curl -fL --retry 3 \
"https://github.com/fatedier/frp/releases/download/v${FRP_VERSION}/${FRP_PACKAGE}.tar.gz" \
-o "${FRP_PACKAGE}.tar.gz"
tar -xzf "${FRP_PACKAGE}.tar.gz"
cd "${FRP_PACKAGE}"

./frps --version
sudo install -m 755 frps /usr/local/bin/frps
sudo mkdir -p /etc/frp

内网客户端安装

在内网 Linux 设备上按自身架构执行同样的下载与解压步骤,然后在解压目录安装客户端:

1
2
3
./frpc --version
sudo install -m 755 frpc /usr/local/bin/frpc
sudo mkdir -p /etc/frp

macOS 下载对应的 darwin 包,解压后可以直接运行 ./frpc;Windows 解压对应的 ZIP 包,在 PowerShell 中使用 .\frpc.exe。后文的 /etc/frp/frpc.toml 是 Linux 路径,其他系统可把配置放在解压目录中。

第三步:配置公网服务器 frps

先生成一个随机 token,用作两端连接认证:

1
openssl rand -hex 32

将生成的值保存在自己的配置中,两端必须一致。frp token 验证的是客户端接入身份,不会给公网 Web 应用自动增加登录认证。frp 认证机制

在公网服务器上创建 /etc/frp/frps.toml:

1
2
3
4
5
6
7
8
9
10
11
bindAddr = "0.0.0.0"
bindPort = 7000
proxyBindAddr = "0.0.0.0"

auth.method = "token"
auth.token = "REPLACE_WITH_YOUR_RANDOM_TOKEN"
transport.tls.force = true

allowPorts = [
{ single = 18080 }
]

这份配置允许客户端申请 18080 作为公网转发端口。allowPorts 只是 frp 的端口许可清单,不会自动修改云安全组或系统防火墙。frps 配置参考

测试阶段,应在安全组和防火墙中允许 TCP 7000 与 TCP 18080:前者供内网客户端连接,后者供外部测试者访问。能固定来源地址时按来源放行;不要因此清空防火墙规则。

检查配置,再前台运行:

1
2
frps verify -c /etc/frp/frps.toml
frps -c /etc/frp/frps.toml

保留该终端,接下来配置内网客户端。

第四步:配置内网客户端 frpc

在内网 Linux 设备上创建 /etc/frp/frpc.toml:

1
2
3
4
5
6
7
8
9
10
11
12
13
serverAddr = "frp.example.com"
serverPort = 7000

auth.method = "token"
auth.token = "REPLACE_WITH_YOUR_RANDOM_TOKEN"
transport.tls.enable = true

[[proxies]]
name = "home-web"
type = "tcp"
localIP = "127.0.0.1"
localPort = 8080
remotePort = 18080

替换 serverAddr 和 token。如果应用在另一台局域网设备上,把 localIP 改成那台设备的地址,例如 192.168.1.20。

frp.example.com 需要直接解析到服务器。若 DNS 使用 Cloudflare,此记录应选择 DNS only;普通橙云 HTTP 代理不能直接承载这里 TCP 7000 上的 frp 连接。

Linux 检查并启动:

1
2
frpc verify -c /etc/frp/frpc.toml
frpc -c /etc/frp/frpc.toml

macOS 在解压目录中执行:

1
2
./frpc verify -c ./frpc.toml
./frpc -c ./frpc.toml

Windows 在解压目录的 PowerShell 中执行:

1
2
.\frpc.exe verify -c .\frpc.toml
.\frpc.exe -c .\frpc.toml

代理名称需要避免冲突。本文使用 TOML 的 [[proxies]] 写法,不能混用旧 INI 教程中的 [common] 和 server_addr 等字段。frp 配置格式与 verify 命令

第五步:验证公网访问

确认服务端和客户端日志没有认证、连接或代理启动错误,再用外网设备访问:

1
http://公网服务器IP:18080/

也可以在外网设备执行,使用真实公网 IP 替换占位符:

1
curl -i http://YOUR_SERVER_IP:18080/

能看到内网应用的响应,就说明基本穿透链路已经打通。这个测试入口使用 HTTP,不应用来传输密码或其他敏感业务数据;正式 Web 访问可继续配置下面的 HTTPS 入口。

两端配置中开启的 TLS 保护 frpc 与 frps 之间的连接,不会自动给浏览器入口提供 HTTPS。隧道需要验证服务器身份时,还应配置证书、受信任 CA 和服务名校验,不能只依赖 TLS 开关。frp TLS 配置说明

第六步:Linux 后台运行与开机自启

下面适用于使用 systemd 的 Linux,例如常见 Debian、Ubuntu 服务器。先结束前台运行的对应进程,避免新服务启动时端口被占用。

创建运行用户

在两台 Linux 设备上分别创建专用用户;若已经存在 frp 用户,无需重复创建:

1
sudo useradd --system --user-group --no-create-home --shell /usr/sbin/nologin frp

公网服务器设置配置权限:

1
2
sudo chown root:frp /etc/frp/frps.toml
sudo chmod 640 /etc/frp/frps.toml

内网设备设置客户端配置权限:

1
2
sudo chown root:frp /etc/frp/frpc.toml
sudo chmod 640 /etc/frp/frpc.toml

公网服务器服务文件

创建 /etc/systemd/system/frps.service:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[Unit]
Description=frp server
Wants=network-online.target
After=network-online.target

[Service]
Type=simple
User=frp
Group=frp
ExecStart=/usr/local/bin/frps -c /etc/frp/frps.toml
Restart=on-failure
RestartSec=5s
NoNewPrivileges=true

[Install]
WantedBy=multi-user.target

启动并设置开机自启:

1
2
3
sudo systemctl daemon-reload
sudo systemctl enable --now frps
sudo systemctl status frps --no-pager

内网客户端服务文件

创建 /etc/systemd/system/frpc.service:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[Unit]
Description=frp client
Wants=network-online.target
After=network-online.target

[Service]
Type=simple
User=frp
Group=frp
ExecStart=/usr/local/bin/frpc -c /etc/frp/frpc.toml
Restart=on-failure
RestartSec=5s
NoNewPrivileges=true

[Install]
WantedBy=multi-user.target

启动并设置开机自启:

1
2
3
sudo systemctl daemon-reload
sudo systemctl enable --now frpc
sudo systemctl status frpc --no-pager

分别查看对应设备的日志:

1
2
sudo journalctl -u frps -n 100 --no-pager
sudo journalctl -u frpc -n 100 --no-pager

修改 TOML 后先执行 verify,再重启对应服务;修改 .service 文件时还需执行 daemon-reload。systemd 使用方式见 frp 官方说明。

Windows 可使用任务计划程序配置开机运行,并填写程序、配置文件的绝对路径与工作目录;macOS 可使用 launchd。上述 systemd 文件不能直接用于这两个系统。

可选:域名与 HTTPS 访问

已有公网 Web 服务转发后,可以在公网服务器上部署 Nginx,让用户通过 https://app.example.com 访问。需要准备域名、对应 DNS 记录、有效证书以及 Nginx;证书获取和续期应由现有证书管理方案负责。

将转发端口改为本机可见

在 frps.toml 中把原有字段改成:

1
proxyBindAddr = "127.0.0.1"

验证并重启 frps 后,公网服务器上的 Nginx 仍可访问 127.0.0.1:18080,外部访问者不再直接连接 18080。安全组应允许 HTTPS 入口 TCP 443,同时移除之前测试用的公网 18080 放行规则。

这个设置对该 frps 的代理监听地址生效,不是只影响某一条 Web 代理。若同一实例还承担需要公网直连的其他端口,应单独规划监听方式或拆分实例。

配置 Nginx

将 app.example.com 解析到服务器,在 Nginx 的 HTTP 配置中加入:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
server {
listen 443 ssl;
server_name app.example.com;

ssl_certificate /etc/nginx/certs/app.example.com/fullchain.pem;
ssl_certificate_key /etc/nginx/certs/app.example.com/privkey.pem;

location / {
proxy_pass http://127.0.0.1:18080;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}

证书路径必须存在且能被 Nginx 读取,不能直接保留示例路径。检查配置后重载:

1
2
3
sudo nginx -t
sudo nginx -s reload
curl -I https://app.example.com/

这份配置面向普通 HTTP 应用。WebSocket 还需要配置升级请求头;AI 聊天等 SSE 接口需要检查代理缓冲和超时。相关指令见 Nginx 代理模块文档。

可选:转发 SSH

本节基于前面 proxyBindAddr = "0.0.0.0" 的公网端口方案。若已经改为回环地址,仅增加规则不会让 SSH 端口对公网开放。

先确认内网设备已经运行 SSH 服务,并在 frps.toml 的原有 allowPorts 中增加端口,不要重复定义整个字段:

1
2
3
4
allowPorts = [
{ single = 18080 },
{ single = 6000 }
]

然后在 frpc.toml 末尾追加代理:

1
2
3
4
5
6
[[proxies]]
name = "home-ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 6000

验证并重启两端服务,按访问来源放行服务器 TCP 6000,即可连接:

1
ssh -p 6000 your_user@YOUR_SERVER_IP

这里的 your_user 是内网机器的 SSH 账号。使用密钥认证并核对主机指纹;仅供本人或小团队访问的服务,也可以使用需要访问端参与的 STCP。frp SSH 示例、STCP 使用说明

常见问题与排查顺序

现象 优先检查
frpc 连接超时 公网 IP、DNS、7000 端口、安全组、系统防火墙以及内网出站策略
token 认证失败 两端值是否完全一致,是否仍保留占位文本,是否加载了正确的配置文件
port already used 转发端口是否被其他程序占用,是否重复启动了前台进程和系统服务
端口不被允许 remotePort 是否包含在服务端的 allowPorts 中
proxy name ... already in use 多个客户端是否使用了相同代理名称
客户端在线,但 Web 访问失败 应用是否启动,localIP 和 localPort 是否正确
服务器本机可以访问,外网不行 代理是否只监听回环地址,入口端口和防火墙是否一致
Docker 中的 frpc 访问不到应用 127.0.0.1 是否错误地指向 frpc 容器本身
重启后不工作 二进制与配置的绝对路径、文件权限、服务是否启用和设备是否联网
登录后跳转到 localhost 应用外部 URL、可信代理与 HTTPS 识别配置

Docker 场景中,同一自定义网络里的容器可以使用服务名通信;访问宿主机时使用当前平台支持的宿主机地址。宿主机应用若只监听回环地址,容器不一定能够访问,不能仅替换一个主机名就认为网络已经连通。

排查时按顺序验证每一段:

  1. 在内网客户端环境中用 curl 检查应用。
  2. 查看 frpc 是否成功连接和注册代理。
  3. 在公网服务器用 ss -lntp 检查端口,再访问本机转发入口。
  4. 从外网设备访问公网 IP 和端口。
  5. 最后检查域名、HTTPS 证书和反向代理。
1
2
ss -lntp
curl -i http://127.0.0.1:18080/

长期运行时,把 token 配置排除在 Git 仓库之外,并使用应用自身的登录和权限控制。临时分享结束后,删除不再需要的代理规则,或停止相应服务并收回端口放行。

相关阅读

站内搜索

没有找到内容!