【Linux(CentOS7)下應用的安裝部署】:七、自己搭建Ngrok服務

一、ngrok簡介及作用

ngrok 可捕獲和分析所有通道上的流量,便於後期分析和重放。

  • 代替“花生殼”

“花生殼”是一款老牌的內網穿透軟件,免費版的“花生殼”穩定性較差,隔三差五的不能訪問。ngrok是一款免費開源的軟件,穩定性極強,我曾做過測試,將ngrok客戶端所在計算機的網絡斷開一陣子,再連接另一個網絡,ngrok很快會自動重連,幾乎不受影響。

  • 用於對處在內網環境中,無外網IP的計算機的遠程連接

ngrok可以做TCP端口轉發,對於Linux可以將其映射到22端口進行SSH連接。Windows的遠程桌面可以將其映射到3389端口來實現。同理,如果要做MySQL的遠程連接,只需映射3306端口即可。

  • 用作臨時搭建網站並分配二級域名,可用作微信二次開發的本地調試

微信公衆平臺二次開發時,服務器必須要能通過外網訪問,而且必須是80接口。我們一般會在自己的電腦上寫代碼,但是由於電信運營商將80端口屏蔽了,甚至很多人通過無線路由器上網,根本就沒有公網ip。在這種情況下,我們每次都要上傳代碼到服務器對微信公衆平臺進行接口調試,十分的不方便。而ngro可以將內網映射到一個公網地址,這樣就完美的解決了我們的問題。

ngrok官方爲我們免費提供了一個服務器,我們只需要下載ngrok客戶端即可正常使用,但是後來官方的服務越來越慢,直到ngrok官網被完全屏蔽。現在我們已經無法使用ngrok官方的服務器了。所以,接下來我們自行搭建屬於自己的ngrok服務器,爲自己提供方便快捷又穩定的服務,一勞永逸。

二、環境準備

以我的阿里雲ECS爲例,操作系統爲CentOS7(64位)。
域名:將一個域名或二級域名泛解析到VPS服務器上。
例如將(你的域名)*.tunnel.mytest.net解析到VPS的IP。
要注意,此時還需要將(你的域名)tunnel.mytest.net的A記錄設置爲VPS的IP。


解析 * 不能少

1、安裝git

#安裝git
yum install git
#注意git版本應大於1.7.9.5

源碼編譯安裝請參考:http://my.oschina.net/dingdayu/blog/657538

2、配置go環境

下載並解壓

#下載go源碼包:version不要太老
wget https://storage.googleapis.com/golang/go1.7.linux-amd64.tar.gz
#解壓到/usr/local/
tar -C /usr/local/ -zxf go1.7.linux-amd64.tar.gz

可從後面的鏈接中下載新的版本:https://golang.org/dl/

添加環境變量

#打開/etc/profile
#配置profile
vim /etc/profile

在最後面添加:

#添加下面兩行代碼
export GOROOT=/usr/local/go
export PATH=$GOROOT/bin:$PATH

export NGROK_DOMAIN="(你的域名)tunnel.mytest.net"

保存並退出,然後編譯/etc/profile文件,使之前的配置生效

#編譯profile
source /etc/profile

查看go環境是否配置成功

#查看go環境是否配置成功
#顯示go version go1.4.2 linux/amd64則說明go環境配成功
#
go version

 

 

三、準備編譯Ngrok

1、下載Ngrok源碼包

#下載ngrok源碼包
cd ~
git clone https://github.com/inconshreveable/ngrok.git
cd ngrok/

2、爲Base域名生成自簽名證書

ngrok需要一個域名作爲base域名,ngrok會爲客戶端分配base域名的子域名。例如:ngrok的base域名爲tunnel.mytest.net,客戶端即可被分配子域名test.tunnel.mydomain.com。

使用ngrok官方服務時,base域名是ngrok.com,並且使用默認的SSL證書。現在自建ngrok服務器,所以需要重新爲自己的base域名生成證書。

