自建Ngrok服務與使用方法

ngrok 是一個反向代理,通過在公共的端點和本地運行的 Web 服務器之間建立一個安全的通道。ngrok 可捕獲和分析所有通道上的流量,便於後期分析和重放。可以被使用來進行微信藉口的本地調試。在ngrok被牆之後,我們需要通過ngrok開源的源碼自行搭建ngrok服務。具體步驟如下:

一、在服務器上安裝配置go開發環境

  Ngrok是由go語言開發的,需要編譯golang1.1以上的版本,所以首先要在服務器上安裝配置go開發環境。

     【以下步驟實驗於CentOS 6.5 系統中,ubuntu中也可使用ap-get來完成安裝】

  1.安裝mercurial包 (分佈式版本控制系統):

    yum install mercurial

        (可以通過hg version測試是否安裝成功)

    可能出現的錯誤:

    --> Running transaction check
    ---> Package mercurial.x86_64 0:2.2.2-1.el5.rf will be installed
    --> Processing Dependency: python(abi) = 2.4 for package: mercurial-2.2.2-1.el5.rf.x86_64
    --> Finished Dependency Resolution
    Error: Package: mercurial-2.2.2-1.el5.rf.x86_64 (rpmforge)
    Requires: python(abi) = 2.4
    Installed: python-2.6.6-52.el6.x86_64 (@updates)
    python(abi) = 2.6
    Available: python-2.6.6-64.el6.x86_64 (base)
    python(abi) = 2.6
    You could try using --skip-broken to work around the problem
    You could try running: rpm -Va --nofiles --nodigest

    解決方法:

    01.[saas@test ]# su

    02.[root@test ]# wget http://packages.sw.be/rpmforge-release/rpmforge-release-0.5.2-2.el6.rf.x86_64.rpm

    03.[root@test ]# rpm -Uvh rpmforge-release-0.5.2-2.el6.rf.x86_64.rpm

    04.[root@test ]# yum clean all

    05.[root@test ]# yum update

        06.[root@test ]# yum install mercurial

  2.安裝git包:

    yum install git

  3.安裝gcc:

            yum install gcc

  4.下載golang穩定版本的壓縮包(建議在usr/local文件夾):

    前往golang中國下載 go1.4rc2.linux-amd64.tar.gz

            http://www.golangtc.com/download

  5.解壓壓縮包(使用tar指令):

     tar -zxvf go1.4rc2.linux-amd64.tar.gz

  6.添加環境變量:

            vi /etc/profile

            在profile中添加:

                   export GOROOT=go的安裝目錄

                   export GOBIN=$GOROOT/bin

                   export PATH=$PATH:$GOBIN

    如下:

      # Add golang eviroment
      export GOROOT=/usr/local/go
      export GOBIN=$GOROOT/bin
      export PATH=$PATH:$GOBIN

    並刷新環境變量

    source /etc/profile

  7.測試是否安裝成功:

         go version

二、在服務器上搭建Ngrok服務

  1.下載ngrok源碼:

            git clone https://github.com/inconshreveable/ngrok.git

      2.在go目錄解壓ngrok源碼

           *.tar 用 tar –xvf 解壓 
           *.gz 用 gzip -d或者gunzip 解壓 
           *.tar.gz和*.tgz 用 tar –xzf 解壓 
           *.bz2 用 bzip2 -d或者用bunzip2 解壓 
           *.tar.bz2用tar –xjf 解壓 
           *.Z 用 uncompress 解壓 
           *.tar.Z 用tar –xZf 解壓 
           *.rar 用 unrar e解壓 
           *.zip 用 unzip 解壓

      3.在ngrok目錄生成自簽名證書

         在使用官方提供的ngrok服務時我們可以使用官方的證書,而當我們使用自己搭建的ngrok服務時則需要自生成一份證書。

         在自生成證書時需要一個解析到服務器上的主域名,現在以”abc.com”爲例。

         (建議將域名泛解析到服務器上,方便讓不同的本地服務通過不同的二級域名進行轉發)

           openssl genrsa -out rootCA.key 2048

           openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=abc.com" -days 5000 -out rootCA.pem

           openssl genrsa -out device.key 2048

           openssl req -new -key device.key -subj "/CN=abc.com" -out device.csr

           openssl x509 -req -in device.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out device.crt -days 5000

      4.將新生成的證書,替換掉assets/client/tls下的證書

          cp rootCA.pem assets/client/tls/ngrokroot.crt
          cp device.crt assets/server/tls/snakeoil.crt
          cp device.key assets/server/tls/snakeoil.key

