当前位置: 首页 > news >正文

7. 基于Docker实现frp内网穿透

FRP 是 Github 上开源的一款内网穿透工具,点击前往项目地址,该项目分为 frps 服务端和 frpc 客户端,通过在拥有公网 IP 的服务器上搭建服务端,然后在被穿透的机器上安装客户端,配置好后就可以实现通过公网 IP 访问内网的内容了

官方有提供中文文档,可以根据文档进行操作,虽然他的文档对配置项都有介绍,但我个人觉得他这个文档逻辑结构梳理的不是很清楚,有些配置项不知道该不该用,不知道该在哪用,不知道怎么用,所以我自己写个文章简单记录一下做个笔记

本文是基于 Docker 运行 frps 和 frpc,并通过 TCP 协议简单穿透 SSH 和 HTTP,在观看本文之前请确保你的机器已经安装 Docker

服务端搭建 frps#

连接拥有公网 IP 的服务器,在合适的位置创建frps目录作为工作空间

# 创建 frps 目录作为工作空间
$ mkdir frps

# 创建服务端配置文件
$ touch frps/frps.toml

# 编辑服务端配置文件
$ vim frps/frps.toml

服务端配置文件内容如下所示

# 服务器的公网IP
bindAddr = "服务器的公网IP"
# 与客户端建立连接的端口
bindPort = 7000

# 服务端控制面板
webServer.addr = "服务器的公网IP"
# 访问控制面板的端口号
webServer.port = 7500
# 控制面板的用户名和密码,暴露在公网的服务请使用严谨一些的用户名密码
webServer.user = "admin"
webServer.password = "123456"

# 配置服务端的鉴权,这里使用Token进行鉴权,客户端必须用指定的Token才可以与服务端建立连接,防止滥用
auth.method = "token"
auth.token = "gbfvzhsybvtybsibvuipqfnnvlkashfgiawug"

# 配置服务端只打印warn级别的日志,并将日志输出到指定目录(注意这个目录指向的是容器内的目录)
log.level = "warn"
log.to = "/opt/frps/frps.log"

配置文件编写完成后下载fatedier/frps:v0.61.2镜像,不同与网上流传的教程(他们啥版本都有),该镜像应该是原作者提供的,镜像仓库名称和作者 Github 名称一致,且该镜像会及时跟进软件版本,v0.61.2 是截止到本文发布时的最新的版本

# 下载Docker镜像,Docker网络很迷,下载失败也不要紧,后面会帮你解决
$ docker pull fatedier/frps:v0.61.2

# 启动服务端 frps,推荐网桥用 host 类型,将刚刚创建的工作空间目录映射到容器中并指定配置文件启动
$ 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

执行命令后如果容器正常运行,没有自动停止,就算启动成功了,日志文件空白属于正常现象,因为配置文件中设置了只打印 warn 级别日志,启动成功的 info 级别日志不会打印,通过容器运行状态判断是否启动成功即可

启动成功后可以通过之前配置的控制面板检查 frps 的状态,之前配置的是 7500 端口,这里进行访问测试,需要注意该容器是使用 host 网桥启动的,如果服务器中启用了防火墙需要放行之前配置的 7000 和 7500 端口

image

image

客户端搭建 frpc#

如果你是 win 或移动端用户,请自行访问发行页面下载合适的版本以及客户端软件,这里仍然以 Linux Docker 环境举例搭建 frpc 客户端

同之前流程相似,在合适的位置创建frpc目录作为工作空间

# 创建 frpc 目录作为工作空间
$ mkdir frpc

# 创建客户端配置文件
$ touch frpc/frpc.toml

# 编辑客户端配置文件
$ vim frpc/frpc.toml

客户端配置文件内容如下所示

# 与服务端建立连接,跟上面的配置要对应
serverAddr = "服务端IP地址"
serverPort = 7000

# 配置Token鉴权,要与服务端一致
auth.method = "token"
auth.token = "gbfvzhsybvtybsibvuipqfnnvlkashfgiawug"

