ubuntu16.04搭建ngrok

Ngrok是一個隧道,即建立安全通道從公共端點到本地運行的網絡服務,同時捕捉檢查和重播所有流量的反向代理。

簡單來說,他可以代理你本地的數據,並將其轉發到外網。當然原理沒有大變,都是找一個公網服務器做中介。此處稱爲服務器 A。流程如下。

  1. 本地內網主機和服務器A構建一條連接
  2. 用戶訪問服務器A
  3. 服務器A通過網絡隧道轉發到本地內網主機獲取內容
  4. 服務器A將獲取到的內容發送給用戶
  5. 通過上面的流程,就實現了用戶訪問到了我們內網的內容。

linux環境爲ubuntu16.04

安裝依賴

1.安裝go環境

注意 golang 需要 1.6 以上,否則不能編譯客戶端。我的主機是ubuntu16.04,所以可以使用自帶的

apt-get install golang

目前默認安裝的是1.6版本,但是因爲後面編譯失敗,所以換成了1.8的

wget https://storage.googleapis.com/golang/go1.8.3.linux-amd64.tar.gz
sudo tar -xvf go1.8.3.linux-amd64.tar.gz
sudo mv go /usr/local

配置環境變量

vim /etc/profile
export GOPATH=/usr/local/go
export PATH=$PATH:$GOPATH/bin
export NGROK_DOMAIN="xxxx.com"

需要一臺公網虛擬機和一個備案域名,本人使用的是阿里雲的ECS,把域名泛解析到 VPS 上,這樣能方便地使用不同子域轉發不同的本地服務上面的xxxx.com是泛解析域名的後綴,比如*.xxxx.com。
使修改即時生效

source /etc/profile

2.獲取Ngrok源碼

git clone https://github.com/inconshreveable/ngrok.git ngrok
## 建議請使用下面的地址,修復了無法訪問的包地址
git clone https://github.com/tutumcloud/ngrok.git ngrok

進入ngrok文件夾中:
生成自簽名證書

sudo openssl genrsa -out base.key 2048
sudo openssl req -new -x509 -nodes -key base.key -days 10000 -subj "/CN=$NGROK_DOMAIN" -out base.pem
sudo openssl genrsa -out server.key 2048
sudo openssl req -new -key server.key -subj "/CN=$NGROK_DOMAIN" -out server.csr
sudo 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 
cp server.crt assets/server/tls/snakeoil.crt
cp server.key assets/server/tls/snakeoil.key

3.編譯服務端和客戶端

sudo make release-server release-client

如果一切正常,我們將會在ngrok/bin文件夾下發現有ngrok和ngrokd兩個可執行文件,其中ngrokd是服務器端運行的,ngrok是linux客戶端運行的。

4.啓動服務端

sudo ./bin/ngrokd -tlsKey=server.key -tlsCrt=server.crt -domain="xxxx.com" -httpAddr=":8081" -httpsAddr=":8082"

注意ecs需要開啓三個端口,8081,8002,4443,4443是客戶端和服務端鏈接的端口,ecs管理控制檯有一層防火牆,還有系統的一層防火牆,注意細節。如果端口比較多,可以使用默認的80和443端口。因爲已經佔用了所以使用8081和8082.

5.測試連接

現在可以通過http://xxxx.com:8081和http://xxxx.com:8082就可以訪問到ngrok提供的轉發服務

爲了使用方便,建議把域名泛解析到 VPS 上,這樣能方便地使用不同子域轉發不同的本地服務。

可以看到這樣一行提示

Tunnel xxxx.com:8081 not found  

這樣子說明已經ok了,只差客戶端進行連接了.

6.編譯客戶端

客戶端有各種os,可以生成不同的客戶端
32位linux客戶端: GOOS=linux GOARCH=386 make release-client
64位linux客戶端: GOOS=linux GOARCH=amd64 make release-client
32位windows客戶端: GOOS=windows GOARCH=386 make release-client
64位windows客戶端: GOOS=windows GOARCH=amd64 make release-client
32位mac平臺客戶端:GOOS=darwin GOARCH=386 make release-client
64位mac平臺客戶端:GOOS=darwin GOARCH=amd64 make release-client
ARM平臺linux客戶端: GOOS=linux GOARCH=arm make release-client

下面生成一個windows客戶端測試

#windows
GOOS=windows GOARCH=amd64 make release-client

在這裏插入圖片描述
把客戶端下載到本地windows
創建一個ngrok配置文件:ngrok.cfg,寫入以下內容:

server_addr: "xxxx.com:4443"
 
trust_host_root_certs: false

在這裏插入圖片描述

7.進入到ngrok目錄運行客戶端:

ngrok -subdomain emeet -proto=http -config=ngrok.cfg 80

在這裏插入圖片描述狀態爲綠色鏈接成功,此時我是關閉了服務端,所以是紅色的鏈接失敗

8.測試

在本地80端口運行一個web項目,test接口返回success,測試訪問成功。
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章