基于 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 端口

客户端搭建 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远程本机了,控制面板看到连接信息

内网穿透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重启容器后访问公网查看效果

Docker镜像下载失败

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

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

文件下载地址

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

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

自己做博客SEO太差啦没有人,原文地址求你点进去看

防止被说引流,折叠隐藏愿者上钩
35 个赞

感谢分享 :bili_011: :construction:
收藏了

感谢佬友详尽的教程,之前折腾这些费了不少时间。另外想问一下佬友,如果用 vnc 协议穿透远程桌面,除了端口号有没有额外的配置能优化远程桌面的体验,之前 ai 帮我写了 kcp 之类的配置,但是最后也没配置成功。

不懂哎,FRP我也是这两天才开始接触的,现在是刚会用的状态,其他的我也不懂 :bili_001:

kcp有一些提升,但是校园网搭配路由器的frp效果还是不如第三方软件。kcp的配置是需要服务端和客户端端口对应,不要忘记开放转发规则iptables -A FORWARD -p tcp --dport 47234 -j ACCEPT 我折腾下来感觉转发规则是有区别的,还要注意udp,tcp的区别。

感谢分享 :bili_011: :construction:

1 个赞

佬友有详细的教程吗,之前问了几个 ai 也没写对配置文件:eyes:

感谢分享先mark一下 :eyes:

今天又修改了docker和挂载文件,累死辽。我也是一直问的ai,主要就是几个点:systemd是否开启了,反正我不开,开启的话停止docker好费劲呐。还有改docker的配置文件记得停止路由器的客户端,因为要停止docker,再重新创建docker。
我中间遇到一些比较独特的问题就是提示架构不匹配,就是说云服务器的架构arm64安装对应arm64的frp和docker。有的时候删除不掉东西就考虑看日志、考虑chmod放权限。哦,还有下载的docker我还是不建议使用镜像源,我用了镜像源老出问题 :face_exhaling:就是给出配置文件让ai构建docker。
最后我是使用的sunshine和moonlight,记得服务端的配置文件和客户端的配置文件要对应一些,比如端口,qui,kcp协议什么的,路由器记得重新开启frp转发。这种文件不对应和不开放的操作,在moonlight就是一直体现在提示防火墙问题,连接的时候最好关闭代理的影响。详细教程的话,后面再详细说吧,现在你就看这么几个方向。

2 个赞

感谢佬友的详细说明哈哈哈 :smiling_face_with_three_hearts:

感谢分享,写的很详细了!

只为了跟我一样的菜鸟少走一些弯路。我再讲述一下效果吧,作为没有公网的校园宽带,我的老毛子里面设置frp转发,用的是甲骨云,搭配协议歇斯底里(hy2),sunshine里面conf文件也稍微设置了,但是最终的效果是跨局域网看不了视频,第三方免费软件无界趣连可以看视频。所以还是建议有公网的再尝试。
同局域网就不用说了,哪种方法都没有压力。

太强了,大佬!

1 个赞

已给赞
佬,读了一遍,只是没太明白
如果NAS上建立了FRPS,在外面用手机访问NAS,那么手机上要安装什么?
谢谢

感谢分享,写的真详细

Frp 是个开源的内网穿透,分为服务端 frps 和客户端 frpc,服务端的 frps 要求安装在有公网 IP 的机器上才可以正常使用,你在 NAS 上安装 frps,又希望通过 FRP 在外网访问 NAS,感觉有点矛盾,需要确保你的 NAS 有公网 IP 才可以

假设你的 NAS 有公网 IP,但你还是想通过内网穿透的方式访问你的 NAS,那就在本机或局域网内任意一台机器上运行 frpc 做映射就可以了,手机端不需要额外装什么软件

1 个赞

感谢分享

FRP没必要上docker,映射多了可能会跟宿主机某些东西有冲突,而且性能占用也会多。。

主打一个省事儿,目前没啥冲突,也没占用多大,移植方便

我个人来讲,当我想部署什么的时候,自己查资料安装嫌麻烦,如果有 Docker 我会毫不犹豫选 Docker,哪怕他很简单,也比不过一行 docker-run

用了3年了,一直很稳定的内网穿透工具。