搭建内网映射服务

一、ngrok介绍及场景应用

1、介绍

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

  ngrok 是一个反向代理,通过在公共的端点和本地运行的 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)启动成功效果如下

 

4、测试

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

 

(2)远程ssh 连接

  

五、问题总结

1、问题1

(1)问题:go 环境出错

    GOOS="" GOARCH="" go get github.com/jteeuwen/go-bindata/go-bindata

      bin/go-bindata -nomemcopy -pkg=assets -tags=release \

-debug=false \

-o=src/ngrok/client/assets/assets_release.go \

assets/client/...

    make: bin/go-bindata: Command not found

   make: * [client-assets] Error 127

 

(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

 

posted @ 2018-01-30 13:41  alonghub  阅读(2445)  评论(0编辑  收藏  举报