搭建ngrok服務(wù)實(shí)現(xiàn)內(nèi)網(wǎng)穿透
通常實(shí)現(xiàn)內(nèi)網(wǎng)穿透,是通過路由器上端口映射來實(shí)現(xiàn)的。但是路由器通常不是每個(gè)人都有權(quán)限可以訪問和設(shè)置,而且可能存在多級(jí)路由器較為復(fù)雜的網(wǎng)絡(luò)結(jié)構(gòu)。端口映射也無法實(shí)現(xiàn)。
這就需要ngrok來實(shí)現(xiàn)了。
原理
ngrok 建立一個(gè)隧道,將主機(jī)A的http請(qǐng)求 傳遞給 主機(jī)B,從而實(shí)現(xiàn)內(nèi)網(wǎng)穿透。
ngrok分為client端(ngrok)和服務(wù)端(ngrokd)
實(shí)際使用中的部署如下:
圖中內(nèi)網(wǎng)主機(jī)上安裝客戶端。
公網(wǎng)主機(jī) 安裝服務(wù)端。
client public 則代表 訪問你電腦的用戶或者朋友。
實(shí)踐
現(xiàn)在都云時(shí)代,各種服務(wù)都能找到提供商。內(nèi)網(wǎng)穿透也是如此。ngrok服務(wù)端相當(dāng)麻煩,如果你只是簡(jiǎn)單的穿透,又不是什么敏感信息,可以找到很多 服務(wù)提供商。
- 下載客戶端
根據(jù)你的個(gè)人電腦系統(tǒng)下載匹配的客戶端。下載地址: https://ngrok.com/download
- 啟動(dòng)
- ./ngrok http 4444
- ngrok by @inconshreveable (Ctrl+C to quit)
- Session Status online
- Session Expires 7 hours, 59 minutes
- Version 2.2.8
- Region United States (us)
- Web Interface http://127.0.0.1:4040
- Forwarding http://ada02116.ngrok.io -> localhost:4444
- Forwarding https://ada02116.ngrok.io -> localhost:4444
- Connections ttl opn rt1 rt5 p50 p90
- 0 0 0.00 0.00 0.00 0.00
如果此時(shí)訪問 http://ada02116.ngrok.io 則等于訪問了 localhost:4444
自建ngrok服務(wù)
使用別人的服務(wù),存在一些限制。例如不穩(wěn)定、安全問題,費(fèi)用昂貴等。因此可能需要自己搭建ngrok服務(wù)端。
自建服務(wù)需要具備的條件:
1、具備獨(dú)立ip的服務(wù)器。例如阿里云、騰訊云等。
2、需要域名。如果是國內(nèi)則需要備案。
- 配置域名
- 增加2條A記錄,指向你的服務(wù)器。
添加安全組。
開放3個(gè)端口。這里我選擇4443、4444、8081端口。
其中4443是ngrok自身通信使用。
4444 后面tcp端口轉(zhuǎn)發(fā)使用。
8081 則是http請(qǐng)求轉(zhuǎn)發(fā)使用。默認(rèn)是80 但是這里80端口我分配給nginx了。
截圖中少截圖了4444的配置。
- 編譯服務(wù)端。
這里采用docker鏡像來實(shí)現(xiàn)。
- 登錄服務(wù)器,創(chuàng)建文件夾 ngrok-server ,包含2個(gè)文件
文件Dockerfile 內(nèi)容如下
- FROM golang:1.7.1-alpine
- ADD build.sh /
- RUN apk add --no-cache git make openssl
- RUN git clone https://github.com/inconshreveable/ngrok.git --depth=1 /ngrok
- RUN sed -i "109,109s/tcp/tcp4/g" /ngrok/src/ngrok/server/tunnel.go
- RUN sed -i "57,57s/tcp/tcp4/g" /ngrok/src/ngrok/conn/conn.go
- RUN sh /build.sh
- EXPOSE 8081
- VOLUME [ "/ngrok" ]
- CMD [ "/ngrok/bin/ngrokd"]
文件build.sh內(nèi)容如下
- export NGROK_DOMAIN="ngrok.xxxx.com"
- cd /ngrok/
- 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
- make release-server
- GOOS=linux GOARCH=386 make release-client
- GOOS=linux GOARCH=amd64 make release-client
- GOOS=windows GOARCH=386 make release-client
- GOOS=windows GOARCH=amd64 make release-client
- GOOS=darwin GOARCH=386 make release-client
- GOOS=darwin GOARCH=amd64 make release-client
- GOOS=linux GOARCH=arm make release-client
需要修改的地方是
export NGROK_DOMAIN="ngrok.xxxx.com"
修改為你自己的域名。
- 構(gòu)建鏡像。
運(yùn)行
- docker build -t ngrok .
注意 最后一個(gè) . 別少了。
- 啟動(dòng)容器
運(yùn)行
- docker run -it -p 8081:8081 -p 4443:4443 -p 4444:4444 -d ngrok /ngrok/bin/ngrokd -domain="ngrok.xxxx.com" -httpAddr=":8081"
到這里ngrok服務(wù)端已經(jīng)完成。
下載客戶端。
進(jìn)入上面啟動(dòng)的容器,下載對(duì)應(yīng)的客戶端。例如容器id c71b99a242fa運(yùn)行 docker inspect c71 可以查看這個(gè)容器的具體信息。
進(jìn)入圖中劃線的目錄下,再進(jìn)入Bin下。
這里就是客戶端。對(duì)應(yīng)的不同系統(tǒng)的版本。
386代表是 32系統(tǒng)。amd64表示 64位。
linux和window無需多言。
下載命令可以通過很多方式。例如ftp或者scp命令。
- scp -P 你的服務(wù)端端口 -r root@你的服務(wù)端ip地址:/var/lib/docker/volumes/6e5383924c5caf1b1b61250f31aa002308dcb371ebd9a7efad2419e20107a362/_data/bin/darwin_amd64/ngrok ./ngrok
這里要注意下權(quán)限,如果你不是用root,可能沒法子拷貝。
- 配置客戶端
創(chuàng)建配置文件 config.yml,其中內(nèi)容如下
- server_addr: "ngrok.xxxx.com:4443"
- trust_host_root_certs: false
- tunnels:
- webapp:
- proto:
- http: 8081
- subdomain: test
- tcp12345:
- remote_port: 4444
- proto:
- tcp: 12345
這里配置了2個(gè)隧道。一個(gè)http的請(qǐng)求,一個(gè)tcp轉(zhuǎn)發(fā)。
- 啟動(dòng)客戶端
- ./ngrok -config=config.yml start-all
在瀏覽器訪問 上圖中地址即可看到本地內(nèi)容。
增加tcp的轉(zhuǎn)發(fā)截圖。
測(cè)試下12345端口的功能。
- 監(jiān)聽12345端口。
執(zhí)行
- nc -l 12345
- 在其他電腦或者本地執(zhí)行
- nc ngrok.xxxx.com 4444
這樣就可以了。輸入和輸出都會(huì)顯示。
如圖