阿里云frp内网穿透搭建--基于Docker

1,649 阅读4分钟

什么是内网穿透

内网穿透,也即 NAT 穿透,进行 NAT 穿透是为了使具有某一个特定源 IP 地址和源端口号的数据包不被 NAT 设备屏蔽而正确路由到内网主机。下面就相互通信的主机在网络中与 NAT 设备的相对位置介绍内网穿透方法。

内网穿透的用途

内网穿透主要用途是用于在外网环境下,访问内网服务的一种方法。

例如在做开发的过程中,尤其是远程开发,前后端在两个不同的地方,这个时候前端需要访问后端的服务,在没有内网穿透的情况下,要么就是让前端搭建一个后端相对应的服务环境,然后后端将包发给前端进行部署,前端在本地访问调试,或者后端将服务直接部署上云服务,供前端访问。这个过程中经历了打包,上传,部署的操作。如果这个时候出现一个Bug,就需要重新的进行打包上传部署这个流程,严重的拖慢开发效率。通过内网穿透,就可以很好的规避这个问题。

通过内网穿透,我们只需要准备一台公网服务器,搭建好环境,本地通过ide打开服务运行,启动一个内网穿透使用的连接终端。就可以让前端访问云上的指定端口而访问到本机正在运行的服务,如果出现Bug就能及时的修复,极大缩短了开发流程。

如何实现内网穿透

现成的内网穿透方案很多:

花生壳

nat123

ngrok.cc

等等都是提供内网穿透的服务商,其他的就不一一列举

另外一种就是自己搭建

自己搭建基于一般都是基于两种开源方案,ngrok和frp

相比起来,frp简单方便,所以本文就是基于frp去实现的,下面就跟随我的操作进行吧。

实现步骤

  1. 准备一台云上服务器,我这里用到的是阿里云,购买一台自己觉得刚好合适自己用的服务器,我自用的是: 计算型C5

CPU:2核4G

带宽:5M

其他的云服务商的可以自行选择购买。 选择使用的镜像是centos7.5,自行配置系统密码,如果没有提前配置的可以通过:右上角控制台-->云服务器ECS-->实例-->更多-->密码/密钥-->重置实例密码进行root用户的密码设置。如果购买完成之后没有看到实例。请看一下左上角的区域是不是自己购买的区域。 image.png

  1. 购买完成后,通过远程连接输入账号密码进入linux系统内部。

入口:右上角控制台-->云服务器ECS-->实例-->远程连接-->Workbench远程连接-->立即登录

如果使用本地终端,通过ssh root@<你实例的ip地址>,输入root的密码,进入即可。

  1. 安装docker环境
$ yum install -y docker // centos使用这个命令。其他的系统可自行查询命令
$ systemctl start docker // 安装完成之后通过这个命令可启动docker的服务
$ systemctl enable docker // 设置docker开机自启动
$ systemctl status docker // 这个命令可查看docker的运行情况active说明正在运行
$ docker ps // 通过这个命令可以查看当前正在运行的容器
  1. 拉取frps的镜像
$ docker pull snowdreamtech/frps // 通过这个命令拉取frp服务端的镜像
  1. 创建并且启动一个frp容器
// 创建一个目录存放配置文件,我创建/root/docker/frp/frps.ini
// frps.ini的内容
[common]
bind_port = 7000  // 绑定端口
bind_addr = 0.0.0.0  // 限制ip,0.0.0.0 就是所有ip都可以访问
token = xxxxxx // 认证方式

dashborad_port = 7001 // 后台页面端口
dashboard_user = xxxx  // 登录后台的用户名
dashboard_pwd = xxxxxx  // 登录后台的密码

执行命令:

$ docker run -d -v /root/docker/frp/frps.ini:/etc/frp/frps.ini -p 17000-17010:7000-7010 --name frp-server --restart=always --privileged=true snowdreamtech/frps 

// 通过上面的命令创建一个frps的运行服务
参数说明
-d 表示守护进程后台运行
-v 文件映射,将/root/docker/frp/frps.ini于容器内的/etc/frp/frps.ini做关联
-p 端口映射,将主机的端口与容器内的端口做映射,
我这里-p 17000-17010:7000-7010的意思就是将宿主机(本机)的17000-17010的端口与容器内的7000-7010的端口做映射,
至于端口映射的范围全看上面的配置,以及个人的需求,因为配置文件中bind_port=7000所以开放7000端口,dashborad_port=7001所以开放7001端口,至于剩下的端口是预留用于内网穿透使用的绑定端口,数量自定。
--name 指定容器的名字
--restart=always 设置容器为持续启动
--privileged=true 设置容器权限为root 

$ docker ps // 通过docker ps查看容器运行状态。
$ docker logs frp-server // 通过这个命令可以查看容器出现异常的情况下的日志

至此,服务端的frp环境就搭建完成了

  1. 阿里云上的镜像默认是关闭防火墙的,但是阿里控制台有设置自己的安全组,如果安全组的端口没有开放的情况下,依旧是没法访问的。所以需要开放安全组中的端口。 入口:右上角控制台-->云服务器ECS-->实例-->更多-->网络与安全-->安全组配置-->配置规则-->添加安全组规则

image.png

确定保存即可。

  1. 本地下载frp客户端 github.com/fatedier/fr… 通过这个地址,去寻找对应环境对应版本的客户端下载,目前我的服务端是0.37.1的版本,所以客户端也要下载0.37.1的版本。解压到本地目录。

  2. 修改frpc.ini的配置文件

[common]
server_addr = 对应服务器的ip
server_port = 17000 // 对应的是服务器docker镜像的7000端口,因为映射到宿主机上是17000所以这里设置17000
token = 认证口令
--- 上面是基础配置 ---
--- 下面是你要对应映射的服务配置 --- 

[web] // 服务名称
type = tcp // 链接类型选择tcp
local_ip = 127.0.0.1 // 本地的ip
local_port = 3000 // 服务启动所在的端口
remote_port = 7002  
// 映射到远程服务器上的端口,这里要说明一下,因为frp的通信过程都是基于docker的frp服务的,
所以在做服务配置的时候需要将端口跟docker的映射一致,
但是访问的时候因为docker的7002在宿主机上就是17002所以在访问服务的过程里使用的是17002,
当然这个是根据你-p参数自行配置的,如果你要保持一致也是没有问题的,
那就是在服务端运行docker命令的时候-p 7000-7010:7000-7010 ,
并且在安全组里面也是开放7000/7010的端口。

这个配置就基本完成了frp的服务配置

  1. 激动人心时候到了 我是mac系统的所以通过命令行工具进入到frp的解压目录下
$ ./frpc  // 执行这个命令

只要没有报错,就说明通道完成了

这个时候你只要启动对应端口的服务,就能通过

http://服务器的ip:端口(客户端配置文件中remote_port的端口)

访问到当前启动的服务了。

总结

实际上这个东西难度不大,也蛮好玩的,有兴趣的可以折腾折腾。我也就是把自己搭建的经验分享出来。玩一玩,也做个记录,不然以后要搭的时候都忘了,哈哈哈。

基于这个内容可以给大家做个参考

有什么新的想法,或者有什么建议的都欢迎提出来一起讨论。