內(nèi)網(wǎng)穿透利器NGROK學(xué)習(xí)筆記
SofM?2019-10-31 14:13:57
內(nèi)網(wǎng)穿透利器NGROK學(xué)習(xí)筆記
2019.10.31 SofM
1. 介紹
10月28號,某客戶內(nèi)網(wǎng)虛擬機(jī)服務(wù)出現(xiàn)故障,云計算中心工程師是在得到用戶的報障后進(jìn)行的處理。雖然,云計算中心工程師具有高度的責(zé)任心以及快速的問題處理能力,但是監(jiān)控體系的部署使我們進(jìn)一步提升服務(wù)質(zhì)量的目標(biāo)。
因此,為了更及時的發(fā)現(xiàn)客戶系統(tǒng)中的異常,避免因系統(tǒng)服務(wù)對用戶造成使用上的影響,于是安裝部署了Nagios監(jiān)控。但是,由于該機(jī)器深入內(nèi)網(wǎng),并與我們的辦公網(wǎng)進(jìn)行了網(wǎng)絡(luò)隔離,雖然能夠發(fā)出報警郵件,但是及時查看Nagios的管理頁面有一定困難。
經(jīng)過大家討論,可以借助ngrok這一軟件的功能,提供靈活地服務(wù)轉(zhuǎn)發(fā)或者內(nèi)網(wǎng)穿透服務(wù)。
2. 原理介紹
ngrok整個系統(tǒng)由如下四部分組成:
ngrokd服務(wù):服務(wù)端,開放4443端口作為管理端口,用于ngrok之間的管理通信,并且開放http以及https服務(wù)端口。
ngrok程序:客戶端,該客戶端可以使用ngrok程序向ngrokd服務(wù)端發(fā)起驗(yàn)證,并將其代理的http或者其他服務(wù)進(jìn)行ngrokd代理。
業(yè)務(wù)服務(wù)端:和ngrok程序部署在同一臺機(jī)器,或者和ngrok運(yùn)行程序的主機(jī)在同一網(wǎng)絡(luò)中,或者網(wǎng)絡(luò)可達(dá)。
業(yè)務(wù)訪問端:訪問業(yè)務(wù)服務(wù)的客戶。
組成
Client與Server建立一個scoket連接,然后發(fā)送一個Auth請求,Server驗(yàn)證后,返回AuthResp。
接著Client發(fā)送ReqTunnel像服務(wù)器注冊通道,比如,HTTP,HTTPS,TCP,其中包含想要申請的二級域名,服務(wù)器返回NewTunnel,如果Client的二級域名請求為空,服務(wù)器會隨機(jī)分配。
Ngrokd Server等待瀏覽器,APP等客戶端的訪問,當(dāng)有APP訪問,Server會檢查二級域名是否是已經(jīng)注冊了的。如果是,則發(fā)送ReqProxy給Client;Client收到請求后會創(chuàng)建一個新的Socket連接到Server,并發(fā)送RegProxy請求;服務(wù)器收到后,返回StartProxy,并開始使用新的Socket連接做中繼。
原理
3. 實(shí)驗(yàn)步驟
3.1. 準(zhǔn)備實(shí)驗(yàn)環(huán)境
1、ngrokd服務(wù)
一臺阿里云服務(wù)器
2、ngrok程序
自己的PC上,運(yùn)行Win10系統(tǒng)
3、業(yè)務(wù)服務(wù)端
自己的PC上,通過Everything建立一個HTTP服務(wù)
4、業(yè)務(wù)訪問端
手機(jī)網(wǎng)頁瀏覽器
5、域名
sofm.xyz
3.2. Ngrok服務(wù)端部署編譯環(huán)境
1、安裝git
yum install git
2、安裝go
wget https://studygolang.com/dl/golang/go1.8.linux-amd64.tar.gz
tar -zxvf go1.8.linux-amd64.tar.gz
3、配置go
export GOROOT=你的go語言解壓地址
export PATH=$PATH:$GOROOT/bin
source /etc/profile
go version
3.3. Ngrok服務(wù)端部署ngrokd服務(wù)
1、創(chuàng)建一個ngrok目錄
mkdir /usr/local/ngrok
cd /usr/local/ngrok
2、下載源碼
git clone https://github.com/inconshreveable/ngrok.git
3、配置證書
NGROK_DOMAIN=“自己的域名”
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
4、拷貝證書到目的地
cp base.pem assets/client/tls/ngrokroot.crt
5、編譯程序
# 編譯會持續(xù)5分鐘,編譯完成后,會在ngrok目錄的bin目錄生成ngrok和ngrokd兩個文件
make release-all
6、運(yùn)行命令
./bin/ngrokd -tlsKey=server.key -tlsCrt=server.crt -domain=”sofm.xyz” -httpAddr=“:18080”-httpsAddr=“:18090”
7、防火墻端口放行
需要在阿里云虛擬機(jī)的安全組里,開放4443、18080、18090三個TCP端口。
ngrokd運(yùn)行示意圖
3.4. 域名解析配置
我們需要配置兩個域名解析。
A記錄名稱
A記錄解析
1、A記錄名稱@A記錄解析47.104.144.68
A記錄名稱*A記錄解析47.104.144.68
3.5. Ngrok Client端程序生成
1、進(jìn)入目錄
cd /usr/local/ngrok
2、生成windows客戶端
GOOS=windows GOARCH=amd64 make release-client
# 生成的程序在/usr/local/ngrok/bin/windows_amd64/ngrok.exe
3、生成linux客戶端
GOOS=linux GOARCH=amd64 make release-client
3.6. Ngrok Client程序配置與運(yùn)行
1、拷貝
將
/usr/local/ngrok/bin/windows_amd64/ngrok.exe程序拷貝到PC上。
2、在ngrok.exe目錄里配置ngrok.cfg文件
server_addr: "sofm.xyz:4443"
trust_host_root_certs: false
3、在ngrok.exe目錄里建立start.bat腳本
@echo on
cd %cd%
ngrok -config=ngrok.cfg -log=ngrok.log -subdomain=www 80
4、運(yùn)行
直接雙機(jī)start.bat文件
ngrok運(yùn)行情況示意圖
3.7. 業(yè)務(wù)服務(wù)端配置Everything HTTP服務(wù)
打開Everything軟件,在工具-選項(xiàng)中,配置HTTP服務(wù),并配置用戶名和密碼。
everything HTTP
3.8. 業(yè)務(wù)訪問端測試業(yè)務(wù)訪問
正常訪問
4. 總結(jié)
安全組一定要打開。遇到了好幾次,配置沒有啥問題,但是ngrok程序始終無法連接ngrokd成功。
域名解析一定要解析對。除了新增*的A記錄外,也要新增@的A記錄。@的意思是sofm.xyz的解析。