使用 ngrok 進行內網穿透

夜丶曲發表於2018-09-07

革命的果實最香甜~~

勞動的人民最光榮~~

軟體需求

  • Git
  • Go
  • ntp

須知:

域名一定要使用二級域名

一級域名為 baidu.com

二級域名為 xxx.baidu.com不要用已經被佔用的二級域名

建議重新解析一個,反正不花錢對不對

不然會出現莫名其妙的錯誤

:(

以下文中 主域名 皆為 二級域名 :test.baidu.com

次域名 為 :ngrok.test.baidu.com

PS:此處描述並不準確,請翻至最後參閱

防火牆記得要關掉,忘記的話你會噁心的一批

伺服器域名 和 客戶端域名的關係

環境:

  • server 端是在阿里雲,阿里雲的系統版本是 CentOS 7 amd64
  • client 端是對多的,有 centos、windows、Raspberry Pi,基本上要覆蓋到所有的平臺 linux 、 windows 和 arm
  • 暫時使用樹莓派進行記錄

開始配置:

git安裝(不做贅述)

➜  ngrok git:(master) ✗ yum install mercurial git gcc golang ntp 複製程式碼

使用ntp進行時間同步

服務端和客戶端都要,不然會有噁心的錯誤

➜  ngrok git:(master) ✗ ntpdate cn.pool.ntp.org
複製程式碼

開始clone ngrok

由於2.x版本好像不開源了,所以我們用1.7,這個git不是官方版,但是比官方版好用 XD

感謝開源社群,開源萬歲!

➜  ngrok git:(master) ✗ git clone https://github.com/tutumcloud/ngrok.git ngrok複製程式碼

clone完成進行配置

➜  ngrok git:(master) ✗ export NGROK_DOMAIN="主域名" 

➜  ngrok git:(master) ✗ cd ngrok 複製程式碼

進入目錄後生成證書(你抄就完事了)

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 server.key 2048
openssl req -new -key server.key -subj "/CN=$NGROK_DOMAIN" -out server.csr
openssl x509 -req -in server.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out server.crt -days 5000複製程式碼

拷貝證書到指定位置(你抄就完事了)

cp rootCA.pem assets/client/tls/ngrokroot.crt
cp server.crt assets/server/tls/snakeoil.crt
cp server.key assets/server/tls/snakeoil.key複製程式碼

開始編譯 ngrok 服務端

這裡我主要是生成了 arm 和 Linux 的版本。繼續在原先的目錄下:

#預設是linux 64位,和我一樣
#我的客戶端是樹莓派
➜  ngrok git:(master) ✗ make release-server
➜  ngrok git:(master) ✗ GOOS=linux GOARCH=arm make release-client
# linux + win + mac + arm 配置
#GOOS=linux GOARCH=amd64 make release-client release-server
#GOOS=windows GOARCH=amd64 make release-client release-server
#GOOS=darwin GOARCH=amd64 make release-client release-server
#GOOS=linux GOARCH=arm make release-client release-server複製程式碼

不同平臺使用不同的 GOOS 和 GOARCH,前面的編譯選項就是指 go os , go 編譯出來的作業系統 (windows,linux,darwin) ;go arch, 對應的構架 (386,amd64,arm)

  • Linux 平臺 32 位系統:GOOS=linux GOARCH=386
  • Linux 平臺 64 位系統:GOOS=linux GOARCH=amd64

  • Windows 平臺 32 位系統:GOOS=windows GOARCH=386
  • Windows 平臺 64 位系統:GOOS=windows GOARCH=amd64

  • MAC 平臺 32 位系統:GOOS=darwin GOARCH=386
  • MAC 平臺 64 位系統:GOOS=darwin GOARCH=amd64

  • ARM 平臺:GOOS=linux GOARCH=arm

編譯成功後會在ngrok/bin下生成ngrokd、ngrok兩個檔案,前者是服務端程式,後者是客戶端程式。

生成的執行檔案由於版本不同可能在不同資料夾內 ,如樹莓派客戶端在 linux_arm 內,請自行判斷

把生成好的客戶端傳到對應伺服器

可選方案:

  • FTP
  • lyzsz

FTP需要搭建

推薦lyzsz

沒有辦法的情況下用git

不再贅述

配置客戶機

  • 建立資料夾ngrok
  • chmod 777
  • 把客戶端匯入
  • 新建檔案 ngrok.cfg(內容如下)
server_addr: 主域名:4443

trust_host_root_certs: false複製程式碼

啟動服務端

#服務端操作均在ngrok目錄下 

➜  ngrok git:(master) ✗ ./bin/ngrokd -tlsKey=server.key -tlsCrt=server.crt -domain="主域名" -httpAddr=":8081" httpsAddr=":8082"複製程式碼
  • httpAddr 是訪問普通的http使用的埠號,後面用 二級域名:8081 來訪問服務
  • httpsAddr 是訪問的https使用的埠號,同上,只不過是需要https的服務訪問才用這個埠
  • tunnelAddr 是通道的埠號,這個埠是ngrok用來通訊的,所以這個埠在伺服器上和客戶端上設定必須要對應才可以正常的連結,預設不填寫好像是4443
#服務端啟動成功資訊
➜  ngrok git:(master) ✗ ./bin/ngrokd -tlsKey=server.key -tlsCrt=server.crt -domain="主域名" -httpAddr=":8081" httpsAddr=":8082"
[19:43:13 CST 2018/09/04] [INFO] (ngrok/log.(*PrefixLogger).Info:83) [registry] [tun] No affinity cache specified
[19:43:13 CST 2018/09/04] [INFO] (ngrok/log.Info:112) Listening for public http connections on [::]:8081
[19:43:13 CST 2018/09/04] [INFO] (ngrok/log.Info:112) Listening for public https connections on [::]:443
[19:43:13 CST 2018/09/04] [INFO] (ngrok/log.Info:112) Listening for control and proxy connections on [::]:4443
[19:43:13 CST 2018/09/04] [INFO] (ngrok/log.(*PrefixLogger).Info:83) [metrics] Reporting every 30 seconds複製程式碼

啟動客戶端

#linux
➜  ngrok git:(master) ✗ ./ngrok -config ./ngrok.cfg -subdomain 次域名字首(如:ngrok) -proto http 80
#windows
ngrok.exe -subdomain=次域名字首(如:ngrok) -config=ngrok.cfg 80複製程式碼

這個二級域名字首最好一樣,避免莫名其妙的報錯

日誌: -log=ngrok_log.txt 是記錄ngrok的日誌,如果前期除錯的時候加上這個引數,如果不能訪問就可以檢視到底是什麼問題

如下

➜  ngrok git:(master) ✗ ./ngrok -log=ngrok_log.txt -config ./ngrok.cfg -subdomain 次域名字首(如:ngrok) -proto http 80./ngrok複製程式碼

客戶端啟動成功

 Tunnel Status 為 online 即為連結成功

如果出現reconnecting

請您自求多福

:(

二次更新:

發現退出終端後連結會自動斷開

於是找了找後臺執行程式的資料

成果如下

服務端:

➜  ngrok git:(master) ✗ nohup ./bin/ngrokd -tlsKey=server.key -tlsCrt=server.crt -domain="主域名" -httpAddr=":8081" httpsAddr=":8082" &
[1] 1784nohup: 忽略輸入並把輸出追加到"nohup.out"  
#使用tail檢視日誌輸出
➜  ngrok git:(master) ✗ tail -f nohup.out 
#1784為程式ID
➜  ngrok git:(master) ✗ ps aux | grep ngrok 
#使用 kill 結束程式
➜  ngrok git:(master) ✗ kill -9 1784複製程式碼

客戶端:

➜  ngrok git:(master) ✗ setsid ./ngrok -log=ngrok_log.txt -config ./ngrok.cfg -subdomain ngrok -proto http 80 
➜  ngrok git:(master) ✗ ps aux | grep ngrok 
➜  ngrok git:(master) ✗ kil -9 1744複製程式碼

這樣即使不連結伺服器也能保持平穩執行

在此重點闡述 伺服器域名 和 客戶端域名的關係

#服務端設定domain 域名 為 baidu.com
➜  ngrok git:(master) ✗ nohup ./bin/ngrokd -tlsKey=server.key -tlsCrt=server.crt -domain="域名" -httpAddr=":8081" httpsAddr=":8082" &

#客戶端subdomain hostname 為 ngrok
➜  ngrok git:(master) ✗ setsid ./ngrok -log=ngrok_log.txt -config ./ngrok.cfg -subdomain ngrok -proto http 80

#訪問域名即為 ngrok.baidu.com

-----------------------------------------------------

#若服務端設定domain 域名 為 test.baidu.com
➜  ngrok git:(master) ✗ nohup ./bin/ngrokd -tlsKey=server.key -tlsCrt=server.crt -domain="域名" -httpAddr=":8081" httpsAddr=":8082" &

#客戶端subdomain hostname 為 ngrok
➜  ngrok git:(master) ✗ setsid ./ngrok -log=ngrok_log.txt -config ./ngrok.cfg -subdomain ngrok -proto http 80

#訪問域名即為 ngrok.test.baidu.com

##注意 無論是 ngrok.baidu.com 還是 ngrok.test.baidu.com
##最終訪問的域名 必須在 域名商處 進行解析!!!
複製程式碼


相關文章