概述
現在的家庭寬帶或者部分公司的寬帶都沒有直接配置設定公網 IP ,這個給我們做開發調試時帶來的很大的不便,比如我們需要對接微信公衆号、支付寶等第三方系統時,第三方系統需要通過異步回調通知我們的服務,但是我們自己電腦上的應用程式都無法對外通路,這樣也就通知不了,無法很好的進行聯調測試。
在這樣的背景下,ngrok 對于我們來說就提供了很大的幫助,他可以讓我們内網的應用可以對外通路,無論是 HTTP(s) 服務還是 TCP/SSH 等場景,均可以通過 ngrok 服務内網穿透來達到對外提供通路的目的。
搭建步驟
第一步:安裝 golang 環境
部落客的伺服器統一使用的 CentOS 7 發行版本,是以通過
yum install golang
就可以安裝好 golang 環境,如果是其他作業系統可以參考官方文檔
How to install golang第二步:下載下傳 ngrok 源碼
目前 ngrok 2.x 版本已經閉源,我們能下載下傳到的最新版本為
ngrok-1.7.1.zip,
下載下傳完成之後解壓 zip 包,這裡我們需要修改
src/ngrok/log/logger.go
中的源代碼,
将
log "code.google.com/p/log4go"
修改為
log "github.com/alecthomas/log4go"
否則編譯時會報錯
build fails: 'package code.google.com/p/log4go: unable to detect version control system for code.google.com/ path'
第三步:生成 TLS 證書
例如我們以 4kb.cn 域名為例,我們在生成證書的時候可以指定 ngrok.4kb.cn 這個域名指定 ngrok 伺服器位址(需要 DNS 解析到 ngrok 所在伺服器的 IP 上),同時我們對外提供 ngrok 域名為 .4kb.cn (需要泛域名解析 .4kb.cn 到 ngrok 所在伺服器的 IP 上),這裡的 ngrok.4kb.cn 和 *.4kb.cn 解析并不沖突。
生成 TLS 證書的指令如下:
openssl genrsa -out rootCA.key 2048
openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=ngrok.4kb.cn" -days 3650 -out rootCA.pem
openssl genrsa -out device.key 2048
openssl req -new -key device.key -subj "/CN=ngrok.4kb.cn" -out device.csr
openssl x509 -req -in device.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out device.crt -days 3650
第四步:覆寫 ngrok 預設 TLS 證書
cp rootCA.pem assets/client/tls/ngrokroot.crt
cp device.crt assets/server/tls/snakeoil.crt
cp device.key assets/server/tls/snakeoil.key
第五步:設定 Golang 編譯目錄和參數
export GOPATH=/go
為了可以在 docker 環境下運作,我們還需要運作下面的指令,否則會報錯
Unable to run a go program inside docker /bin/sh: ./ngrokd: not found
export CGO_ENABLED=0
第六步:編譯 ngrok 服務端和用戶端
Linux 32 位系統 ngrok 編譯指令
export GOOS=linux GOARCH=386
make release-server release-client
Linux 64 位系統 ngrok 編譯指令
export GOOS=linux GOARCH=amd64
make release-server release-client
Windows 32 位系統 ngrok 編譯指令
export GOOS=windows GOARCH=386
make release-server release-client
Windows 64 位系統 ngrok 編譯指令
export GOOS=windows GOARCH=amd64
make release-server release-client
macOS 32 位系統 ngrok 編譯指令
export GOOS=darwin GOARCH=386
make release-server release-client
macOS 64 位系統 ngrok 編譯指令
export GOOS=darwin GOARCH=amd64
make release-server release-client
其他作業系統修改 GOOS 和 GOARCH 為對應的即可:
Go (Golang) GOOS and GOARCH第七步:運作 ngrokd 服務端
編譯完成之後可以在 bin 目錄下看到 ngrokd(服務端)和 ngrok(用戶端),運作服務端時需要将 assets/server/tls/snakeoil.crt 和 assets/server/tls/snakeoil.key
複制到同級目錄,啟動的指令參考如下:
./ngrokd -tlsKey=snakeoil.key -tlsCrt=snakeoil.crt -domain="4kb.cn" -httpAddr=":80" -httpsAddr=":443" -tunnelAddr=":4443"
如果使用預設 80、443、4443 端口,則可以使用以下指令運作:
./ngrokd -tlsKey=snakeoil.key -tlsCrt=snakeoil.crt -domain="4kb.cn"
第八步:運作 ngrok 用戶端
運作之前我們需要編寫一個
ngrok.cfg
檔案,内容如下
server_addr: "ngrok.4kb.cn:4443"
trust_host_root_certs: false
這裡的 server_addr 需要和第三步生成 TLS 時保持一緻,否則服務端會報
tls: bad certificate
證書錯誤,
編輯完成之後使用 ngrok 用戶端運作即可
./ngrok -config=ngrok.cfg 8080
指定域名運作指令
./ngrok -config=ngrok.cfg -subdomain=xxx 8080
映射 SSH 22 端口,使用 tcp 協定
./ngrok -config=ngrok.cfg -proto=tcp 22
總結
我們搭建完成 ngrok 服務端後,任意能連接配接到伺服器的應用程式均可以通過 ngrok 内網穿透,不僅 Java、PHP 等開發的網站可以通過 ngrok 映射對外提供域名通路,也可以讓 SSH 的 22 端口映射之後,我們連接配接無公網 IP 的伺服器(比如在家裡面搭建一個私有伺服器),甚至還可以将 MySQL 的 3306 端口映射之後,在任意地點遠端連接配接内網的資料庫。這給我們帶來來極大的友善,也不需要購買第三方服務(例如花生殼)。
參考文獻
版權
版權聲明:自由轉載-非商用-非衍生-保持署名(創意共享3.0許可證)
原創作者 [email protected] 發表于阿裡雲·雲栖社群:
https://yq.aliyun.com/users/y4epujtm5wye6掃碼關注我,線上與我溝通、咨詢
轉載請保留原文連結以及版權資訊