ngrok 可捕獲和分析全部通道上的流量,便於後期分析和重放。node
這些看上去很麻煩,咱們更須要的是瞭解ngrok的用途。linux
「花生殼」是一款老牌的內網穿透軟件,一年的內網版服務要兩百多塊錢,都快能夠買一年垃圾點的VPS服務器了。而免費版的「花生殼」穩定性較差,隔三差五的不能訪問,每月只有1G流量,之前作項目沒少被坑。ngrok是一款免費開源的軟件,穩定性極強,我曾作過測試,將ngrok客戶端所在計算機的網絡斷開一陣子,再鏈接另外一個網絡,ngrok很快會自動重連,幾乎不受影響。nginx
ngrok能夠作TCP端口轉發,對於Linux能夠將其映射到22端口進行SSH鏈接。Windows的遠程桌面能夠將其映射到3389端口來實現。同理,若是要作MySQL的遠程鏈接,只需映射3306端口便可。git
微信公衆平臺二次開發時,服務器必需要能經過外網訪問,並且必須是80接口。咱們通常會在本身的電腦上寫代碼,可是因爲電信運營商將80端口屏蔽了,甚至不少人經過無線路由器上網,根本就沒有公網ip。在這種狀況下,咱們每次都要上傳代碼到服務器對微信公衆平臺進行接口調試,十分的不方便。而ngro能夠將內網映射到一個公網地址,這樣就完美的解決了咱們的問題。github
ngrok官方爲咱們免費提供了一個服務器,咱們只須要下載ngrok客戶端便可正常使用,可是後來官方的服務愈來愈慢,直到ngrok官網被徹底屏蔽。如今咱們已經沒法使用ngrok官方的服務器了。因此,接下來咱們自行搭建屬於本身的ngrok服務器,爲本身提供方便快捷又穩定的服務,一勞永逸。golang
VPS:這裏以阿里雲ECS爲例,操做系統爲CentOS7(64位)。 域名:將一個域名或二級域名泛解析到VPS服務器上。例如將*.tunnel.mydomain.com解析到VPS的IP。要注意,此時還須要將tunnel.mydomain.com的A記錄設置爲VPS的IP。
#安裝git yum install git #注意git版本應大於1.7.9.5
源碼編譯安裝請參考:http://my.oschina.net/dingdayu/blog/657538web
下載並解壓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
#下載ngrok源碼包 cd ~ git clone https://github.com/inconshreveable/ngrok.git cd ngrok/
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
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客戶端。
編譯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
這個很簡單,首先執行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
以後打開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顯示的內容相同,則證實咱們已經成功了。
#這裏以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進行一些定製和優化,能夠參考這些後續定製及優化的方法。
客戶端每次還須要加載配置文件,這樣顯得有些麻煩。能不能像官方服務那樣直接執行命令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,若是以爲不太喜歡,或者想修改一下的話,能夠在編譯客戶端以前,做以下修改。
#修改客戶端藍色文字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,有點大,這樣加載到內存中,須要讀取硬盤的內容也相對較多,影響速度。因此,咱們還能夠給客戶端程序加個壓縮殼,對程序進行壓縮。