Ngrok是一個隧道,即建立安全通道從公共端點到本地運行的網絡服務,同時捕捉檢查和重播所有流量的反向代理。
簡單來說,他可以代理你本地的數據,並將其轉發到外網。當然原理沒有大變,都是找一個公網服務器做中介。此處稱爲服務器 A。流程如下。
- 本地內網主機和服務器A構建一條連接
- 用戶訪問服務器A
- 服務器A通過網絡隧道轉發到本地內網主機獲取內容
- 服務器A將獲取到的內容發送給用戶
- 通過上面的流程,就實現了用戶訪問到了我們內網的內容。
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,測試訪問成功。