原文地址:https://blog.qjm253.cn/?p=395
包含依賴包的項目(可直接編譯):https://github.com/SunnyQjm/ngrok
實現(xiàn)內(nèi)網(wǎng)穿透紫ngrok無法通過天墻之后,國內(nèi)也出現(xiàn)了一批成熟的商業(yè)化實現(xiàn)方案,諸如花生殼檐束、net123、Sunny-ngrok等仇参。不過免費的極不穩(wěn)定還有流量帶寬限制,最后還是決定自己搭一個。本文利用ngrok搭建一個用于內(nèi)網(wǎng)穿透的環(huán)境。需求是通過一層反向代理颂龙,實現(xiàn)通過一個外網(wǎng)域名訪問一個部署在局域網(wǎng)上的服務(wù)。
準(zhǔn)備
-
一個公網(wǎng)服務(wù)器(Linux系統(tǒng)) ==> 阿里云纽什,騰訊云之類的都行
- 這個公網(wǎng)服務(wù)器主要用作反向代理措嵌,我們在本文中稱之為VPS服務(wù)器
- 一個獨立的域名
- 一個用于提供服務(wù)的本地PC
步驟
-
GO語言環(huán)境搭建
ngrok項目是用GO語言實現(xiàn)的,需要先安裝GOLANG開發(fā)環(huán)境芦缰,系統(tǒng)不限企巢,因為GO語言是跨平臺的!安裝過程很簡單让蕾,參考官網(wǎng)的教程即可浪规!
-
獲取ngrok源碼
# 下面是直接去ngrok的github地址下載(待會兒make的時候還會需要裝幾個其它的依賴,可能會出現(xiàn)很多問題) git clone https://github.com/inconshreveable/ngrok.git # 下面是筆者將代碼clone下來涕俗,并添加了相應(yīng)依賴之后的地址罗丰,如果用上面的方式出現(xiàn)錯誤,可以clone下面的地址 git clone https://github.com/SunnyQjm/ngrok.git
-
解析域名
因為我們自己搭建再姑,需要使用自己的域名(以 test.j.cn )為例萌抵,我們需要做以下解析:
test.j.cn ------------> A記錄到你的VPS服務(wù)器的IP # ngrok可以指定子域名,下面的解析方式可以讓任意子域名都能得到正確的解析 *.test.j.cn ------------> CNAME記錄到 test.j.cn
-
生成簽名證書
- 因為我們是自己搭建,就不能用ngrok官方的SSL證書绍填,需要自己生成
- 下面生成的證書在編譯項目的時候要用到霎桅,所以務(wù)必要在編譯之前生成
- 需要注意的是,客戶端和服務(wù)器的證書必須是同一份讨永,這樣在程序在認(rèn)證的時候才能正確解析
# 首先導(dǎo)出環(huán)境變量滔驶,將下面的值替換成你的域名 export NGROK_DOMAIN="test.j.cn" #先進(jìn)入到ngrok的根目錄,生成證書的操作需要在根目錄下進(jìn)行 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 # 下面的命令用于將我們生成的證書替換ngrok默認(rèn)的證書 cp rootCA.pem assets/client/tls/ngrokroot.crt cp device.crt assets/server/tls/snakeoil.crt cp device.key assets/server/tls/snakeoil.key
-
編譯運行
-
服務(wù)端(VPS服務(wù)器一端)
-
首先指定一下環(huán)境變量卿闹,在不同的操作系統(tǒng)下需要指定不同的環(huán)境變量揭糕,才能正確編譯(默認(rèn)是Linux 64位的配置,如果你的服務(wù)器是64位的Linux系統(tǒng)锻霎,也可以不指定著角,直接用默認(rèn)的就行)
GOOS=linux GOARCH=amd64 #如果是32位系統(tǒng),這里 GOARCH=386 #如果是windows系統(tǒng)旋恼,GOOS=windows
-
然后make出服務(wù)端程序
make release-server
-
如果編譯成功吏口,你會在bin目錄下看到ngrokd程序
cd bin # 查看使用幫助 ./ngrokd -h
-
查看使用幫助
# 查看使用幫助 ./ngrokd -h -domain string Domain where the tunnels are hosted (default "ngrok.com") -httpAddr string Public address for HTTP connections, empty string to disable (default ":80") -httpsAddr string Public address listening for HTTPS connections, emptry string to disable (default ":443") -log string Write log messages to this file. 'stdout' and 'none' have special meanings (default "stdout") -log-level string The level of messages to log. One of: DEBUG, INFO, WARNING, ERROR (default "DEBUG") -tlsCrt string Path to a TLS certificate file -tlsKey string Path to a TLS key file -tunnelAddr string Public address listening for ngrok client (default ":4443")
-
啟動服務(wù)端
# 如果不能執(zhí)行,你可能需要用 sudo chmod +x ngrokd 給它執(zhí)行權(quán)限 # domain域輸入之前生成證書時指定的域名 # httpAddr 指定轉(zhuǎn)發(fā)http協(xié)議的哪個端口 # httpAddrs 指定轉(zhuǎn)發(fā)https協(xié)議的哪個端口(如果不需要可以省略) ./ngrokd -domain="$NGROK_DOMAIN" -httpAddr=":8000" -httpsAddr=":4433"
-
如果執(zhí)行成功冰更,你會看到類似以下界面:
[16:23:40 CST 2018/03/19] [INFO] (ngrok/log.(*PrefixLogger).Info:83) [registry] [tun] No affinity cache specified [16:23:40 CST 2018/03/19] [INFO] (ngrok/log.Info:112) Listening for public http connections on [::]:9748 [16:23:40 CST 2018/03/19] [INFO] (ngrok/log.Info:112) Listening for public https connections on [::]:443 [16:23:40 CST 2018/03/19] [INFO] (ngrok/log.Info:112) Listening for control and proxy connections on [::]:4443 [16:23:40 CST 2018/03/19] [INFO] (ngrok/log.(*PrefixLogger).Info:83) [metrics] Reporting every 30 seconds
自此产徊,服務(wù)端算是配置好了
-
-
客戶端(部署了服務(wù),需要內(nèi)網(wǎng)穿透訪問的主機(jī))
客戶端要做的事情就是指定把本機(jī)的那個端口暴露給VPS服務(wù)器蜀细,客戶端要在該端口上部署了服務(wù)(web服務(wù)或者tomcat服務(wù)等)舟铜,這樣VPS就能夠?qū)⒄埱筠D(zhuǎn)發(fā)到該端口對應(yīng)的服務(wù)上了
# 因為前面說過,服務(wù)端和客戶端的證書要是同一份审葬,這樣認(rèn)證才能通過深滚,所以好的解決方案是在服務(wù)端上把客戶端程序也編譯出來,然后通過scp命令拷貝到客戶端 # 假設(shè)我要在mac上運行客戶端涣觉,需要在編譯命令前加上一些參數(shù)(如果客戶端服務(wù)器也是Linux 64位痴荐,則不用指定環(huán)境變量) GOOS=darwin GOARCH=amd64 make release-client make release-client # 編譯好后scp到本地 scp xxx xxx # 下面開始本地配置(下面的配置在客戶端進(jìn)行) # 新建一個配置文件(在ngrok/bin目錄下) vim ngrok.cfg # 添加一下兩行 # 第一行是將要綁定的域名+4443端口(因為ngrok服務(wù)端默認(rèn)有一個服務(wù)是堅挺在4443端口的,客戶端會通過這個端口與之相連)==> 記得將域名換成自己在生成證書時指定的 server_addr: "test.j.cn:4443" trust_host_root_certs: true # 幫助信息 ./ngrok -h Examples: ngrok 80 ngrok -subdomain=example 8080 ngrok -proto=tcp 22 ngrok -hostname="example.com" -httpauth="user:password" 10.0.0.1 # 80就是我們要轉(zhuǎn)發(fā)的端口了 ./ngrok -config=./ngrok.cfg 80 # 指定協(xié)議和端口官册,不指定默認(rèn)是 http+https ./ngrok -config=./ngrok.cfg -proto=tcp 22 # 指定子域名生兆,不指定就會隨機(jī)生成 ./ngrok -config=./ngrok.cfg -subdomain=test 80
- 連接成功會顯示如下狀態(tài):
image - 在瀏覽器中輸入http://127.0.0.1:4040 就可以看到請求的具體信息了!是不是很神奇膝宁!
- 連接成功會顯示如下狀態(tài):
-
注意
上文中所有出現(xiàn)域名的地方都要統(tǒng)一鸦难,客戶端和服務(wù)端的證書要是同一份,否則在連接的時候會出現(xiàn)bad certification
參考