用自己的vps搭建ngrok及使用

用自己的vps搭建ngrok及使用

摘要

用自己的vps搭建ngrok及使用

场景

本地搭建的demo服务,暂时没有外网服务器。想让别人访问。
微信开发需要把本地的服务公开到外网。
在自己电脑上搭建博客,让别人访问,,,

软件环境

ubuntu 14.04 x64 (bwg 512M 9.99$ -仅供测试,可能一段时间后被删除)

ngrok1.x 提供的服务很像花生壳
我们的vps上搭建的ngrok服务器就是代替花生壳服务器的功能。

自己都有vps了,当然可以直接把想要公开的服务放在vps。
这里再麻烦一步,通过ngrok服务器中转,其实是为了做个公共服务,让那些没有vps的同学只在自己电脑上部署就能让全世界访问到了。

ngrok

把本地的服务公布到外网。
由于种种原因,ngrok.com已经无法访问了。所以这里介绍的是如何用自己的域名搭建ngrok服务。
注意现在只有1.x版本 是开源的,所以ngrok的服务器端和客户端都要用1.x进行编译。

基于ubuntu 14.04 x64
闲置域名是ggss.cc

配置过程

服务器端证书制作 for ngrok

假设操作目录是 /root
ggss.cc 是我自己的域名,可以用来测试。
记得在域名解析处添加A记录 * , @ 都为当前服务器的IP

NGROK_DOMAIN="ggss.cc"

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

编译ngrok服务器端

sudo apt-get update
sudo apt-get install build-essential golang mercurial git
git clone https://github.com/inconshreveable/ngrok.git ngrok
cd ngrok
NGROK_DOMAIN="ggss.cc"

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

cp base.pem assets/client/tls/ngrokroot.crt
sudo make release-server

运行ngrok服务器端

cd /root/ngrok
sudo nohup ./bin/ngrokd -tlsKey=server.key -tlsCrt=server.crt -domain="ggss.cc" -httpAddr=":8081" -httpsAddr=":8082" >/dev/null 2>&1 &

编译客户端

准备工作,安装go运行环境
golang下载地址 https://golang.org/dl/

cd /root
wget https://storage.googleapis.com/golang/go1.5.2.linux-amd64.tar.gz
tar -zxvf  go1.5.2.linux-amd64.tar.gz
vi /etc/profile

最后追加两行
export GOROOT=/root/go
export PATH=$GOROOT/bin:$PATH

使环境变量生效
. /etc/profile

开始编译

安装make命令
apt-get install build-essential
cd /root/ngrok/
git clone https://github.com/inconshreveable/ngrok.git ngrok
cd /root/ngrok/ngrok
cp  /root/ngrok/base.pem assets/client/tls/ngrokroot.crt 
vi src/ngrok/log/logger.go
第4行import中的 log 包改为github上引用 //是注释
log "github.com/keepeye/log4go"

执行编译命令,编译linux64位下使用的客户端
cd /root/ngrok/ngrok
GOOS=linux GOARCH=amd64 make release-client
生成的位置是 /root/ngrok/ngrok/bin/ngrok


编译windows 64下使用的客户端
cd /root/ngrok/ngrok
GOOS=windows GOARCH=amd64 make release-client
生成的位置是 /root/ngrok/ngrok/bin/windows_amd64/ngrok.exe

如何使用ngrok

ngrok客户端下载到本地后

ngrok客户端文件同目录,创建一个配置文件 ngrok.conf
内容如下

server_addr: ggss.cc:4443
trust_host_root_certs: false

启动

./ngrok -config=ngrok.conf 8080

表示 把本地端口为8080的服务公布出去,生成一个二级域名随机的域名。

这样别人访问类似 http://68097182.ggss.cc:8081 就是访问你电脑的上的8080服务了。
可以通过subdomain参数指定二级域名,而不是随机生成。
./ngrok -config=ngrok.conf -subdomain daodao 8080  其中daodao是指定的二级域名

启动本地的tomcat 8080,通过上面的域名就可以访问tomcat8080了。

另外如果访问127.0.0.1:4040,还能看到外部请求进来的请求详情。

为什么服务器端设置的是8081,而没用80呢?
因为种种原因,80端口会被堵死。。。

客户端下载

已经生成好的客户端下载地址
http://pan.baidu.com/s/1o7QIqfS