樹莓派通過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的部落格