1. 程式人生 > >10分鐘教你搭建自己的ngrok伺服器

10分鐘教你搭建自己的ngrok伺服器

內網穿透想必開發過微信的同志都很瞭解,大部分人選擇網上尋找各種現成的,比如ngrok官網ittun-ngroksunny-ngrok或者花生殼之類的。但是世界上沒有免費的午餐,要不就是收費,要不就是免費但是偶爾會出現連線失敗的問題(當然大多數時間是沒有問題的)。

偶然,正在測試微信的某些功能,但是正在使用的ittun-ngrok連線失敗了。導致測試無法進行,最終萌生出自己搭建一個ngrok伺服器的想法。

1、必要條件

(1)伺服器,用來搭建ngrok的伺服器,必須有公網ip,並且可以正常訪問(本次測試使用的是Ubuntu 16.04 64位)。
(2)域名,用來生成訪問域名。

2、安裝git 和Golang

apt-get install build-essential golang mercurial git

Golang,Go語言支援,因為Ngrok是基於Go語言編寫的

3、下載原始碼,當然也可以不安裝git,但是需要手動上傳程式碼到需要的位置。

此處使用非官方地址,修復了部分包無法獲取(摘自網路)

git clone https://github.com/tutumcloud/ngrok.git ngrok

這裡寫圖片描述

下載下來的目錄結構
這裡寫圖片描述

4、生成自簽名證書
使用ngrok.com官方服務時,我們使用的是官方的SSL證書。自建ngrokd服務,如果不想買SSL證書,我們需要生成自己的自簽名證書,並編譯一個攜帶該證書的ngrok客戶端。

證書生成過程需要一個NGROK_BASE_DOMAIN。 以ngrok官方隨機生成的地址xxx.ngrok.com為例,其NGROK_BASE_DOMAIN就是“ngrok.com”,如果你要提供服務的地址為“example.ngrok.xxx.com”,那NGROK_BASE_DOMAIN就應該 是“ngrok.xxx.com”。本次測試,由於沒有多餘的域名,我替換成自己的二級域名“weixin.yangjiace.xyz”。

cd ngrok

NGROK_DOMAIN="weixin.yangjiace.xyz"

openssl genrsa -out base.key 2048
openssl req -new -x509 -nodes -key base.key -days 10000 -subj "/CN=$NGROK_DOMAIN" -out base.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 base.pem -CAkey base.key -CAcreateserial -days 10000 -out server.crt

這裡寫圖片描述
執行完成後需要替換證書

cp base.pem assets/client/tls/ngrokroot.crt

5、編譯

make release-server release-client

這裡寫圖片描述

編譯成功後會在bin目錄下找到ngrokd和ngrok這兩個檔案。其中ngrokd 就是服務端程式了。
這裡寫圖片描述

6、啟動服務端

./bin/ngrokd -tlsKey=server.key -tlsCrt=server.crt -domain="weixin.yangjiace.xyz" -httpAddr=":80" -httpsAddr=":443"

httpAddr、httpsAddr 分別是 ngrok 用來轉發 http、https 服務的埠,可以隨意指定。ngrokd 還會開一個 4443 埠用來跟客戶端通訊(可通過 -tunnelAddr=”:xxx” 指定)。由於微信限制不能出現埠號,因此這個使用了80、443埠。

7、編譯客戶端

(1)windows

GOOS=windows GOARCH=amd64 make release-client  

(2)mac

GOOS=darwin GOARCH=amd64 make release-client

執行對應的命令會在bin目錄下生成相對應的windows、mac目錄,ngrok.exe就存放在對應目錄下。將對應的ngrok.exe下載到本地。

8、設定本地客戶端

(1)在同級目錄下新建一個配置檔案ngrok.cfg

server_addr: "weixin.yangjiace.xyz:4443"  
trust_host_root_certs: false  

(2)同級目錄下新建一個啟動指令碼startup.bat

@echo on
cd %cd%
#ngrok -proto=tcp 22
#ngrok start web
ngrok -config=ngrok.cfg -log=ngrok.log -subdomain=yjc 8080

其中,-config指向配置檔案,-log存放日誌檔案位置,-subdomain為自定義的域名字首。8080為埠號。

(3)啟動,點選啟動指令碼startup.bat完成啟動。
這裡寫圖片描述

9、設定為系統程式,並後臺執行。

伺服器在執行ngrok時,如果關閉會話視窗,會導致服務中斷,很顯然這不是我們想要的結果,我們需要服務不斷的在後臺執行,當需要的時候在停止。

在/etc/systemd/system/目錄下建立服務ngrok.service,內容為

[Unit]
Description=ngrok
After=network.target

[Service]
ExecStart=/myweb/ngrok/bin/ngrokd -tlsKey=/myweb/ngrok/server.key -tlsCrt=/myweb/ngrok/server.crt -domain="weixin.yangjiace.xyz" -httpAddr=":80" -httpsAddr=":443"

[Install]
WantedBy=multi-user.target

其中要根據自己的實際目錄修改相對應的目錄。

這樣我們就可以了通過systemctl start ngrok.service啟動服務。然後就可以愉快的玩耍了。