ngrok俗称内网穿透利器,简单说就是我们有一个服务测试运行在本地,但是外网想看看效果,这时候本地因为没有固定IP,所以就访问不了,这时候如果有ngrok出场就解决了,现在火热的微信开发、不同服务间的联调都会用到。
ngrok官网的服务因为服务器在国外,所以不是很稳定(大家懂得),而国内的很多服务不支持自定义子域名或者开始收费,正好手里有一台闲置的阿里云CES,并且ngrok的代码是开源的,所以就想自己搭建一个服务了,踩坑记录如下:
一、 安装依赖的工具或服务
1.安装golang及相关依赖
yum install build-essential golang mercurial
2.安装git服务
这里有一个坑,yum自带的git版本比较老,如果安装了,后面在编译ngrok的时候会卡住…所以只能自己下载最新的git版本编译安装:
# 先安装通用编译环境
yum install zlib-devel perl-ExtUtils-MakeMaker asciidoc xmlto
openssl-devel curl-devel
# 下载git
wget https://Github.com/Git/Git/archive/v2.3.0.tar.gz
# 解压安装包
tar -zxvf v2.3.0.tar.gz
# 编译安装
cd git-2.3.0/
./configure
make && make install
#查看是否安装成功
git —version
# 如果出来git version 2.3.0表示安装成功
# 如果命令无法识别,执行以下命令建立软连接
ln -s /usr/local/bin/git /usr/bin/
二、下载ngrok并编译
1. 准备环境
先进入到自己想安装的目录,并从github clone ngrok的项目
cd /opt
git clone https://github.com/tutumcloud/ngrok.git ngrok
cd grok
通过以下命令生成并替换源码里默认的证书,注意域名xxxx.com修改为你自己的。
NGROK_DOMAIN=“jueduizone.com"
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
2.编译服务端
sudo make release-server
如果一切正常,ngrok/bin 目录下应该有 ngrokd 文件
通过以下命令启动服务:
sudo ./bin/ngrokd -tlsKey=server.key -tlsCrt=server.crt
-domain="jueduizone.com" -httpAddr=":8081” -httpsAddr=":8082"
其中httpAddr、httpsAddr 分别是 ngrok 用来转发 http、https 服务的端口,可以随意指定。同时ngrokd 还会开一个 4443 端口用来跟客户端通讯(可通过 -tunnelAddr=”:xxx” 指定)。
这里如果你的服务器配置了iptables规则,需要对外开放使用到的端口,可以本地telnet相应的端口看是否可用,不可用可以通过以下的命令开启:
/sbin/iptables -I INPUT -p tcp --dport 8081 -j ACCEPT
/sbin/iptables -I INPUT -p tcp --dport 8082 -j ACCEPT
/sbin/iptables -I INPUT -p tcp --dport 4443 -j ACCEPT
/etc/rc.d/init.d/iptables save
/etc/rc.d/init.d/iptables restart
/etc/init.d/iptables status
接下来就是需要在自己的域名提供商那里做域名映射了,这里最好把域名泛解析到相应的服务器:
*.jueduizone.com
然后启动后,通过浏览器访问 test.jueduizone.com:8081 如果页面显示
Tunnel test.jueduizone.com:8081 not found
表示启动成功,可以用客户端连接了。
3.编译客户端
3.1 编译linux客户端
make release-client
编译后会在ngrok/bin 目录下有 ngrok 文件。
3.2 编译Mac客户端*
sudo GOOS=darwin GOARCH=amd64 make release-client
编译后会在ngrok/bin/darwin_amd64 目录下有 ngrok 文件。
3.3 编译windows客户端
sudo GOOS=windows GOARCH=amd64 make release-client
编译后会在ngrok/bin/windows_amd64 目录下有 ngrok.exe 文件。
4.运行测试客户端
将以上的不同系统版本的客户端下载到相应系统后,同一目录新增配置文件ngrok.cfg:
server_addr: jueduizone.com:4443
trust_host_root_certs: false
Mac上执行客户端
映射本地8080端口,自定义子域名test,通过终端执行以下命令:
./ngrok -subdomain test -config=ngrok.cfg 8080
Windows上执行客户端:
映射本地8090端口,自定义子域名test,通过DOS界面进入grok客户端的相应目录:
ngrok -config=ngrok.cfg -subdomain=test 8080
如果连接成功,会出现大概以下内容:
ngrok (Ctrl+C to quit)
Tunnel Status online
Version 1.7/1.7
Forwarding http://test.jueduizone.com:8081 -> 127.0.0.1:8080
Forwarding https://test.jueduizone.com:8082 -> 127.0.0.1:8080
Web Interface 127.0.0.1:4040
# Conn 0
Avg Conn Time 0.00ms
这样通过访问 test.jueduizone.com:8081 即可访问到本地的8080端口上的服务。
学习参考链接:imququ.com/post/self-h…
END