# 配置日志信息
log.level = "warn"
log.to = "/opt/frpc/frpc.log"

配置文件编写完成后下载fatedier/frpc:v0.61.2镜像,强烈建议与服务端版本一致

# 下载Docker镜像,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

同之前一样,日志文件是空白的,只要容器保持运行没有中途停止就算运行成功了

内网穿透SSH#

先写一个 SSH 内网穿透的配置,将本机的 22 端口映射到远程的 8001 端口,编辑客户端配置文件frpc.toml在原基础上添加内容

# 与服务端建立连接,跟上面的配置要对应
serverAddr = "服务端IP地址"
serverPort = 7000

# 配置Token鉴权,要与服务端一致
auth.method = "token"
auth.token = "gbfvzhsybvtybsibvuipqfnnvlkashfgiawug"

# 配置日志信息
log.level = "warn"
log.to = "/opt/frpc/frpc.log"

# 该内网穿透起名为SSH,annotations中随便写了一些备注,基于TCP协议将本机的22端口映射到公网的8001
[[proxies]]
name = "SSH"
annotations = {title = "SSH远程连接", fuck = "test", desc = "annotations是该连接的备注信息,里面的key和val是随便写的,在服务端控制面板可以看到"}
type = "tcp"
localIP = "192.168.137.10"
localPort = 22
remotePort = 8001

内网穿透配置完成后docker restart frpc重启容器,就可以使用公网IP在外地SSH远程本机了,控制面板看到连接信息

image

内网穿透HTTP#

FRP 支持 HTTP/HTTPS 协议的内网穿透,但是使用 HTTP 类型的内网穿透不是很方便,还需要配置一个域名,HTTPS 则更麻烦一些,还需要配置 SSL 证书,这里选择继续使用基于 TCP 协议的网站内网穿透

我本机运行了 Nginx,就以他为例子继续编辑客户端配置文件frpc.toml,在原基础上再在加一个内网穿透

# 与服务端建立连接,跟上面的配置要对应
serverAddr = "服务端IP地址"
serverPort = 7000

# 配置Token鉴权,要与服务端一致
auth.method = "token"
auth.token = "gbfvzhsybvtybsibvuipqfnnvlkashfgiawug"

# 配置日志信息
log.level = "warn"
log.to = "/opt/frpc/frpc.log"

# 该内网穿透起名为SSH,annotations中随便写了一些备注,基于TCP协议将本机的22端口映射到公网的8001
[[proxies]]
name = "SSH"
annotations = {title = "SSH远程连接", fuck = "test", desc = "annotations是该连接的备注信息,里面的key和val是随便写的,在服务端控制面板可以看到"}
type = "tcp"
localIP = "192.168.137.10"
localPort = 22
remotePort = 8001

# 该内网穿透起名为NGINX-HOME,基于TCP协议将本机的80端口映射到公网的8002
[[proxies]]
name = "NGINX-HOME"
type = "tcp"
localIP = "192.168.1.183"
localPort = 80
remotePort = 8002

docker restart frpc重启容器后访问公网查看效果

image

Docker镜像下载失败#

DockerHub 网络阴晴不定,下载镜像经常失败,现在的 Docker 镜像加速地址也好多都失效了,我个人比较喜欢先把镜像下载到本地,然后上传到服务器载入到 Docker 引擎中

为此我特意编写了一款开源工具 did-tool(Docker image download tool),该工具为 Java 语言编写可在任意操作系统上运行,可实现无 Docker 环境下使用 HTTP 协议通过代理下载 Docker 镜像文件,镜像文件下载到本地会被打包为xxx.tar文件,只需要上传到服务器后使用docker load -i xxx.tar就可以导入镜像,本文使用的 Docker 镜像文件已准备好,点击下方链接下载即可

后续补充#

证实官方镜像#

已证实fatedier/frpsfatedier/frpc是原作者提供的官方镜像,具体详情参考此 issues

