FRP 是一款开源的内网穿透工具,托管在 GitHub 上,[点击这里访问项目地址]。该项目包含 frps(服务端) 和 frpc(客户端) 两部分。通过在 拥有公网 IP 的服务器上搭建 frps 服务端,然后在需要穿透的 内网设备 上运行 frpc 客户端,即可实现通过公网访问内网服务。
官方提供了详细的中文文档,可以按照文档进行配置。不过,文档虽然介绍了各个配置项,但逻辑结构可能不够直观,导致有些选项不知道是否需要、该如何使用,或者应该放在哪个位置。因此,我写下这篇文章,作为一个简单的记录和指南。
本文内容
本文介绍如何基于 Docker 运行 frps(服务端) 和 frpc(客户端),并使用 TCP 协议 进行 SSH 和 HTTP 的内网穿透。
先决条件
在开始之前,请确保你的机器已经安装了 Docker。
搭建 frps(服务端)
首先,连接到拥有公网 IP 的服务器,然后在合适的位置创建 frps 目录 作为工作空间。
1. 创建 frps
目录并配置服务端
首先,创建 frps 目录 作为工作空间,并创建 frps 配置文件:
# 创建 frps 目录
mkdir frps
# 创建服务端配置文件
touch frps/frps.toml
# 编辑服务端配置文件
vim frps/frps.toml
服务端配置文件内容如下所示
# 服务器的公网 IP(frps 监听地址)
bindAddr = "服务器的公网IP"
# 与客户端建立连接的端口
bindPort = 7000
# 服务端控制面板配置
webServer.addr = "服务器的公网IP" # 访问控制面板的地址
webServer.port = 7500 # 控制面板的端口号
# 控制面板的登录凭据(若暴露在公网,请使用强密码)
webServer.user = "admin"
webServer.password = "123456"
# 服务器鉴权配置,使用 Token 方式,客户端必须匹配该 Token 才能连接
auth.method = "token"
auth.token = "abcdefgabcdefg"
# 日志配置,仅记录 warn 级别及以上日志,并存储在指定目录(容器内路径)
log.level = "warn"
log.to = "/opt/frps/frps.log"
下载 FRPS 镜像
在编写完 frps 配置文件 后,我们需要下载 fatedier/frps:v0.61.2 镜像。
与一些网上流传的教程不同(它们的版本五花八门),fatedier/frps 是官方维护的镜像,其名称与 FRP 作者的 GitHub 用户名一致,并且会及时跟进软件版本更新。当前最新版本是 v0.61.2(截至本文发布时)。
下载并运行 frps
容器
首先,下载 fatedier/frps:v0.61.2 镜像:
# 拉取 FRPS Docker 镜像
docker pull fatedier/frps:v0.61.2
注意: Docker 网络可能会出现下载失败的情况,别担心,后面会提供解决方案。
然后,使用 host 网络模式 启动 frps
,并将工作目录映射到容器中,同时指定 配置文件 启动:
docker run --name frps \
--restart always \
--network host \
-e TZ=Asia/Shanghai \
-v ./frps:/opt/frps \
-d fatedier/frps:v0.61.2 -c /opt/frps/frps.toml
验证 FRPS 是否启动成功
执行启动命令后,如果容器正常运行且未自动停止,则表示 FRPS 启动成功。
- 日志文件为空是正常现象,因为配置文件中设置了仅打印
warn
级别日志,而info
级别日志不会输出。 - 你可以通过 容器的运行状态 来判断 FRPS 是否成功启动。
访问控制面板
启动成功后,可以通过之前配置的控制面板检查 FRPS 运行状态。
- 控制面板默认监听 7500 端口,可以通过浏览器访问进行测试。
- 由于 FRPS 容器使用的是 host 网络模式,如果服务器启用了 防火墙,请确保放行 7000 和 7500 端口,否则可能导致访问失败。


