有時候想在自己電腦、路由器或者樹莓派上搭建一些web、vpn等服務讓自己用,但是自己的電腦一般沒有外網ip,沒法在外部訪問這些服務,就像下圖,電腦能訪問到外網,但是沒法從外網訪問到電腦。 這時可以用一臺有外網ip的伺服器利用ngrok在中間做個跳板,如下圖,原理是搭有web服務的內網電腦A 與公網服 ...
(發現博客園會屏蔽一些標題中的關鍵詞,比如ngrok、內網穿透,原因不知,所以改了標題才能正常訪問,)
有時候想在自己電腦、路由器或者樹莓派上搭建一些web、vpn等服務讓自己用,但是自己的電腦一般沒有外網ip,沒法在外部訪問這些服務,就像下圖,電腦能訪問到外網,但是沒法從外網訪問到電腦。
這時可以用一臺有外網ip的伺服器利用ngrok在中間做個跳板,如下圖,原理是搭有web服務的內網電腦A 與公網伺服器C長連接,手機B訪問伺服器C的指定一個埠,伺服器C將收到的手機發來的數據轉發給內網電腦A,A做出相對的響應回傳給伺服器C,C再將收到的數據發給手機A,實現穿透內網。埠轉發這些規則都是在伺服器C和電腦B上定義好的。
ngrok穿透內網原理搭建比較簡單,搭建也比較簡單,不需要填很多配置文件。只需要在伺服器上運行服務端程式,在內網電腦上運行客戶端程式就行了。
需要:一臺伺服器、一個功能變數名稱
搭建步驟:
1、環境準備:在伺服器上安裝git、go語言環境,下載ngrok源碼包。
2、用功能變數名稱生成證書(防止別人用利用你的伺服器做跳板)。
3、編譯服務端程式。
4、編譯客戶端程式,並複製到內網電腦上。
5、分別運行服務端和客戶端,實現長連接。
6、測試,用手機訪問看能不能轉發數據。
詳細步驟:
(為了容易理解,這裡用abcd.cn當做功能變數名稱,二級功能變數名稱是ngrok.abcd.cn,指向同一個伺服器)
1、環境準備
安裝git:yum install git -y
下載go語言包,直接給出下好的了:https://pan.baidu.com/s/1dTzXD-r5kMgIvcD8HZJN1g
解壓go語言壓縮包,創建環境變數:
tar -zxvf go1.9.2.linux-amd64.tar.gz
vi /etc/profile
添加並保存profile文件:
export GO_HOME=/file/go/go
export PATH=$PATH:$GO_HOME/bin
更新環境變數:source /etc/profile
下載解壓github上的ngrok源碼:wget https://codeload.github.com/inconshreveable/ngrok/zip/master
給一個下好的ngrok:https://pan.baidu.com/s/1K2PB-Kka0-alLDSBfpotqQ
2、生成證書
執行下列命令:
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
執行後文件夾下會生成一些證書文件。
將新生成的證書,替換掉assets/client/tls下的證書
cp
base.pem assets
/client/tls/ngrokroot
.crt -y
3、編譯生成服務端程式
make
release-server
會在ngrok/bin/目錄下生成ngrokd可執行文件,
執行:./bin/ngrokd -tlsKey=server.key -tlsCrt=server.crt -domain="abcd.cn" -httpAddr=":80" -httpsAddr=":443"
命令中-httpAddr 和-httpsAddr 是手機訪問ngrok.abcd.cn的的埠,服務端會將80埠接收到的數據通過4443埠(預設)轉發到內網電腦。
出現下列信息是成功運行了。
[22:17:33 CST 2018/08/19] [INFO] (ngrok/log.(*PrefixLogger).Info:83) [registry] [tun] No affinity cache specified [22:17:33 CST 2018/08/19] [INFO] (ngrok/log.Info:112) Listening for public http connections on [::]:80 [22:17:33 CST 2018/08/19] [INFO] (ngrok/log.Info:112) Listening for public https connections on [::]:443 [22:17:33 CST 2018/08/19] [INFO] (ngrok/log.Info:112) Listening for control and proxy connections on [::]:4443 [22:17:33 CST 2018/08/19] [INFO] (ngrok/log.(*PrefixLogger).Info:83) [metrics] Reporting every 30 seconds
4、編譯生成客戶端程式
這裡編譯一個window版的客戶端:
GOOS=windows GOARCH=amd64 make
release-client
(生成linux客戶端直接執行make release-client)
執行完上述命令後會在ngrok/bin/目錄下生成windows_amd64文件夾,裡面有一個ngrok.exe程式,複製到自己內網電腦上。
比如複製到E:/ngrok文件夾,需在此文件夾里新建ngrok.cfk配置文件,裡面寫:
server_addr: "abcd.cn:4443" trust_host_root_certs: false
在命令提示符里切換到此文件夾,執行:
ngrok.exe -config=ngrok.cfg -log=ngrok.log -subdomain ngrok 5000
命令中指定配置文件、日誌文件,-subdomain後面跟的是二級功能變數名稱和伺服器將數據轉發到的本地埠,註意填的是二級功能變數名稱的前一部分,比如ngrok.abcd.cn就寫ngrok。
下圖是運行成功的截圖:
就會將伺服器80接收到的數據轉發到內網電腦的5000埠。
5、先運行服務端:./bin/ngrokd -tlsKey=server.key -tlsCrt=server.crt -domain="abcd.cn" -httpAddr=":80" -httpsAddr=":443"
再運行客戶端:ngrok.exe -config=ngrok.cfg -log=ngrok.log -subdomain ngrok 5000
6、用手機訪問進行測試。
如果是客戶端連接不到服務端(就是上面步驟那個圖狀態不顯示online),一般是服務端配置的問題,客戶端程式和服務端程式是用證書編譯出來的配套使用的。
如果服務端能接收到手機訪問的數據但是找不到隧道轉發,可能是客戶端功能變數名稱寫的有問題(我就是這樣的錯誤)。
ps:功能變數名稱那裡沒做其他嘗試,不知道填伺服器ip可不可行,我在運行客戶端寫一級功能變數名稱不行,寫二級功能變數名稱可以,但是看網上教程填的一級功能變數名稱。。