服务端启动报错#

如果在启动服务端时报错 listen tcp xx.xx.xx.xx:7500: bind: cannot assign requested address,可以将服务端配置文件中绑定的公网 IP 设置为 0.0.0.0,公网 IP 绑定失败可能跟网络环境有点关系,具体不清楚,不过改成 0.0.0.0 是可以用的,建议能用公网 IP 优先公网 IP,如果绑定失败就改成 0.0.0.0

穿透网速慢#

如果你像我一样用 docker 运行 frpc,发现内网穿透的网速慢的离谱,或者随着时间的推移网速越来越慢,可以在让 frpc 容器使用宿主机网络(host 模式)

# docker run 的写法
docker run --net=host

# docker compose 的写法
network_mode: "host"

文件下载地址#

下载frps_v0.61.2.tarfrpc_v0.61.2.tar两个文件即可,分别对应客户端和服务端的 Docker 镜像,如果你不想使用 Docker,里面也提供了 win 和 linux 下的可执行文件

下载地址:https://hanzhe.lanzouw.com/b02a8n5pza 访问密码:ek3v

http://www.jsqmd.com/news/477830/

相关文章:

  • NCRE Python真题精讲:从高频考点到实战避坑指南
  • Youtu-Parsing服务高可用架构设计:负载均衡与故障转移实战
  • Jupyter Notebook快速入门:从安装到高效编码全指南
  • Stable Yogi Leather-Dress-Collection开源模型实战:2.5D皮衣生成技术深度拆解
  • Ubuntu系统下tmux的安装与基础会话管理
  • gte-base-zh效果对比:与其他开源嵌入模型的横向评测
  • 拉格朗日多项式插值法:从理论推导到Python实现
  • 通义千问1.5-1.8B-Chat-GPTQ-Int4助力.NET开发者:C#调用AI模型API实战
  • 高效大麦网自动抢票工具全流程配置与实战指南
  • 创维黄宏生:指望人形机器人做性伴侣不现实
  • Qwen-Image-2512与LangChain集成:自然语言处理与图像生成
  • 快速体验AI人脸隐私卫士:上传图片秒级自动打码
  • 别再租用别人的大脑:OpenClaw 与 AI 的“本地控制权”
  • SkillDeck 支持 OpenClaw 了,顺便聊聊小龙虾
  • CodeCombat 私有化部署实战:从零搭建编程游戏学习环境
  • 深度学习项目训练环境中的软件包管理最佳实践
  • RexUniNLU效果实测:零标注数据,精准识别新闻中的实体与关系
  • Apollo4 Blue 开发指南:从硬件配置到低功耗蓝牙应用
  • 非计算机专业转行AI大模型必看!雷军说站在风口猪都能飞,零基础如何拿年薪30K?
  • 雯雯的后宫-造相Z-Image-瑜伽女孩提示词模板:‘瑜伽女孩+体式+环境+光影+风格’五维结构
  • 三相桥式全控整流电路在Simulink中的动态仿真与触发角优化分析
  • FineReport单元格扩展与父子格设置实战:从基础配置到高级应用
  • 四大主流机器人仿真平台力控能力横向评测:从入门到精通的选型指南
  • CLIP-GmP-ViT-L-14应用落地:新闻配图相关性检测、虚假信息图文一致性核查
  • Gemma-3-12b-it多模态交互工具参数详解:batch_size/max_new_tokens调优
  • 解决Navicat连接PostgreSQL时authentication method 10报错的实用指南
  • DouYinBot:解决抖音无水印内容获取难题的高效解决方案
  • 2021年电赛E题:基于AM频分复用的数字-模拟混合信号收发机设计与实现(绿波电龙队)
  • 从MCAL到ELF:手把手教你用IAR工程编译S32K344的RTD驱动(含VScode联动技巧)
  • VOFA+与STM32F407联调:基于串口通信的PID参数可视化调试实战