使用 Docker 轻松搭建 FRP 内网穿透

使用 Docker 轻松搭建 FRP 内网穿透

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.tarfrpc_v0.61.2.tar 两个文件,分别对应客户端和服务端的 Docker 镜像。
  • 如果不想使用 Docker,压缩包内还提供了 Windows 和 Linux 下的可执行文件。

下载链接
访问密码:ek3v

发表回复