一、ngrok介绍及场景应用

1、介绍

  ngrok是非常流行的反向代理服务,可以进行内网穿透,支持80端口以及自定义tcp端口转发。这样你就可以运行本地的程序,而让别人通过公网访问了

反向代理,通过在公共的端点和本地运行的 Web 服务器之间建立一个安全的通道。ngrok 可捕获和分析所有通道上的流量,便于后期分析和重放

获取 公司内网 镜像怎么弄_获取 公司内网 镜像怎么弄


2、场景使用

因为做开发很多程度需要不断同步git服务器或者什么来做一些外部对接的测试

每次更新都要push到远端,而且有时候代码还未必正式写完,不仅影响git提交不美观,而且麻烦,所以ngrok的内网穿透就显神威了!

网上有ngrok的国内服务了,不过有时候不稳定,下面跟我一起来架设自己的ngrok服务吧


二、环境准备

1、需要的材料

(1)云服务器或vps

如:阿里云等云服务器最好,不过阿里云记得用备案域名哦

(2)一个域名

解析到云服务器或vps的ip (如: ngrok.along.top)


2、安装git

(1)安装git,我安装的是2.9版本,防止会出现另一个错误,安装git所需要的依赖包

yum -y install zlib-devel openssl-devel perl hg cpio expat-devel gettext-devel curl curl-devel perl-ExtUtils-MakeMaker hg wget gcc gcc-c++


(2)下载git,并解压

wget https://www.kernel.org/pub/software/scm/git/git-2.9.0.tar.gz

tar zxvf git-2.9.0.tar.gz


(3)编译安装git

cd git-2.9.0

./configure --prefix=/usr/local/git

make && make install


(4)创建git的软连接