搭建 frpc(客户端)
如果你使用 Windows 或 移动端,请自行访问 FRP 发行页面 下载适配的客户端。本文仍然以 Linux Docker 环境 为例,搭建 frpc 客户端。
1. 创建工作空间
与之前的 frps(服务端) 流程类似,我们需要创建 frpc 目录 作为工作空间:
# 创建 frpc 目录
mkdir frpc
# 创建客户端配置文件
touch frpc/frpc.toml
# 编辑客户端配置文件
vim frpc/frpc.toml
2. 配置 frpc.toml
编辑 frpc.toml
,内容如下(需与 frps 服务端 配置对应):
# 连接服务端
serverAddr = "服务端IP地址"
serverPort = 7000
# Token 鉴权(需与服务端一致)
auth.method = "token"
auth.token = "gbfvzhsybvtybsibvuipqfnnvlkashfgiawug"
# 日志配置
log.level = "warn"
log.to = "/opt/frpc/frpc.log"
3. 下载并运行 frpc
容器
下载 fatedier/frpc:v0.61.2 镜像,建议版本与 frps(服务端) 保持一致:
# 拉取 FRPC Docker 镜像(如果下载失败,后续会提供解决方案)
docker pull fatedier/frpc:v0.61.2
启动 frpc 客户端,并将工作空间映射到容器中:
docker run --name frpc \
--restart always \
-e TZ=Asia/Shanghai \
-v ./frpc:/opt/frpc \
-d fatedier/frpc:v0.61.2 -c /opt/frpc/frpc.toml
4. 验证 frpc
是否成功运行
- 日志文件为空是正常的,因为
log.level
设为 warn,不会记录info
级别的日志。 - 只要 容器保持运行且未自动停止,即表示
frpc
启动成功。
内网穿透 SSH 配置
首先,我们需要配置一个 SSH 内网穿透,将本机的 22 端口映射到远程服务器的 8001 端口。编辑客户端配置文件 frpc.toml
,在原有配置基础上添加以下内容:
toml复制代码# 与服务端建立连接,配置要与服务端的设置一致
serverAddr = "服务端IP地址"
serverPort = 7000
# 配置Token鉴权,要与服务端一致
auth.method = "token"
auth.token = "gbfvzhsybvtybsibvuipqfnnvlkashfgiawug"
# 配置日志信息
log.level = "warn"
log.to = "/opt/frpc/frpc.log"
# 配置内网穿透,命名为SSH,将本机的22端口映射到公网的8001端口
[[proxies]]
name = "SSH"
annotations = {title = "SSH远程连接", desc = "这些是连接的备注信息,可以在服务端控制面板查看"}
type = "tcp"
localIP = "192.168.137.10"
localPort = 22
remotePort = 8001
配置好后,使用以下命令重启 frpc
容器:
bash复制代码docker restart frpc
现在,你可以通过公网 IP 在外地进行 SSH 远程连接本机了,并在控制面板看到连接信息。
内网穿透 HTTP 配置
FRP 支持 HTTP/HTTPS 协议的内网穿透,但配置 HTTP 内网穿透相对麻烦,通常需要配置一个域名,HTTPS 则更复杂,还需配置 SSL 证书。因此,我们这里继续使用基于 TCP 协议的网站内网穿透。
假设本机上运行了 Nginx,接下来我们编辑客户端配置文件 frpc.toml
,并增加一个内网穿透配置:
toml复制代码# 与服务端建立连接,配置要与服务端的设置一致
serverAddr = "服务端IP地址"
serverPort = 7000
# 配置Token鉴权,要与服务端一致
auth.method = "token"
auth.token = "gbfvzhsybvtybsibvuipqfnnvlkashfgiawug"
# 配置日志信息
log.level = "warn"
log.to = "/opt/frpc/frpc.log"
# 配置SSH内网穿透
[[proxies]]
name = "SSH"
annotations = {title = "SSH远程连接", desc = "这些是连接的备注信息,可以在服务端控制面板查看"}
type = "tcp"
localIP = "192.168.137.10"
localPort = 22
remotePort = 8001
# 配置Nginx内网穿透,将本机的80端口映射到公网的8002端口
[[proxies]]
name = "NGINX-HOME"
type = "tcp"
localIP = "192.168.1.183"
localPort = 80
remotePort = 8002
完成配置后,同样重启 frpc
容器:
bash复制代码docker restart frpc
然后,你就可以通过公网访问 Nginx 了,效果如同访问本地一样。

Docker 镜像下载失败
由于 Docker Hub 的网络不稳定,下载镜像时经常失败。虽然许多 Docker 镜像加速器地址已经失效,但我个人更倾向于先将镜像下载到本地,然后上传到服务器并载入 Docker 引擎。
为了解决这个问题,我开发了一个开源工具——did-tool
(Docker Image Download Tool)。这个工具是用 Java 编写的,能够在任何操作系统上运行。它允许在没有 Docker 环境的情况下,通过 HTTP 协议和代理下载 Docker 镜像。下载后的镜像会被打包为 .tar
文件,上传到服务器后,只需使用以下命令导入镜像:
docker load -i xxx.tar
本文中使用的 Docker 镜像已经准备好,你只需要点击下方链接进行下载。
文件下载地址:
- 下载
frps_v0.61.2.tar
和frpc_v0.61.2.tar
两个文件,分别对应客户端和服务端的 Docker 镜像。 - 如果不想使用 Docker,压缩包内还提供了 Windows 和 Linux 下的可执行文件。
下载链接
访问密码:ek3v