三:編譯生成ngrokd(服務端)

         maker release-server

         在編譯過程中有可能出現如下情況: 

         1.

    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

      解決方法:前往$GOBIN (cd $GOBIN) 找到go-bindata,將他移動到ngrok/bin下 (沒有bin,可新建一個)    

         2.

         package code.google.com/p/log4go: Get https://code.google.com/p/log4go/source/checkout?repo=: dial tcp 216.58.197.110:443: i/o timeout

         因爲google被牆,如果服務器不在牆外或者沒有FQ則無法訪問到code.google.com.

         解決方法:在 ngrok/src/ngrok/log 目錄下找到 logger.go 文件,修改其中第4或5行的:

            log "code.google.com/p/log4go”爲

            log "github.com/keepeye/log4go"  

        3.

         有時候在服務器上會出現下載速度極慢的情況,同時go get並不會顯示進度條,所以需要耐心等待。 我在編譯的時候,服務器上的速度慢得令人髮指,在本機(OS X 10.10.1)中有一份已完成編譯的ngrok,所以我嘗試在本地已完成編譯的ngrok中找到ngrok/src文件夾找到服務器中編譯時卡頓的文件直接拷貝了一份上傳服務器,再執行make編譯後成功生成了ngrok執行文件。

 

         解決方法:先清空ngrok下src文件夾,博客園上傳的文件中有個ngrok_src壓縮文件解壓放到src文件夾,再執行make release-server編譯後成功生成了ngrok執行文件。

 

         若一切順利,可以在ngrok/bin/ 文件夾下看到一個 ngrok 文件。

         若是沒有找到可以前往$GOBIN中找到。

         這樣服務器端程序就已經生成了,可以指定證書,域名,端口號來啓動

            ./bin/ngrokd -tlsKey=device.key -tlsCrt=device.crt -domain="muxkou.com" -httpAddr=":8081" -httpsAddr=":8082" -tunnelAddr=":443"

            出現如下顯示則說明服務已開啓:

            [12/28/15 10:46:19] [INFO] [registry] [tun] No affinity cache specified

            [12/28/15 10:46:19] [INFO] [metrics] Reporting every 30 seconds

            [12/28/15 10:46:20] [INFO] Listening for public http connections on 0.0.0.0:8081

            [12/28/15 10:46:20] [INFO] Listening for public https connections on 0.0.0.0:8082

            [12/28/15 10:46:20] [INFO] Listening for control and proxy connections on 0.0.0.0:443

四:編譯生成ngrok(客戶端)

            ctrl+C 關閉ngrokd

            在生成客戶端的可執行文件時,要利用golang的跨平臺交叉編譯針對不同的系統生成不同的可執行文件。      

            1.生成go跨平添編輯工具

              (1)若是客戶端使用與服務器相同系統可直接使用 make release-client指令。

              (2)若是不同系統,則需要通過go中的make.bash手工編譯出跨編譯工具。

              在$GOROOT/src目錄下找到make.bash文件

              通過設置GOOS和GOARCH來完成生成跨編譯工具:

              例如:

                MAC OSX: sudo GOOS=darwin GOARCH=amd64 ./make.bash

                Windows: sudo GOOS=Windows GOARCH=386 ./make.bash

                 生成的工具可以在 $GOROOT/pkg/tool中找到      

           2.生成ngrok可執行文件

            在ngrok目錄下使用

            GOOS=darwin GOARCH=amd64 make release-client

            GOOS=windows GOARCH=386 make release-client

            在ngrok/bin 或$GOBIN 中找到darwin_amd64或windwos_386文件夾。在其中可以找到ngrok或ngrok.exe 對應系統的可執行文件。     

          3.將ngrok文件下載到客戶端PC(內網),同時寫一個配置文件:ngrok.cfg

            server_addr: "abc.com:443"

            trust_host_root_certs: false

            【其中abc.com爲主域名,443爲開啓服務時的tunnelAddr端口(若沒有設置,默認爲4443端口)】       

         4.在客戶端啓動ngrok:

            ngrok -subdomain=test -config=ngrok.cfg 80

            【80爲想要暴露的端口】

            若Tunnel status顯示online則表示隧道已打通:

            Tunnel Status                 online                                                         

            Version                         1.7/1.7                                                        

            Forwarding                    http://test.muxkou.com:8081 -> 127.0.0.1:80                    

            Forwarding                    https://test.muxkou.com:8081 -> 127.0.0.1:80                   

            Web Interface                 127.0.0.1:4040                                                 

            # Conn                        0                                                              

            Avg Conn Time                 0.00ms   

            此時可以再公網通過 http://test.abc.com:8081 訪問到內網PC

            可以進入Web Interface顯示的127.0.0.1:4040 查看日誌                            

         5.若出現 bad certificate 的錯誤:

            1. 確保生成證書時的NGROK_BASE_DOMAIN和ngrok.cfg填寫的domian一致。

            2.在使用自簽證書時ngrok.cfg中的 trust_host_root_certs爲false

        6.使用80端口:

            http://mp.weixin.qq.com/wiki/home/index.html 中可以看到公衆平臺接口調用僅支持80端口。

            所以若要通過ngrok服務完成微信公衆號的調試,則需要使用80端口,修改ngrokd啓動指令如下:

            ./bin/ngrokd -tlsKey=device.key -tlsCrt=device.crt -domain="muxkou.com" -httpAddr=":80" -httpsAddr=":8082" -tunnelAddr=":443"

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章