Ngrok编译
2019獨角獸企業(yè)重金招聘Python工程師標準>>>
ngrok簡介及作用
ngrok 可捕獲和分析所有通道上的流量,便于后期分析和重放。
這些看上去很麻煩,我們更需要的是了解ngrok的用途。
完美代替“花生殼”軟件。
“花生殼”是一款老牌的內(nèi)網(wǎng)穿透軟件,一年的內(nèi)網(wǎng)版服務要兩百多塊錢,都快可以買一年垃圾點的VPS服務器了。而免費版的“花生殼”穩(wěn)定性較差,隔三差五的不能訪問,每個月只有1G流量,以前做項目沒少被坑。ngrok是一款免費開源的軟件,穩(wěn)定性極強,我曾做過測試,將ngrok客戶端所在計算機的網(wǎng)絡斷開一陣子,再連接另一個網(wǎng)絡,ngrok很快會自動重連,幾乎不受影響。
用于對處在內(nèi)網(wǎng)環(huán)境中,無外網(wǎng)IP的計算機的遠程連接。
ngrok可以做TCP端口轉(zhuǎn)發(fā),對于Linux可以將其映射到22端口進行SSH連接。Windows的遠程桌面可以將其映射到3389端口來實現(xiàn)。同理,如果要做MySQL的遠程連接,只需映射3306端口即可。
用作臨時搭建網(wǎng)站并分配二級域名,可用作微信二次開發(fā)的本地調(diào)試。
微信公眾平臺二次開發(fā)時,服務器必須要能通過外網(wǎng)訪問,而且必須是80接口。我們一般會在自己的電腦上寫代碼,但是由于電信運營商將80端口屏蔽了,甚至很多人通過無線路由器上網(wǎng),根本就沒有公網(wǎng)ip。在這種情況下,我們每次都要上傳代碼到服務器對微信公眾平臺進行接口調(diào)試,十分的不方便。而ngro可以將內(nèi)網(wǎng)映射到一個公網(wǎng)地址,這樣就完美的解決了我們的問題。
ngrok官方為我們免費提供了一個服務器,我們只需要下載ngrok客戶端即可正常使用,但是后來官方的服務越來越慢,直到ngrok官網(wǎng)被完全屏蔽。現(xiàn)在我們已經(jīng)無法使用ngrok官方的服務器了。所以,接下來我們自行搭建屬于自己的ngrok服務器,為自己提供方便快捷又穩(wěn)定的服務,一勞永逸。
環(huán)境準備
VPS:這里以阿里云ECS為例,操作系統(tǒng)為CentOS7(64位)。 域名:將一個域名或二級域名泛解析到VPS服務器上。例如將*.tunnel.mydomain.com解析到VPS的IP。要注意,此時還需要將tunnel.mydomain.com的A記錄設置為VPS的IP。
安裝git
#安裝git yum install git源碼編譯安裝請參考:http://my.oschina.net/dingdayu/blog/657538
配置go環(huán)境
下載并解壓
wget https://storage.googleapis.com/golang/go1.9.linux-amd64.tar.gz #解壓到/usr/local/ tar -C /usr/local/ -zxf go1.9.linux-amd64.tar.gz可從后面的鏈接中下載新的版本:https://golang.org/dl/
添加環(huán)境變量
#打開/etc/profile #配置profile vim /etc/profile在最后面添加:
#添加下面兩行代碼 export GOROOT=/usr/local/go export PATH=$GOROOT/bin:$PATH保存并退出,然后編譯/etc/profile文件,使之前的配置生效
#編譯profile source /etc/profile查看go環(huán)境是否配置成功
go version準備編譯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證書。現(xiàn)在自建ngrok服務器,所以需要重新為自己的base域名生成證書。
# 注意替換此處域名 NGROK_DOMAIN="my.domain.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 5000cp rootCA.pem assets/client/tls/ngrokroot.crt開始編譯ngrok
編譯服務器端ngrokd
ngrokd就是ngrok服務器端,默認編譯為Linux的執(zhí)行文件,我們的VPS本身就是Linux的,所以直接make編譯就好。
#編譯ngrokd(服務器端) make release-server顯示下面的內(nèi)容則表示編譯成功:
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。可以先運行測試一下。
#執(zhí)行ngrokd ./bin/ngrokd -domain="tunnel.mydomain.com" -httpAddr=":8080"出現(xiàn)類似以下內(nèi)容,則說明我們的服務器端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,繼續(xù)來編譯ngrok客戶端。
2、編譯客戶端ngrok
編譯linux客戶端很簡單,一條命令就搞定
#編譯Linux客戶端 make release-client顯示以下內(nèi)容,沒有任何報錯的話,客戶端ngrok就編譯成功了,我們在./bin/目錄下就可以找到執(zhí)行文件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是,我們現(xiàn)在需要在windows下運行ngrok客戶端。所以,重點是我們需要編譯Windows版的ngrok客戶端。那么我們難道要安裝WIndows版的go環(huán)境,在Windows下編譯嗎?那太麻煩了,不用這樣。go開發(fā)環(huán)境為我們提供了強大的跨平臺交叉編譯功能,在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 - #執(zhí)行如下命令編譯Windows 64位客戶端 GOOS=windows GOARCH=amd64 make release-client #以上GOARCH=amd64指的是編譯為64位版本,如需32位改成GOARCH=386即可沒有錯誤的話,Windows客戶端ngrok就編譯成功了,我們可以在./bin/windows_amd64/目錄下找到執(zhí)行文件ngrok.exe。將其下載到Windows上。
mac的編譯命令
#切換到ngrok目錄 cd -; #mac平臺下的64位環(huán)境 GOOS=darwin GOARCH=amd64 make release-client運行并測試
啟動服務器端ngrokd
這個很簡單,首先執(zhí)行VPS上的服務器端ngrokd,這里的8080指的是服務器啟用8080端口,就是說內(nèi)網(wǎng)穿透后的域名為xxx.tunnel,mydomain.com:8080。如果在80端口未作他用的情況下,也可將8080端口改為80,這樣更方便些。而如果我們VPS的80端口被占用了,但是我們還想用80端口作為服務端口,那么可以使用nginx做一個xxx.tunnel.mydomain.com的反向代理。
#執(zhí)行ngrokd ./bin/ngrokd -domain="tunnel.mydomain.com" -httpAddr=":8080"寫客戶端配置文件
在ngrok.exe所在目錄下建立文件ngrok.cfg,用記事本等文本編輯器寫入以下內(nèi)容并保存。
#配置文件ngrok.cfg的內(nèi)容 # server_addr: "ngrok.dingdayu.com:4443" trust_host_root_certs: false映射HTTP
之后打開Windows服務器,這里以80端口為例。打開命令提示符,切到ngrok.exe所在目錄,并執(zhí)行以下命令。
#啟動ngrok客戶端 #注意:如果不加參數(shù)-subdomain=test,將會隨機自動分配子域名。 # ngrok -config=ngrok.cfg -subdomain=test 80正常情況下,客戶端上會顯示以下內(nèi)容,表示成功連接到服務器端。
#客戶端ngrok正常執(zhí)行顯示的內(nèi)容
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顯示的內(nèi)容相同,則證明我們已經(jīng)成功了。
映射TCP
#這里以SSH連接Linux時的22端口為例 ./ngrok -proto=tcp 22映射成功的話,會顯示如下內(nèi)容:
#客戶端ngrok正常執(zhí)行顯示的內(nèi)容 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現(xiàn)在,在putty等ssh工具中即可連接tunnel.mydomain.com。切記端口是號49805,是隨機分配的一個端口號,而不是默認的22端口了。
Windows的遠程桌面可以將其映射到3389端口來實現(xiàn)。同理,如果要做MySQL的遠程連接,只需映射3306端口即可。FTP可映射21端口。
后續(xù)定制及優(yōu)化
通過以上操作,我們的ngrok服務器就已經(jīng)成功搭建了,客戶端也成功的跑了起來。但是,如果我們想要對ngrok進行一些定制和優(yōu)化,可以參考這些后續(xù)定制及優(yōu)化的方法。
修改客戶端ngrok默認服務地址
客戶端每次還需要加載配置文件,這樣顯得有些麻煩。能不能像官方服務那樣直接執(zhí)行命令ngrok 80就能使用呢?我們只需要在編譯客戶端之前,稍作修改即可。同樣,如果需要指定域名可以執(zhí)行命令ngrok -subdomain=test 80來運行客戶端。
#修改默認服務地址 vim ./src/ngrok/client/model.go#找到第23行,將 defaultServerAddr = "ngrokd.ngrok.com:443" #修改為defaultServerAddr = "ngrok.dingdayu.com:4443" 即可修改客戶端ngrok左上角藍色文字logo
運行客戶端后,我們會發(fā)現(xiàn)在客戶端左上角會有一個藍色字體的“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客戶端默認的幫助信息很少,我們可以在編譯客戶端之前,自己定制幫助內(nèi)容。
#修改客戶端默認幫助信息 vim ./src/ngrok/client/client/cli.go
找到第14行,修改const usage2 string的值即可。
客戶端程序加殼優(yōu)化
編譯好的Windows客戶端ngrok.exe大小為10MB,有點大,這樣加載到內(nèi)存中,需要讀取硬盤的內(nèi)容也相對較多,影響速度。所以,我們還可以給客戶端程序加個壓縮殼,對程序進行壓縮。
轉(zhuǎn)載于:https://my.oschina.net/dingdayu/blog/1525454
總結(jié)
- 上一篇: elf中的bss data
- 下一篇: 【免费分享】[哈佛极简经济学]