奇客の遊園地

Log@X.X.B

内网穿透神器-ngrok,自建ngrok服务器 | 沛哥博客

最近想用树莓派2搭建一个WEB服务器,但身处的网络环境让人堪忧,移动网络,无外网IP,而且树莓派又与无线路由相连,被囚禁与内网中的内网里,如何解救呢?花生壳?NO-IP?各种DDNS?最终都以失败告终,而且要想绑定自己的顶级域名,还得付费使用…

在V2EX中发现了一个内网穿透神器-ngrok,ngrok官方提供的服务貌似被墙掉,还好天朝的子民们不傻,自建了一个国内的ngrok服务器,原文地址:https://www.v2ex.com/t/148279,试了一下,很顺利的通过外网访问到了树莓派的WEB服务,因为只能使用作者提供的二级域名,所以想自己搭建一个服务,使用自己的域名即可。

要搭建自己的ngrok服务,需要一台VPS以及一个外网IP,本人手里闲置的VPS太多,xvmlabs的7IP VPS买来就闲置了大半年,ping了一下稳定性还不错,准备在这上面搭建。

本人选的是Ubuntu 14.04 x86的系统,CentOS的系统也尝试过,编译容易报错,解决起来相对复杂。

安装步骤

1.更新下资源列表

2.安装build工具,Go开发环境,mercurial测试工具,以及git

sudo apt-get install build-essential golang mercurial git

3.下载ngrok资源包并进入ngrok目录

git clone https://github.com/inconshreveable/ngrok.git ngrok  cd ngrok

4.生成自签名SSL证书,findhao.com替换为你自己的域名

openssl genrsa -out base.key 2048  openssl req -new -x509 -nodes -key base.key -days 10000 -subj "/CN=findhao.com" -out base.pem  openssl genrsa -out server.key 2048  openssl req -new -key server.key -subj "/CN=findhao.com" -out server.csr  openssl x509 -req -in server.csr -CA base.pem -CAkey base.key -CAcreateserial -days 10000 -out server.crt

5.会生成6个文件:

base.key  base.pem  base.srl  server.crt  server.csr  server.key  

6.将原始的ngrokroot.crt替换为生成的crt文件

cp base.pem assets/client/tls/ngrokroot.crt

7.开始编译(注意:小内存VPS编译过程中会报错,建议使用512M以上内存的VPS)

make release-server release-client

编译无报错的话,会生成bin目录,里面包含3个文件,其中ngrokd为服务端文件,ngrok为客户端文件

bin

因为树莓派是基于arm架构的系统,所以还得编译一份arm的ngrok文件

进入go编译器

设置编译类型

GOOS=linux GOARCH=arm CGO_ENABLED=0 ./make.bash

回到ngrok目录

再次编译

GOOS=linux GOARCH=arm make release-server release-client

这样bin文件夹多了linux_arm文件夹,里面就是编译好了的arm版ngrokd和ngrok

linuxarm

8.设置域名解析

把域名解析到VPS上,如果你只需要主机记录@和www,直接设置A记录把他们解析到VPS的IP上,如果需要很多二级域名的话,可以直接把*解析到IP上

9.服务端启动

给权限

chmod +x /root/ngrok/bin/ngrokd

启动服务,注意ngrokd的路径以及key和crt的路径,domain填写自己的域名,http及https端口按实际情况修改

/root/ngrok/bin/ngrokd -tlsKey=/root/ngrok/server.key -tlsCrt=/root/ngrok/server.crt -domain="findhao.com" -httpAddr=":80" -httpsAddr=":443"

这样就算启动成功了

ngrokd

10.客户端启动

将服务器端的ngrok文件(/root/ngrok/bin/linux_arm里)复制到树莓派中,我复制到了root里,同样给权限

然后新建一个ngrok.cfg文件,编辑以下内容并保存(域名换成你自己的)

server_addr: findhao.com:4443  trust_host_root_certs: false  

ngrok

启动连接,www替换为你要绑定的二级域名-config设置配置文件的路径,80为WEB服务端口

./ngrok -subdomain www -config=ngrok.cfg 80

成功连接ngrok服务器后会显示online

online

然后打开下面的地址http或者https(自签的SSL证书浏览器不信任),就可以访问树莓派的WEB内容啦

tunnel

注意,客户端必须使用自己编译的ngrok文件,否则就会出现bad certificate错误,这个问题之前一直困扰我,因为我使用的是官方下载的ngrok

附:设置开机自动启动ngrok服务

服务器端:

复制启动命令保存为ngrok_start文件

/root/ngrok/bin/ngrokd -tlsKey=/root/ngrok/server.key -tlsCrt=/root/ngrok/server.crt -domain="findhao.com" -httpAddr=":80" -httpsAddr=":443"  

放到/etc/init.d目录下

设置文件权限:

sudo chmod 755 /etc/init.d/ngrok_start

将上述脚本放到启动脚本里:

cd /etc/init.d  sudo update-rc.d ngrok_start defaults 20

重启后就会自动启动服务了,同理可设置客户端自启动。

附卸载启动脚本方法:

cd /etc/init.d  sudo update-rc.d -f ngrok_start remove

参考文章:http://www.svenbit.com/2014/09/run-ngrok-on-your-own-server/

一键获取startssl.com免费SSL证书 arrow-right
Next post

arrow-left 树莓派教程:利用 Ngrok 穿透内网访问树莓派 - 劼墨誌
Previous post