1. 程式人生 > >樹莓派通過ngrok實現內網穿透

樹莓派通過ngrok實現內網穿透

最近在折騰樹莓派,想要實現遠端對寢室內的監控和對部件的控制,即通過外網訪問本地樹莓派。自然而然想到使用內網穿透,百度了一下有花生殼和NATAPP之類的服務提供商。不過這種事情還是自己折騰有意思,而且手頭也有一個沒用的域名和兩臺VPS,就決定自己來做了。

一.內網穿透的簡介
簡單說就是內網中的一臺計算機具有自己的內部IP,外網的計算機具有公共的IP,而內部IP是無法直接通過外網來訪問的,這就需要一種方式來將外網的IP轉化為內部的合法IP來進行合法訪問。
二.ngrok
ngrok 是一個反向代理,通過在公共的端點和本地執行的 Web 伺服器之間建立一個安全的通道。ngrok 可捕獲和分析所有通道上的流量,便於後期分析和重放。(來自百度百科)總之就是一個很厲害的東西,使用方便。

三.具體實現:
1.準備好域名和具有公網IP的VPS,之前租過一臺bandwagon的VPS,就用它了。
使用的系統是Centos 6。
2.VPS安裝go語言
下載tar包:

wget  https://storage.googleapis.com/golang/go1.9.linux-386.tar.gz

tar zxvf go1.9.linux-386.tar.gz -C /usr/local
環境變數配置:

vi /etc/profile

檔案的最後加入:

export GOROOT=/usr/local/go
export GOBIN=/home/N/ngrok
export PATH=$GOROOT
/bin:$PATH

編譯檔案:

source /etc/profile

檢視go語言狀態:

go env

3.樹莓派安裝go語言:
go語言官方二進位制包
下載go1.9.linux-armv6l.tar.gz再用ftp傳入樹莓派
解壓

tar -C /usr/local -xzf go1.9.linux-armv6l.tar.gz

配置環境變數,偷懶直接和VPS下配置相同,編譯檔案。
4.安裝ngrok
由於安裝有linux的行動硬碟被我格式化了,所以想試試在樹莓派上編譯好客戶端和伺服器端。
在樹莓派上執行:

git clone https://github.com/inconshreveable/ngrok.git ngrok

然後在ngrok下執行:

$ openssl genrsa -out rootCA.key 2048 
$ openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=xxx.com" -days 5000 -out rootCA.pem 
$ openssl genrsa -out device.key 2048 
$ openssl req -new -key device.key -subj "/CN=xxx.com" -out device.csr 
$ openssl x509 -req -in device.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out device.crt -days 5000

這個xxx.com替換為自己的根域名。
我在這裡執行到最後一個命令的時候報錯了,發現是第一個命令中-out 後的檔名多打了個’-‘號,怪不得。。
接下來:

cp rootCA.pem assets/client/tls/ngrokroot.crt 
cp device.crt assets/server/tls/snakeoil.crt 
cp device.key assets/server/tls/snakeoil.key 

到這裡證書就完成了。
編譯伺服器端:

export GOOS=linux
export GOARCH=386
make release-server

編譯需要等待一段時間,完成後檔案位於 ngrok/bin/linux_386/ngrokd
然後編譯客戶端:

export GOOS=linux
export GOARCH=arm
make release-client

完成後檔案位於ngrok/bin/ngrok
將編譯後的ngrokd放到VPS的$GOROOT/bin下,然後使用命令

nohup ngrokd -domain="xxx" -httpAddr=":aaaa" -httpsAddr=":bbbb" -log ./ngrokd.log &

如果出現permission denied的問題使用chmod+x增加許可權
nohup … &表示SSH斷開後服務仍然執行
aaaa和bbbb兩個埠號自己選擇
設定樹莓派:
將ngrok複製到$GOROOT/bin下,並建立一個ngrok.cfg檔案

vim ngrok.cfg

寫入以下內容

server_addr: xxxx:4443
trust_host_root_certs: false

xxx是前面使用的域名, 在樹莓派上使用如下命令:

ngrok -log /usr/local/go/bin/ngrok.log -subdomain yyyy -config /usr/local/go/bin/ngrok.cfg 80

這個yyyy自己決定,最後就可以通過瀏覽器位址列yyyy.xxxx:port 這樣的形式訪問樹莓派的HTTP服務了。但是自己使用後還是沒有辦法通過外網來訪問,後來給域名增加了一條CNAME,過一段時間就可以正常訪問了。
成功後樹莓派顯示如下圖:

後面需要再次更改cfg檔案時一定要注意空格,不然會報錯,自己粗心少了空格,一直出錯。之後再新增一下自動啟動就可以了。下一步打算遠端通過flask來控制樹莓派的GPIO,做一些應用。
參考:
http://www.vuln.cn/8634
LeeHDsniper的部落格