#爲base域名tunnel.mydomain.com生成證書
openssl genrsa -out rootCA.key 2048
openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=(你的域名)tunnel.mytest.net" -days 5000 -out rootCA.pem
openssl genrsa -out device.key 2048
openssl req -new -key device.key -subj "/CN=(你的域名)tunnel.mytest.net" -out device.csr
openssl x509 -req -in device.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out device.crt -days 5000

一定要注意對應的base域名

執行完上述命令,正常情況下,該目錄會多出device.crt、device.csr、device.key、rootCA.key、rootCA.pem、rootCA.srl六個文件,用它們來替換默認的證書文件即可。默認的證書文件在“./assets/client/tls”和“./assets/server/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

 

四、開始編譯ngrok

1、編譯服務器端ngrokd

ngrokd就是ngrok服務器端,默認編譯爲Linux的執行文件,我們的VPS本身就是Linux的,所以直接make編譯就好。

#編譯ngrokd(服務器端)
make release-server

顯示下面的內容則表示編譯成功:

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/...
bin/go-bindata -nomemcopy -pkg=assets -tags=release \
	-debug=false \
	-o=src/ngrok/server/assets/assets_release.go \
	assets/server/...
go get -tags 'release' -d -v ngrok/...
github.com/inconshreveable/mousetrap (download)
github.com/rcrowley/go-metrics (download)
Fetching https://gopkg.in/inconshreveable/go-update.v0?go-get=1
Parsing meta tags from https://gopkg.in/inconshreveable/go-update.v0?go-get=1 (status code 200)
get "gopkg.in/inconshreveable/go-update.v0": found meta tag main.metaImport{Prefix:"gopkg.in/inconshreveable/go-update.v0", VCS:"git", RepoRoot:"https://gopkg.in/inconshreveable/go-update.v0"} at https://gopkg.in/inconshreveable/go-update.v0?go-get=1
gopkg.in/inconshreveable/go-update.v0 (download)
github.com/kardianos/osext (download)
github.com/kr/binarydist (download)
Fetching https://gopkg.in/inconshreveable/go-update.v0/check?go-get=1
Parsing meta tags from https://gopkg.in/inconshreveable/go-update.v0/check?go-get=1 (status code 200)
get "gopkg.in/inconshreveable/go-update.v0/check": found meta tag main.metaImport{Prefix:"gopkg.in/inconshreveable/go-update.v0", VCS:"git", RepoRoot:"https://gopkg.in/inconshreveable/go-update.v0"} at https://gopkg.in/inconshreveable/go-update.v0/check?go-get=1
get "gopkg.in/inconshreveable/go-update.v0/check": verifying non-authoritative meta tag
Fetching https://gopkg.in/inconshreveable/go-update.v0?go-get=1
Parsing meta tags from https://gopkg.in/inconshreveable/go-update.v0?go-get=1 (status code 200)
Fetching https://gopkg.in/yaml.v1?go-get=1
Parsing meta tags from https://gopkg.in/yaml.v1?go-get=1 (status code 200)
get "gopkg.in/yaml.v1": found meta tag main.metaImport{Prefix:"gopkg.in/yaml.v1", VCS:"git", RepoRoot:"https://gopkg.in/yaml.v1"} at https://gopkg.in/yaml.v1?go-get=1
gopkg.in/yaml.v1 (download)
github.com/inconshreveable/go-vhost (download)
github.com/alecthomas/log4go (download)
github.com/nsf/termbox-go (download)
github.com/mattn/go-runewidth (download)
github.com/gorilla/websocket (download)
go install -tags 'release' ngrok/main/ngrokd

查看截圖

我們可以在./bin/目錄中找到文件ngrokd。可以先運行測試一下。

#執行ngrokd
#
./bin/ngrokd -domain="(你的域名)tunnel.mytest.net" -httpAddr=":8080"

出現類似以下內容,則說明我們的服務器端ngrokd正常運行了。

[23:18:27 CST 2016/08/23] [INFO] (ngrok/log.(*PrefixLogger).Info:83) [registry] [tun] No affinity cache specified
[23:18:27 CST 2016/08/23] [INFO] (ngrok/log.Info:112) Listening for public http connections on [::]:8080
[23:18:27 CST 2016/08/23] [INFO] (ngrok/log.Info:112) Listening for public https connections on [::]:443
[23:18:27 CST 2016/08/23] [INFO] (ngrok/log.Info:112) Listening for control and proxy connections on [::]:4443
[23:18:27 CST 2016/08/23] [INFO] (ngrok/log.(*PrefixLogger).Info:83) [metrics] Reporting every 30 seconds

 

之後Ctrl+C退出ngrokd,繼續來編譯ngrok客戶端。

2、編譯客戶端ngrok

編譯linux客戶端很簡單,一條命令就搞定

#編譯Linux客戶端
make release-client

顯示以下內容,沒有任何報錯的話,客戶端ngrok就編譯成功了,我們在./bin/目錄下就可以找到執行文件ngrok。

bin/go-bindata -nomemcopy -pkg=assets -tags=release \
	-debug=false \
	-o=src/ngrok/client/assets/assets_release.go \
	assets/client/...
bin/go-bindata -nomemcopy -pkg=assets -tags=release \
	-debug=false \
	-o=src/ngrok/server/assets/assets_release.go \
	assets/server/...
go get -tags 'release' -d -v ngrok/...
go install -tags 'release' ngrok/main/ngrok

是,我們現在需要在windows下運行ngrok客戶端。所以,重點是我們需要編譯Windows版的ngrok客戶端。那麼我們難道要安裝WIndows版的go環境,在Windows下編譯嗎?那太麻煩了,不用這樣。go開發環境爲我們提供了強大的跨平臺交叉編譯功能,在Linux下即可完成Windows版的編譯。

#切到
cd /usr/local/ngrok/
#給Go編譯器加上交叉編譯windows/amd64程序的功能
GOOS=windows GOARCH=amd64

如果這裏提示錯誤

