搭建Ngrok實現樹莓派內網穿透

文章內容結合以下文章:
http://www.jianshu.com/p/91f01e30a9b0
http://www.sunnyos.com/article-show-48.html

Ngrok編譯部署條件

  • 域名
  • 獨立IP的VPS/雲主機

編譯Ngrok客戶端時會使用openssl生成證書來加密通訊,保證了安全性,使用時必須和簽署證書時的域名吻合。

一個擁有獨立IP的VPS或雲主機,地區的話推薦選擇 香港或 國外的,配置可以參考 搭建ss服務的標準,其對 延遲, 帶寬和 速度的要求高於內存和CPU。(這裏我用的只是hosthatch的vps,當然這個配置還不是最低價的)

使用國內雲主機的話第一個是要考慮域名備案,因爲一般反向代理網頁時使用了服務器的80端口。第二個是國內符合配置條件的vps比較少,因爲沒人直接拿國內的服務器番茄,市場的需求催生了國外VPS低內存高帶寬而且非常優惠的配置。

部署環境:香港VPS CentOS 7.2+Raspberry raspbian

也可以選擇在本地編譯好客戶端然後部署在服務器上

編譯Ngrok

記得配置一個科學的上網環境(香港或國外主機不用)

由於編譯過程中會導入包的網址,而這些網址基本都被牆了。

方法不用多說了

安裝go環境

先安裝必要的依賴包

yum -y install zlib-devel openssl-devel perl hg cpio expat-devel gettext-devel curl curl-devel perl-ExtUtils-MakeMaker hg wget gcc gcc-c++ build-essential mercurial

由於Go官方地址也被牆了,國內主機或者VPS的請找國內資源下載,由於我使用的香港的VPS,這裏直接下載的Go官方的。

下載go安裝包

wget https://storage.googleapis.com/golang/go1.8.1.linux-amd64.tar.gz 

解壓

tar -zxvf go1.8.1.linux-amd64.tar.gz 

移動目錄

mv go /usr/local/

軟鏈到/usr/bin

ln -s /usr/local/go/bin/* /usr/bin/

安裝成功後查看可Go編譯環境

go env

升級Git版本

Go編譯過程中要求高版本的git,而yum源裏面默認只有1.8版本。

安裝2.9.4版本的git

#下載
wget https://www.kernel.org/pub/software/scm/git/git-2.9.4.tar.gz
#解壓
tar zxvf git-2.9.4.tar.gz cd git-2.9.4
#配置並編譯
./configure --prefix=/usr/local/git-2.9.4
make
make install

取代yum安裝的低版本git,然後軟鏈接到/usr/bin

yum remove git*
ln -s /usr/local/git-2.9.4/bin/* /usr/bin/

檢查git版本是否爲2.9.4

git --version

Ngrok源碼配置

聲明編譯的路徑和必要的域名(域名改成你自己的)

cd /usr/local/

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

export GOPATH=/usr/local/ngrok/

export NGROK_DOMAIN="ngrok.hibai.cn"

cd ngrok

生成證書,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 server.key 2048

openssl req -new -key server.key -subj "/CN=$NGROK_DOMAIN" -out server.csr

openssl x509 -req -in server.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out server.crt -days 5000

將證書文件複製到指定位置

cp rootCA.pem assets/client/tls/ngrokroot.crt

cp server.crt assets/server/tls/snakeoil.crt

cp server.key assets/server/tls/snakeoil.key

編譯服務器端與客戶端

因爲我的服務器端版本爲linux64位,此處GOARCH=amd64

cd /usr/local/go/src

GOOS=linux GOARCH=amd64 ./make.bash

cd /usr/local/ngrok/

GOOS=linux GOARCH=amd64 make release-server

編譯完成過後ngrok/main/ngrokd即爲服務端運行文件

樹莓派爲linux-arm架構,重新聲明go env裏的變量

cd /usr/local/go/src

GOOS=linux GOARCH=arm ./make.bash

cd /usr/local/ngrok/

GOOS=linux GOARCH=arm make release-client

編譯完成過後/ngrok/bin/linux_arm/ngrok即爲樹莓派客戶端運行文件

注:這裏測試時只編譯了amd64的服務器端和arm的客戶端,實際上可以通過改變GOOS與GOARCH來獲取各個平臺的客戶端與服務端,GOOS可以指定爲windows、linux 、 freebsd 、darwin (Mac OS X 10.5 or 10.6) 和 nacl (Chrome 的Native Client 接口) ,GOARCH可以指定爲amd64 (64-bit x86) 、386 (32-bit x86) 、 和arm (32-bit ARM),可見Go語言的跨平臺能力相當彪悍。

部署Ngrok

綁定域名

在編譯配置時的域名ngrok.hibai.cn解析到服務器IP
注意:指定A記錄時ngrok與*.ngrok都要填上,這樣能方便地使用不同子域轉發不同的本地服務。

服務器端部署

爲ngrokd單獨開一個screen

yum install -y screen

screen -S ngrokd

運行ngrokd

/usr/local/ngrok/bin/ngrokd -domain="$NGROK_DOMAIN" -httpAddr=":80"

屏幕會輸出一連串日誌信息,ttpAddr、httpsAddr 分別是 ngrok 用來轉發 http、https 服務的端口,ngrokd 還會開一個 4443 端口用來跟客戶端通訊,注意設置防火牆使端口開放。

客戶端部署

將/ngrok/bin/linux_arm/ngrok移至樹莓派下

新建配置文件ngrok.cfg

server_addr: "ngrok.hibai.cn:4443"
trust_host_root_certs: false

運行客戶端

PS:在執行前務必給ngrok和ngrok.cfg執行權限

chmod +x ngrok
chmod +x ngrok.cfg
./ngrok -config=./ngrok.cfg -subdomain="www.hibai.cn" 80

看見Tunnel Status變爲online說明成功連接服務器端

訪問測試

瀏覽器地址欄輸入www.hibai.cn查看是否能打開

256M內存的香港VPS測試成功

設置開機啓動ngrok穿透

創建啓動腳本start.sh

#!/bin/sh
./ngrok/ngrok -config=./ngrok/ngrok.cfg start tunnel1 tunnel2

然後加入開機啓動中,修改/etc/rc.local

cd /root
./start.sh
#切記最後要有一句 exit 0

總結

從Ngrok強大的反向代理功能可以看出Go語言獨特魅力,除了glibc的版本有一定要求,其跨平臺編譯爲部署省去了不少時間,當然Go還有更多的優點,本文提到的也只是Ngrok的冰山一角,利用其TCP轉發也可以遠程SSH樹莓派,更多玩法就自行百度了。

發佈了33 篇原創文章 · 獲贊 42 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章