编译自己的ngrok服务端安装手记

星期五 下午 15:20 狂奔的蜗牛 服务器技术 12453 views
0
Comments
ngrok的强大和方便就不用说了,但是天朝把它封了。
还好它是开源的,我们可以在国内自己的vps上面搭建服务端。
下面是我参考了网上很多复杂的编译教程,很多都说的不够清楚,自己手动成功安装了一遍。
下面是详细靠谱的过程:
我的 VPS 系统是 Ubuntu 14.04.2 LTS
1.首先装必要的工具
 apt-get install build-essential golang mercurial git
2.获取 ngrok 源码
cd /root/
git clone https://github.com/inconshreveable/ngrok.git ngrok
export GOPATH=/root/ngrok/
export NGROK_DOMAIN="ngrok.test.com"
cd ngrok
提示:上面的ngrok.test.com可以是任何域名,只要你能将这个域名解析到安装了ngrokd的服务的ip上就可以。


3.修复安装包
vi /root/ngrok/src/ngrok/log/logger.go
第五行import中的 log 包,改为:log "github.com/keepeye/log4go"

4.生成域名ngrok.test.com证书
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
cp rootCA.pem assets/client/tls/ngrokroot.crt
cp device.crt assets/server/tls/snakeoil.crt 
cp device.key assets/server/tls/snakeoil.key


5.编译服务端和客户端
ngrok需要使用go编译
编译之前需要安装go和git
go要求版本是go1.4.1

git要求版本是2.10.0


注意:
不同平台使用不同的GOOS和GOARCH
Linux平台32位系统:GOOS=linux  GOARCH=386
Linux平台64位系统:GOOS=linux  GOARCH=amd64

MAC平台32位系统:GOOS=darwin  GOARCH=386
MAC平台64位系统:GOOS=darwin  GOARCH=amd64

Windows平台32位系统:GOOS=windows  GOARCH=386
Windows平台64位系统:GOOS=windows  GOARCH=amd64

ARM平台:GOOS=linux  GOARCH=arm


a.编译服务端
假设go安装目录是/usr/local/go,如果不是这个路径,根据自己情况指定go目录。
根据需要编译的目标平台情况,修改下面的GOOS和GOARCH。
下面是例子是编译运行在Linux平台64位系统上面的服务端:
cd /usr/local/go/src  
GOOS=linux GOARCH=amd64 ./make.bash    
cd /usr/local/ngrok/
GOOS=linux GOARCH=amd64 make release-server
上面make成功之后,/root/ngrok/bin/<平台>/应该会出现一个ngrokd可执行文件

b.编译客户端
根据需要编译的目标平台情况,修改下面的GOOS和GOARCH。
下面是例子是编译运行在Linux平台64位系统上面的客户端:
cd /usr/local/go/src
GOOS=linux GOARCH=amd64 ./make.bash    
cd /usr/local/ngrok/
GOOS=linux GOARCH=amd64 make release-client
上面make成功之后,/root/ngrok/bin/<平台>/应该会出现一个ngrok可执行文件

我们需要的就是ngrokd和ngrok这两个文件。可以复制到其它地方使用。

7.现在启动服务端试试:
/root/ngrok/bin/ngrokd -domain="ngrok.test.com" -httpAddr=":8000" -httpsAddr=":4433" -tunnelAddr=":4443"
如果没有报错的话,会出现以下输出:


[10:05:48 CST 2015/04/17] [INFO] (ngrok/log.(*PrefixLogger).Info:83) 
[registry] [tun] No affinity cache specified
[10:05:48 CST 2015/04/17] [INFO] (ngrok/log.(*PrefixLogger).Info:83) 
[metrics] Reporting every 30 seconds
[10:05:48 CST 2015/04/17] [INFO] (ngrok/log.Info:112) 
Listening for public http connections on [::]:8000
[10:05:48 CST 2015/04/17] [INFO] (ngrok/log.Info:112) 
Listening for public https connections on [::]:4443
[10:05:48 CST 2015/04/17] [INFO] (ngrok/log.Info:112) 
Listening for control and proxy connections on [::]:4443


现在我们来到自己电脑上,准备启动客户端。在启动之前,我们需要为客户端编写一个配置文件 ngrok.cfg 
1.执行
 vi /root/ngrok/ngrok.conf
