CentOS6 搭建自己的 ngrok 服务

2,185 阅读3分钟
原文链接: todoright.com

  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