搭建自己的ngrok服务,实现内网穿透.

What?

ngrok 是一个反向代理,通过在公共的端点和本地运行的 Web 服务器之间建立一个安全的通道。ngrok 可捕获和分析所有通道上的流量,便于后期分析和重放。简单来说就是可以让你的本地服务暴露在外网上面,可以通过外网访问,这是我们经常需要用到的功能。
搭建自己的ngrok服务,实现内网穿透.

How?

如何搭建ngrok服务呢?

下面是我在centOS7 64位上面的搭建过程。

1.go环境搭建

go环境安装可以通过源码安装或安装EPEL扩展源后使用yum安装,由于使用yum安装的go不能进行交叉编译,不能够编译生成Windows客户端,所以推荐使用通过源码安装。
源码安装go的详细过程如下:

  • 1).下载源码,可以在https://golang.org/dl/ 上找到自己系统对应的源码。由于我的vps系统是centos的,所以下载的是:go1.6.linux-amd64.tar.gz。 (go >= 1.6 否则编译会通不过)
  • 2).将其解压到/usr/local目录下:
  1. wget --no-check-certificate https://storage.googleapis.com/golang/go1.6.linux-amd64.tar.gz
  2. tar -C /usr/local  -xzf   go1.6.linux-amd64.tar.gz

注:如果是64位的系统下载了32位的安装包,后面的构建会出现 /lib/ld-linux.so.2: bad ELF interpreter 类似这样的错误 解决方法:yum install glibc.i686。安装一个32bit的glibc就可以了。

  • 3). 在root环境下执行如下命令配置环境变量
  1. echo 'export GOROOT=/usr/local/go'>> ~/.bashrc
  2. echo 'export GOPATH=$HOME/go'>> ~/.bashrc
  3. echo 'export PATH=$PATH:$GOROOT/bin'>> ~/.bashrc
  4. source  $HOME/.bashrc
  • 4). 安装go get工具以及依赖.
  1. yum install  mercurial git bzr subversion  build-essential golang
2. 获取源码

git版本需要在1.7.9.5以上,如果不符合条件需要将git版本升级。我这里的git版本是1.8.3.1。
获取源码:

  1. git clone https://github.com/inconshreveable/ngrok.git  
3. 编译

1). 配置生成自签名ssl证书

  1. cd ngrok
  2. export NGROK_DOMAIN="ng.mrtang.cc"  //将域名替换成你自己的.同时做好域名映射
  3. openssl genrsa -out rootCA.key 2048
  4. openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=$NGROK_DOMAIN" -days 5000 -out rootCA.pem
  5. openssl genrsa -out device.key 2048
  6. openssl req -new -key device.key -subj "/CN=$NGROK_DOMAIN" -out device.csr
  7. openssl x509 -req -in device.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out device.crt -days 5000
  8. \cp rootCA.pem assets/client/tls/ngrokroot.crt -f
  9. \cp device.crt assets/server/tls/snakeoil.crt  -f
  10. \cp device.key assets/server/tls/snakeoil.key -f

生成服务端与客户端

注:编译的过程会需要去github、google code下载其余依赖项目的源码,因此建议使用海外vps

这里我们需要交叉编译,使用不同的编译选项来选择编译以后生成的平台

  1. //Linux 平台 32 位系统
  2. GOOS=linux GOARCH=386 make release-client release-server
  3. //Linux 平台 64 位系统
  4. GOOS=linux GOARCH=amd64 make release-client release-server
  5. //ARM 平台
  6. GOOS=linux GOARCH=arm make release-client release-server
  7. //MAC 平台 32 位系统
  8. GOOS=darwin GOARCH=386 make release-client release-server
  9. //MAC 平台 64 位系统
  10. GOOS=darwin GOARCH=amd64 make release-client release-server
  11. //Windows 平台 32 位系统
  12. GOOS=windows GOARCH=386 make release-client release-server
  13. //Windows 平台 64 位系统
  14. GOOS=windows GOARCH=amd64 make release-client release-server

通过前面的步骤,就会在bin目录里面生成所有的客户端文件,客户端平台是文件夹的名字,客户端放在对应的目录下,当前Linux平台客户端在bin目录下。然后我们就可以打个包,把所有文件下载到自己的本机了。

这个里面的注意

  • 服务端叫 ngrokd
  • 客户端叫 ngrok

所以以后要放到对应的平台,就只需要对应平台里面的ngrok文件就可以了。

ngrokd服务启动与使用

在server端直接执行就可以了,其中NGROK_DOMAIN对应的就是一开始设置过的域名地址,同时注意防火墙要打开对应的端口。

  • httpAddr 是访问普通的http使用的端口号,用后面用 子域名xx.ng.mrtang.cn来访问服务
  • httpsAddr 是访问的https使用的端口号,同上,只不过是需要https的服务访问才用这个端口
  • tunnelAddr 是通道的端口号,这个端口是Ngrok用来通信的,所以这个端口在服务器上和客户端上设置必须要对应才可以正常的链接,默认不填写好像是4443

1、启动ngrokd服务端

  1. bin/ngrokd -domain="$NGROK_DOMAIN" -httpAddr=":80" -httpsAddr=":443"

注意,让程序一直在后台运行可以执行

  1. nohup bin/ngrokd -domain="$NGROK_DOMAIN" -httpAddr=":80"  -httpsAddr=":443" &

想要结束后台进程可以

  1. ps -A   #找到PID
  2. kill xxxid

2、启动ngrok客户端

客户端使用,拷贝刚刚生成的ngrok.exe文件到本地,创建ngrok.cfg配置文件,可以根据自己的实际情况进行配置

  1. server_addr: "ng.mrtang.cc:4443"
  2. trust_host_root_certs: false

再在windows控制台执行

  1. ngrok -config=ngrok.cfg -subdomain test 80

test是你自定义地址。

看到这样一个界面就说明成功了

搭建自己的ngrok服务,实现内网穿透.

如果不是这种界面应该是启动服务端的时候环境变量有问题,客户端与服务端的域名配置不一样导致的。客户端ngrok.cfg中serveraddr后的值必须严格与-domain 以及证书中的NGROK_DOMAIN相同

配置 raspberry pi 客户端

配置流程和在windows下大同小异

先在需要的地方建立一个目录,然后建立一个和window下一样的ngrok.cfg的文件,内容也相同

将编译好的arm版本的ngrok解压出来,并上传到树莓派上对应的目录。

进入这个目录以后,通过 chmod +x ngrok 将ngrok设置成可执行文件。然后运行同样的命令即可!

  • 我的微信
  • 使用微信扫一扫
  • weinxin
  • IT运维交流群
  • 使用QQ扫一扫
  • weinxin
༺小ʚɞ寞༻

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: