Ngrok搭建服務器

1、ngrok簡介及做用

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

這些看上去很麻煩,咱們更須要的是瞭解ngrok的用途。linux

  • 完美代替「花生殼」軟件。

「花生殼」是一款老牌的內網穿透軟件,一年的內網版服務要兩百多塊錢,都快能夠買一年垃圾點的VPS服務器了。而免費版的「花生殼」穩定性較差,隔三差五的不能訪問,每月只有1G流量,之前作項目沒少被坑。ngrok是一款免費開源的軟件,穩定性極強,我曾作過測試,將ngrok客戶端所在計算機的網絡斷開一陣子,再鏈接另外一個網絡,ngrok很快會自動重連,幾乎不受影響。nginx

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

ngrok能夠作TCP端口轉發,對於Linux能夠將其映射到22端口進行SSH鏈接。Windows的遠程桌面能夠將其映射到3389端口來實現。同理,若是要作MySQL的遠程鏈接,只需映射3306端口便可。git

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

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

ngrok官方爲咱們免費提供了一個服務器,咱們只須要下載ngrok客戶端便可正常使用,可是後來官方的服務愈來愈慢,直到ngrok官網被徹底屏蔽。如今咱們已經沒法使用ngrok官方的服務器了。因此,接下來咱們自行搭建屬於本身的ngrok服務器,爲本身提供方便快捷又穩定的服務,一勞永逸。golang

2、環境準備

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

一、安裝git

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

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

二、配置go環境

下載並解壓vim

#下載go1.4.2源碼包
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/windows

添加環境變量api

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

在最後面添加:

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

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

#編譯profile
source /etc/profile

查看go環境是否配置成功

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

 

 

3、準備編譯Ngrok

一、下載Ngrok源碼包

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

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

ngrok須要一個域名做爲base域名,ngrok會爲客戶端分配base域名的子域名。例如:ngrok的base域名爲tunnel.mydomain.com,客戶端便可被分配子域名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.mydomain.com" -days 5000 -out rootCA.pem
openssl genrsa -out device.key 2048
openssl req -new -key device.key -subj "/CN=tunnel.mydomain.com" -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

查看截圖

4、開始編譯ngrok

一、編譯服務器端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.mydomain.com" -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客戶端。

二、編譯客戶端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版的編譯。

#切到go的安裝目錄
cd /usr/local/go/src
#給Go編譯器加上交叉編譯windows/amd64程序的功能
GOOS=windows GOARCH=amd64 ./make.bash

若是這裏提示錯誤

./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

5、運行並測試

一、啓動服務器端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.mydomain.com" -httpAddr=":8080"

二、寫客戶端配置文件

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

#配置文件ngrok.cfg的內容
#
server_addr: "ngrok.dingdayu.com:4443"
trust_host_root_certs: false

三、映射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顯示的內容相同,則證實咱們已經成功了。

四、映射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端口。

6、後續定製及優化

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

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

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

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

二、修改客戶端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")

三、修改客戶端幫助信息

ngrok客戶端默認的幫助信息不多,咱們能夠在編譯客戶端以前,本身定製幫助內容。

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

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

四、客戶端程序加殼優化

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

相關文章
相關標籤/搜索