CentOS 下面自己编译NGROK服务端

本文转载自狂奔的蜗牛的博客

ngrok首先你如果懒完全可以用他们提供的临时服务,比如NGROK的官网

下面是我参考了网上很多复杂的编译教程,很多都说的不够清楚,自己手动成功安装了一遍。
下面是详细靠谱的过程:
我的 VPS 系统是 Centos 6.8,国外的小鸡

  • 首先装必要的工具
    自行安装git golang 等。。。配置好golang编译环境
  • 获取 ngrok 源码
cd /root/
git clone https://github.com/inconshreveable/ngrok.git 
export NGROK_DOMAIN="ngrok.test.com" #这里的域名可以是你的域名,也可以是泛域名,但不匹配通配符
cd ngrok

提示:上面的ngrok.test.com可以是任何域名,只要你能将这个域名解析到安装了ngrokd的服务的ip上就可以。友情提示你最好解析一个泛二级域名到你准备部署的VPS上,比如*.ngrok.qdwy.tech

  • 修复安装包(国外VPS不需要)
vi /root/ngrok/src/ngrok/log/logger.go

第五行import中的 log 包,改为:log “github.com/keepeye/log4go”

  • 生成域名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
  • 编译服务端和客户端
    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
  • 编译服务端
    假设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可执行文件

  • 编译客户端
    根据需要编译的目标平台情况,修改下面的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这两个文件。可以复制到其它地方使用。

  • 现在启动服务端试试:
/root/ngrok/bin/ngrokd -domain="ngrok.test.com" -httpAddr=":8000" -httpsAddr=":4433" -tunnelAddr=":4443"

特别注意:httpAddr指的是你的ngrok服务端的http监听地址,和客户端没有任何关系,你要转发到客户端的端口是在客户端设置的,这个就表示要监听8000端口,至于要转发到客户端的什么端口,请继续往下看。
如果没有报错的话,会出现以下输出:

[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

  • 执行
    vi /root/ngrok/ngrok.conf

输入下面内容:

server_addr: "ngrok.test.com:4443"
trust_host_root_certs: false
  • 然后执行下面的目录,把我们的机器的22端口暴露出去。
.\ngrok.exe -config=ngrok.cfg -subdomain=domain002 8080
#config 是配置文件路径名'
#subdomain 是泛域名的前缀,如果你使用的话,比如你的NGROK_DOMAIN是ngrok.test.com,subdomain为domain001,那么你最后需要访问的完整域名为domain001.ngrok.test.com
#8080是你需要映射的本地端口

特别注意,你的本地端口是什么和客户端没有任何关系,哪怕你需要映射本地的9000端口,服务器端也只会监听8000端口,所以你完全可以监听服务器的80端口再映射到本地的8080端口
成功后会出现下面的内容:

Tunnel Status                 online$    
Version                       1.7/1.7$       
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都可以。

  • 测试暴露是否成功
  1. [email protected] -p 41224

用户ubuntu是运行了ngrok系统上面的用户。

  • 最后:
    提示可以通过配置文件启动客户端,方便启动,不用每次都在期待客户端的时候输入很多参数。

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 &

Tips:

  • 后台运行ngrok
yum install screen
screen ngork
./ngrokd .... #这里是你要运行的命令,不要完全照抄
Alt + A 然后按 D
退出screen此时ngrokd server正常运行
  • 如果服务端80端口被占用,但是还是想映射到80端口怎么办,答案是nginx,由NGINX监听80端口,遇到ngrok网址转发到别的端口,比如8000,然后8000映射到本地的端口,附NGINX配置转发策略
    upstream ngrok{
        server 127.0.0.1:8000;
    }
    server {
        listen       80;
        server_name  *.ngrok.cointech.tk;
        access_log /home/wwwlogs/ngrok.access.log;
        error_log /home/wwwlogs/ngrok.error.log;
    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host  $http_host:8000;
        proxy_set_header X-Nginx-Proxy true;
        proxy_set_header Connection "";
        proxy_pass http://ngrok;
    }
}

to be continued

上一篇
下一篇