概述
ngrok是一款開源的網絡服務,能夠為在本地運行的網絡應用提供公開的、基于互聯網的URL。這使得網絡開發人員可以將自己正在開發的網頁或者API暴露到互聯網上,方便進行演示、測試和共享等。
ngrok的工作原理
ngrok.NETwork
- 首先,你需要在本地機器上啟動ngrok,并指定一個或多個端口。
- ngrok會在你的本地機器上建立一個隧道,這個隧道連接到ngrok服務器。
- ngrok服務器會給你的隧道分配一個公開的URL,并將所有發送到這個URL的請求轉發到你的本地機器上。
- 你的本地應用程序處理請求并發送響應,響應通過ngrok隧道返回到原始請求者。
ngrok的主要特性
- HTTP/HTTPS隧道:ngrok支持創建HTTP和HTTPS隧道,這意味著你可以使用它來分享Web應用、API等。
- TCP隧道:除了HTTP和HTTPS之外,ngrok也支持創建TCP隧道,允許你分享任何類型的網絡服務,比如數據庫服務、SSH服務等。
- Web界面:ngrok提供了一個本地的Web界面,你可以通過這個界面查看隧道的狀態,以及所有的HTTP請求和響應詳細信息。
- 支持多平臺:ngrok支持linux、windows、mac等多種操作系統。
總之,ngrok是一款強大而靈活的工具,對于網絡開發人員來說,無論是進行本地開發,還是需要將本地服務暴露給互聯網用戶,都非常有幫助。
域名配置
申請一個自己的域名,假設用到的域名是ngrok.xxx.com,需要將ngrok.xxx.com和*.ngrok.xxx.com解析到自己的服務器上面
配置Go語言環境
ngrok是go語音寫的,服務器上需要配置go語言環境,相關配置命令如下:
- 下載
#下載
wget https://storage.googleapis.com/golang/go1.9.1.linux-amd64.tar.gz
#解壓
tar -zxvf go1.9.1.linux-amd64.tar.gz
#移動到local目錄
mv go /usr/local
- 創建軟連接
#創建軟連接
ln -s /usr/local/go/bin/* /usr/bin/
#測試是否配置成功
go env
安裝ngrok
- 下載源碼
cd /usr/local
# 源碼參考:git clone https://Github.com/inconshreveable/ngrok.git
wget http://www.sunnyos.com/ngrok.zip
unzip ngrok.zip
- 生成證書
如果已有ssl證書,則可以跳過這步
# 進入ngrok源碼的目錄
cd ngrok
# 設置域名,這里使用 ngrok.xxx.com
export NGROK_DOMAIN="ngrok.xxx.com"
# 然后依次執行以下命令即可
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 device.key 2048
openssl req -new -key device.key -subj "/CN=$NGROK_DOMAIN" -out device.csr
openssl x509 -req -in device.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out device.crt -days 5000
# 替換原來證書
cp rootCA.pem ../assets/client/tls/ngrokroot.crt
cp device.crt ../assets/server/tls/snakeoil.crt
cp device.key ../assets/server/tls/snakeoil.key
- 編譯服務端
cd /usr/local/ngrok
GOOS=$GOOS GOARCH=$GOARCH make release-server
- 編譯各大平臺客戶端
# 1、Linux 32位:linux 386
# 2、Linux 64位:linux amd64
# 3、Windows 32位:windows 386
# 4、Windows 64位:windows amd64
# 5、Mac OS 32位:darwin 386
# 6、Mac OS 64位:darwin amd64
# 7、Linux ARM:linux arm
# 對應以上各平臺,將$1、$2替換成對應的值
cd /usr/local/ngrok/
# GOOS=$1 GOARCH=$2 make release-client
# 如編譯Mac OS 64位客戶端
GOOS=darwin GOARCH=amd64 make release-client
- 生成的客戶端文件示例
.../ngrok/bin$tree
.
|-- darwin_amd64
| `-- ngrok
|-- go-bindata
|-- linux_386
| |-- ngrok
| `-- ngrokd
|-- linux_arm
| `-- ngrok
`-- windows_amd64
`-- ngrok.exe
啟動服務端
- 如有自定義證書,提前創建軟連接,如certbot申請的免費證書,注意將xxx.com替換成自己的域名路徑
ln -s /etc/letsencrypt/live/xxx.com/fullchain.pem /usr/local/ngrok/server.crt
ln -s /etc/letsencrypt/live/xxx.com/privkey.pem /usr/local/ngrok/server.key
- 開啟后臺運行,注意端口8001,8443和4443開啟防火墻或安全規則放行,端口也可自行定義,注意將-domain替換成自己的域名路徑
nohup /usr/local/ngrok/bin/ngrokd -domain="ngrok.xxx.com" -tlsCrt="/usr/local/ngrok/server.crt" -tlsKey="/usr/local/ngrok/server.key" -httpAddr=":8001" -httpsAddr=":8443" -tunnelAddr=":4443" -log-level="INFO" >/var/log/ngrok.log 2>&1 &
客戶端配置
將上面生成的客戶端可執行文件拷貝到需要內網穿透的設備上即可,這里直接說多域名和多TCP內網穿透配置文件,直接在客戶端同級目錄下創建ngrok.cfg配置文件,注意server_addr端口要與tunnelAddr對應,內容如下:
server_addr: ngrok.xxx.com:4443
tRust_host_root_certs: false
tunnels:
weixin:
subdomain: weixin
proto:
http: 8002
about:
subdomain: about
proto:
http: 192.168.0.1:80
ssh:
remote_port: 2020
proto:
tcp: 22
內網穿透
- 啟動特定轉發
./ngrok -config ngrok.cfg -log ngrok.log start weixin
注:-log ngrok.log可以查看客戶端日志,可去掉
- 將所有配置轉發
./ngrok -config ngrok.cfg -log ngrok.log start-all
啟動后出現online字樣說明內網穿透成功,如圖所示:
ngrok連接成功示例