一、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 open: 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