about 1 results (0.01 seconds)

搭建Ngrok服务实现内网穿透

by LauCyun Sep 5,2017 17:08:11 21,545 views

最近,在家里部署了几台服务器,然后在路由器中设置了外网到内网的端口映射表,来实现内网穿透。每重启路由器IP就变化,而且解析也巨慢,实在忍受不了,后来就发现了Ngrok神器,其原理如图1。用了一段时间后,发现国内访问该网站提供的服务相当不稳定,经常连接不上,出于什么原因,你懂得。虽然国内有不少第三方的ngrok服务提供,如natapp、花生壳,但不敢确定它们的稳定性。


图1 Ngrok原理图(来源:ngrok.com

好在ngrok是开源的,我们可以去Github上下载它的源码,在自己的外网服务器上搭建这样一个服务。

源码地址:https://github.com/inconshreveable/ngrok

下面,我们开始搭建ngrok服务。

1 环境

搭建ngrok服务需要有一台公网服务器及一个域名解析到外网服务器上。

环境:

  • 服务器:Ubuntu 16.04
  • 域   名:tunnel.cloud.laucyun.com

新建两个A记录,把域名解析到服务器上,用来关联ngrok服务。如:建立tunnel.cloud.laucyun.com*.tunnel.cloud.laucyun.com解析到服务器上。

2 编译环境

ngrok是基于go语言开发的,所以需要安装go语言开发环境,安装必要的工具如下:

$ sudo apt-get install build-essential golang mercurial git -y

安装完成之后,先检查go环境是否安装成功,执行go version看到如下信息,证明安装成功:

$ go version
go version go1.6.2 linux/amd64

创建/opt/ngrok/目录,然后下载ngrok源码:

$ mkdir -p /opt/ngrok/
$ sudo git clone https://github.com/inconshreveable/ngrok.git /opt/ngrok/

生成并替换源码里默认的证书,注意域名修改为你自己的。之后编译出来的服务端客户端会基于这个证书来加密通讯,保证了安全性。

NGROK_DOMAIN="tunnel.cloud.laucyun.com"

openssl genrsa -out rootCA.key 2048
openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=$NGROK_DOMAIN" -days 5000 -out rootCA.pem
openssl genrsa -out device.key 2048
openssl req -new -key device.key -subj "/CN=$NGROK_DOMAIN" -out device.csr
openssl x509 -req -in device.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out device.crt -days 5000

把生成的证书拷贝到相应的目录,如下:

$ cp rootCA.pem /opt/ngrok/assets/client/tls/ngrokroot.crt
$ cp device.crt /opt/ngrok/assets/client/tls/snakeoilca.crt
$ cp device.crt /opt/ngrok/assets/server/tls/snakeoil.crt
$ cp device.key /opt/ngrok/assets/server/tls/snakeoil.key

3 服务端

编译:

$ cd /opt/ngrok/ && make release-server

如果一切正常,/opt/ngrok/bin目录下应该有ngrokd可执行文件,ngrokd就是服务端程序了,指定域名和端口启动它:

$ sudo /opt/ngrok/bin/ngrokd -domain="tunnel.cloud.laucyun.com" -httpAddr=":80" -httpsAddr=":443" -tunnelAddr=":4443"

到这一步,ngrok服务已经跑起来了,可以通过屏幕上显示的日志查看更多信息。httpAddr、httpsAddr、tunnelAddr分别是ngrok用来转发http、https、隧道服务的端口,可以随意指定。如果你配置了iptables规则,需要放行这三个端口上的TCP协议。

现在,通过http://tunnel.cloud.laucyun.comhttps://tunnel.cloud.laucyun.com就可以访问到ngrok提供的转发服务。随便访问一个子域,可以看到这样一行提示:

Tunnel tunnel.cloud.laucyun.com not found

这说明万事俱备,只差客户端来连了。

4 客户端

编译:

$ cd /opt/ngrok/ && make release-client

如果一切正常,/opt/ngrok/bin目录下应该有ngrok可执行文件,ngrok就是客户端程序了。

写一个简单的配置文件,随意命名如ngrok.yml

server_addr: tunnel.cloud.laucyun.com:4443
trust_host_root_certs: false

指定子域、要转发的协议和端口,以及配置文件,运行客户端:

$ /opt/ngrok/bin/ngrok -config=/opt/ngrok/ngrok.yml -proto=tcp 22

如果出现以下界面,这说明已经成功连上远端服务了:


图2 客户端连接成功

好了现在就可以访问到内网服务器192.168.100.106的ssh服务了。

...

Tags Read More..