./make.bash: eval: line 135: syntax error near unexpected token `('

有可能是之前使用yum安裝過go,通過命令yum remove go 卸載當前的go並按照本文的方法重新安裝。

#切回到ngrok目錄
cd -
#執行如下命令編譯Windows 64位客戶端
GOOS=windows GOARCH=amd64 make release-client
#以上GOARCH=amd64指的是編譯爲64位版本,如需32位改成GOARCH=386即可

沒有錯誤的話,Windows客戶端ngrok就編譯成功了,我們可以在./bin/windows_amd64/目錄下找到執行文件ngrok.exe。將其下載到Windows上。

mac的編譯命令

#切換到ngrok目錄
cd -;
#mac平臺下的64位環境
GOOS=darwin GOARCH=amd64 make release-client

五、運行並測試

1、啓動服務器端ngrokd

這個很簡單,首先執行VPS上的服務器端ngrokd,這裏的8080指的是服務器啓用8080端口,就是說內網穿透後的域名爲xxx.tunnel,mydomain.com:8080。如果在80端口未作他用的情況下,也可將8080端口改爲80,這樣更方便些。而如果我們VPS的80端口被佔用了,但是我們還想用80端口作爲服務端口,那麼可以使用nginx做一個xxx.tunnel.mydomain.com的反向代理。

#執行ngrokd
./bin/ngrokd -domain="(你的域名)tunnel.mytest.net" -httpAddr=":8080"

2、寫客戶端配置文件

在ngrok.exe所在目錄下建立文件ngrok.cfg,用記事本等文本編輯器寫入以下內容並保存。

#配置文件ngrok.cfg的內容
#
server_addr: "(你的域名)tunnel.mytest.net:4443"
trust_host_root_certs: false

3、映射HTTP

之後打開Windows服務器,這裏以80端口爲例。打開命令提示符,切到ngrok.exe所在目錄,並執行以下命令。

#啓動ngrok客戶端
#注意:如果不加參數-subdomain=test,將會隨機自動分配子域名。
#
ngrok -config=ngrok.cfg -subdomain=test 80

正常情況下,客戶端上會顯示以下內容,表示成功連接到服務器端。

#客戶端ngrok正常執行顯示的內容
ngrok                                                  (Ctrl+C to quit)
 
Tunnel Status     online
Version           1.7/1.7
Forwarding        http://ngrok.dingdayu.com:8080 -> 127.0.0.1:80
Forwarding        https://ngrok.dingdayu.com:8080 -> 127.0.0.1:80
Web Interface     127.0.0.1:4040
# Conn            0
Avg Conn Time     0.00ms

打開瀏覽器,分別在地址欄中輸入http://localhost和http://test.tunnel.mydomain.com:8080,如果後者正常顯示並且和http://localhost顯示的內容相同,則證明我們已經成功了。

4、映射TCP

#這裏以SSH連接Linux時的22端口爲例
./ngrok -proto=tcp 22

映射成功的話,會顯示如下內容:

#客戶端ngrok正常執行顯示的內容
ngrok                                                  (Ctrl+C to quit)
 
Tunnel Status     online
Version           1.7/1.7
Forwarding        tcp://ngrok.dingdayu.com:49805 -> 127.0.0.1:22
Web Interface     127.0.0.1:4040
# Conn            0
Avg Conn Time     0.00ms

現在,在putty等ssh工具中即可連接tunnel.mydomain.com。切記端口是號49805,是隨機分配的一個端口號,而不是默認的22端口了。

Windows的遠程桌面可以將其映射到3389端口來實現。同理,如果要做MySQL的遠程連接,只需映射3306端口即可。FTP可映射21端口。

六、後續定製及優化

通過以上操作,我們的ngrok服務器就已經成功搭建了,客戶端也成功的跑了起來。但是,如果我們想要對ngrok進行一些定製和優化,可以參考這些後續定製及優化的方法。

1、修改客戶端ngrok默認服務地址

客戶端每次還需要加載配置文件,這樣顯得有些麻煩。能不能像官方服務那樣直接執行命令ngrok 80就能使用呢?我們只需要在編譯客戶端之前,稍作修改即可。同樣,如果需要指定域名可以執行命令ngrok -subdomain=test 80來運行客戶端。

#修改默認服務地址
vim ./src/ngrok/client/model.go
#找到第23行,將
defaultServerAddr = "ngrokd.ngrok.com:443"
#修改爲defaultServerAddr = "ngrok.dingdayu.com:4443" 即可

2、修改客戶端ngrok左上角藍色文字logo

運行客戶端後,我們會發現在客戶端左上角會有一個藍色字體的“ngrok”字樣的文字logo,如果覺得不太喜歡,或者想修改一下的話,可以在編譯客戶端之前,作如下修改。

#修改客戶端藍色文字logo
Vim ./src/ngrok/client/views/term/view.go

找到第100行,將

v.APrintf(termbox.ColorBlue|termbox.AttrBold, 0, 0, "ngrok")

修改爲

v.APrintf(termbox.ColorBlue|termbox.AttrBold, 0, 0, "your logo")

3、修改客戶端幫助信息

ngrok客戶端默認的幫助信息很少,我們可以在編譯客戶端之前,自己定製幫助內容。

#修改客戶端默認幫助信息
vim ./src/ngrok/client/client/cli.go

找到第14行,修改const usage2 string的值即可。

4、客戶端程序加殼優化

編譯好的Windows客戶端ngrok.exe大小爲10MB,有點大,這樣加載到內存中,需要讀取硬盤的內容也相對較多,影響速度。所以,我們還可以給客戶端程序加個壓縮殼,對程序進行壓縮。

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