ln -s /usr/local/git/bin/* /usr/bin/


3、安装go环境

ngrok 是一个使用go语言编写的反向代理软件,准备go环境,系统是32位的centos,就下载386的包;系统是64位的centos,就下载amd64的包

(1)下载go的软件包

wget https://www.golangtc.com/static/go/1.9.2/go1.9.2.linux-amd64.tar.gz


(2)解压

tar -zxvf go1.9.2.linux-386.tar.gz

mv go /usr/local/


(3)go的命令需要做软连接到/usr/bin

ln -s /usr/local/go/bin/* /usr/bin/


三、服务器端安装ngrok

1、安装前准备

(1)从github 上下载源码

[root@along]# cd /usr/local/
[root@along local]# git clone https://github.com/inconshreveable/ngrok.git


(2)设置环境变量

① 临时设置,重启后无效

[root@along local]# export GOPATH=/usr/local/go
[root@along local]# export NGROK_DOMAIN="ngrok.along.top"
② 永久生效
[root@along ~]# vim ~/.bashrc



export GOROOT=/usr/local/go
export NGROK_DOMAIN=ngrok.yanlongfei.top
export GOARCH=amd64
export GOOS=linux



. ~/.bashrc 使设置生效


2、生成证书

[root@along local]# cd ngrok/
[root@along ngrok]# openssl genrsa -out rootCA.key 2048
[root@along ngrok]# openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=$NGROK_DOMAIN" -days 5000 -out rootCA.pem
[root@along ngrok]# openssl genrsa -out server.key 2048
[root@along ngrok]# openssl req -new -key server.key -subj "/CN=$NGROK_DOMAIN" -out server.csr
[root@along ngrok]# openssl x509 -req -in server.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out server.crt -days 5000


3、把证书放好位置,覆盖原本证书

[root@along ngrok]# cp rootCA.pem assets/client/tls/ngrokroot.crt
cp: overwrite 'assets/client/tls/ngrokroot.crt'? y
[root@along ngrok]# cp server.crt assets/server/tls/snakeoil.crt
cp: overwrite 'assets/server/tls/snakeoil.crt'? y
[root@along ngrok]# cp server.key assets/server/tls/snakeoil.key
cp: overwrite 'assets/server/tls/snakeoil.key'? y


4、编译安装ngrok

[root@along app]# cd /usr/local/ngrok/
[root@along app]# make release-server //如下显示,编译安装成功



bin/go-bindata -nomemcopy -pkg=assets -tags=release \
        -debug=false \
        -o=src/ngrok/client/assets/assets_release.go \
        assets/client/…
bin/go-bindata -nomemcopy -pkg=assets -tags=release \
        -debug=false \
        -o=src/ngrok/server/assets/assets_release.go \
        assets/server/…
go get -tags 'release' -d -v ngrok/…
code.google.com/p/log4go (download)
go install -tags 'release' ngrok/main/ngrokd



提示:中间可能会出现错误,我是直接成功的

① go 环境有问题

② 缺少hg包,安装即可

注意:此次编译,生成了ngrokd 的执行脚本,通过这个脚本开启ngrok 服务端的服务


5、运行测试

(1)执行脚本

① 前台运行:

/usr/local/ngrok/bin/ngrokd -domain="ngrok.along.top" -httpAddr=":8000" -httpsAddr=":443" -tunnelAddr=":4443"

② 后台运行:

setsid /usr/local/ngrok/bin/ngrokd -domain="ngrok.along.top" -httpAddr=":8000" -httpsAddr=":443" -tunnelAddr=":4443"


(2)参数说明:3个端口可随意配置(不能和现有服务端口冲突,阿里云服务器需打开对应端口)

#-domain   访问ngrok是所设置的服务地址生成证书时那个域名

#-httpAddr   http协议端口 默认为8000

#-httpsAddr   https协议端口 默认为443 (可配置https证书)

#-tunnelAddr   通道端口,默认4443

(3)注意:

所有涉及的端口,都需在阿里云上设置规则,即打开端口


四、客户端配置 和 使用证书认证连接ngrok

1、在服务器端生成客户端开启ngrok 服务的脚本

[root@along ]# cd /usr/local/ngrok/

[root@along ngrok]# make release-client



bin/go-bindata -nomemcopy -pkg=assets -tags=release \
        -debug=false \
        -o=src/ngrok/client/assets/assets_release.go \
        assets/client/…
bin/go-bindata -nomemcopy -pkg=assets -tags=release \
        -debug=false \
        -o=src/ngrok/server/assets/assets_release.go \
        assets/server/…
go get -tags 'release' -d -v ngrok/…
go install -tags 'release' ngrok/main/ngrok



注意:生成了ngrok 的脚本,在/usr/local/ngrok/bin/ngrok,把脚本拷到客户端


2、准备配置文件

vim ngrok.cfg //注意格式,前面都有2个空格,: 后有一个空格

下面是我的实例:



server_addr: "ngrok.yanlongfei.top:4443"   //注意域名一定要和服务器端一致
trust_host_root_certs: false
tunnels:
  http:    //名字自己定义
    subdomain: "ngrok"     //映射的域名前缀,根据自己喜好设置,注意需把域名解析到服务器上
    proto:
      http: 80
      
  https:
    subdomain: "ssl"
    proto:
      https: 443
      
  openvpn:
    remote_port: 5555   //映射的端口
    proto:
      tcp: 1194
    
  ssh:
    remote_port: 2222
    proto:
      tcp: 22



 

3、启动ngrok,连接服务器端

(1)启动

./ngrok -config=ngrok.cfg start http #启动web服务 ./ngrok -config=ngrok.cfg start tcp #启动tcp服务 ./ngrok -config=ngrok.cfg start http tcp #同时启动两个服务 ./ngrok -config=ngrok.cfg start-all #启动所有服务


(2)启动成功效果如下

获取 公司内网 镜像怎么弄_网络_02


4、测试

(1)通过访问映射的域名,能访问到内网的服务

获取 公司内网 镜像怎么弄_客户端_03


(2)远程ssh 连接

获取 公司内网 镜像怎么弄_网络_04


五、问题总结

1、问题1

(1)问题:go 环境出错









(2)解决方法:

前往go安装目录的bin目录下找到go-bindata,将他移动到ngrok/bin下 (没有bin,可新建一个)


2、问题2

(1)问题:客户端连接不上

客户端ngrok.cfg中server_addr后的值必须严格与-domain以及证书中的NGROK_BASE_DOMAIN相同,否则Server端就会出现如下错误日志:

[03/13/15 09:55:46] [INFO] [tun:15dd7522] New connection from 54.149.100.42:38252
[03/13/15 09:55:46] [DEBG] [tun:15dd7522] Waiting to read message
[03/13/15 09:55:46] [WARN] [tun:15dd7522] Failed to read message: remote error: bad certificate
[03/13/15 09:55:46] [DEBG] [tun:15dd7522] Closing

(2)解决办法:

① 确保生成证书时的NGROK_BASE_DOMAIN和ngrok.cfg填写的domian 域名一致。

② 在使用自签证书时ngrok.cfg中的 trust_host_root_certs为false