输入下面内容:
server_addr: "ngrok.test.com:4443"
trust_host_root_certs: false
2.由于ngrok.test.com是我们自己随便写的域名,如果就这样是无法解析到服务器的,
我们需要在运行客户端的电脑上修改一下hosts文件把ngrok.test.com执行服务器ip,
由于服务端和客户端我用的是同一个vps,这里hosts规则就是:127.0.0.1 ngrok.test.com


3.然后执行下面的目录,把我们的机器的22端口暴露出去。
/root/ngrok/bin/ngrok -config=/root/ngrok/ngrok.conf  -proto=tcp 22
成功后会出现下面的内容:
Tunnel Status                 online$<2>    
Version                       1.7/1.7$<2>       
Forwarding                    tcp://ngrok.test.com:41224 -> 127.0.0.1:22                                                                       
Web Interface                 127.0.0.1:4040                                                                                                      
# Conn                        0                                                                                                                   
Avg Conn Time                 0.00ms    
注意上面的:Status 是online说明连接成功
tcp://ngrok.test.com:41224 这个很重要,就是外网其它电脑要ssh连接的信息,
ssh主机是ngrok.test.com,ssh端口是41224,这里要注意ngrok.test.com域名要
能够解析到运行了ngrokd的服务器ip上面,当然我们知道服务器ip,我们可以
通过域名解析或者修改本地hosts都可以。
后台运行可以这样:
/root/ngron/bin/ngrok -log=stdout -config=/root/ngrok/ngrok.conf -proto=tcp 22 > /dev/null  2>&1  &
4.测试暴露是否成功
ssh ubuntu@ngrok.test.com -p41224 
用户ubuntu是运行了ngrok系统上面的用户。
5.最后:
提示可以通过配置文件启动客户端,方便启动,不用每次都在期待客户端的时候输入很多参数。
ngrok 的配置文件是完全可选的非常简单 YAML 格式文件,他可以允许你使用 ngrok 一些更高级的功能,例如:
同时运行多个隧道
连接到自定义的 ngrok 服务器
调整 ngrok 一些很神秘的功能
ngrok 的配置文件默认从 ~/.ngrok 加载。你可以通过 -config 参数重写配置文件的地
下面是配置例子:

为了运行多个隧道,你需要在配置文件当中使用 tunnels 参数配置每个隧道。隧道的参数
以字典的形式配置在配置文件当中。举个例子,让我们来定义三个不同的隧道。
第一个https隧道是一个有认证的只转发 https 的隧道。
第二个ssh隧道转发我们自己机器的 22 端口以便让我可以通过隧道连接到自己的电脑。
第三个http隧道是一个没有认证的只转发 http 的隧道。
vi ngrok.cfg输入:
server_addr: "ngrok.test.com:4443"
trust_host_root_certs: false
tunnels:
  https:
    auth: "user:password"
    proto:
      https:"443"
  ssh:
    remote_port: 2222
    proto:
      tcp: "127.0.0.1:22"
  http:
    proto:
      http:"80"
    
按着上面配置好之后,就可以通过命令 ngrok -congfig=ngrok.cfg start ssh 启动了,
那么我们ssh连接ngrok.test.com的2222端口的时候会被重定向到运行了ngrok机器的22端口。
还可以转发到局域网的其它机器,写法如下:
tcp: "192.168.1.242:22"
http:"127.0.0.1:80"

客户端ngrok,我们还可以使用-hostname参数指定自己的域名(域名必须要解析到运行ngrokd的服务器上的ip),

但是端口必须是8000(因为上面启动ngrokd的时候使用的是8000端口,这里要对应上),

比如ngrok -config=ngrok.cfg -hostname="www.mydomain.com:8000" -proto=http 80
默认ngrok是前台运行的,可以通过下面的方式后台运行ngrok。
nohup ./ngrok -config /root/ngrok.conf -log stdout -log-level="INFO" -proto=tcp 80 >/tmp/ngrok.log 2>&1 &

更详细的配置说明请参考这里
ngrok 1.X 配置文档
2016/09/07 15:19:29
评论(0)
没有评论!

发表评论

引用成功取消引用×

昵称*: 邮箱*: 网址:

最多可输入300字符 验证码*:


Process: 0.053s | DB :17 queries | UseMem:2,290 kb