本文轉自:自搭Ngrok實現樹莓派內網穿透,有刪改。node
若是把花生殼類比爲使用別人搭好的ss服務,那麼自建Ngrok就是使用本身的ss服務,可見自搭Ngrok的優點不言而喻,流量費用十分經濟,速度,穩定性和安全性將遠遠賽過花生殼。linux
如今花生殼是一種比較流行的穿透內網的方式,不過其穩定性隨着使用人數的增多而大打折扣,內網穿透的價格也不便宜,一套花生棒就是動軛上百,並且流量還要單獨買,若是遭遇流量攻擊套餐基本就泡湯了。c++
Ngrok編譯部署條件:git
- 域名 (.top域名4元首年)
- 擁有獨立IP的VPS或雲主機 (標準配置低於50一年)
編譯 Ngrok 客戶端時會使用openssl生成證書來加密通信,保證了安全性,使用時必須和簽署證書時的域名吻合。github
安裝必要包golang
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
這裏使用國內鏡像下載源碼windows
# 下載地址: https://www.golangtc.com/static/go/ wget https://www.golangtc.com/static/go/1.7.6/go1.7.6.linux-386.tar.gz tar -zxvf go1.7.6.linux-386.tar.gz mv go /usr/local/ ln -s /usr/local/go/bin/* /usr/bin/
安裝成功後查看可Go編譯環境centos
[root@centos~]# go env GOARCH="386" GOBIN="" GOEXE="" GOHOSTARCH="386" GOHOSTOS="linux" GOOS="linux" GOPATH="" GORACE="" GOROOT="/usr/local/go" GOTOOLDIR="/usr/local/go/pkg/tool/linux_386" CC="gcc" GOGCCFLAGS="-fPIC -m32 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build142852038=/tmp/go-build -gno-record-gcc-switches" CXX="g++" CGO_ENABLED="1"
Go 編譯過程當中要求高版本的 git,而 yum 源裏面默認只有 1.7.1 版本。瀏覽器
wget https://www.kernel.org/pub/software/scm/git/git-2.9.3.tar.gz tar zxvf git-2.9.3.tar.gz cd git-2.9.3 ./configure --prefix=/usr/local/git-2.9.3 make make install
取代 yum 安裝的低版本 git安全
yum remove git* ln -s /usr/local/git-2.9.3/bin/* /usr/bin/
檢查 git 版本是否爲 2.9.3
[root@centos ~]# git --version git version 2.9.3
聲明編譯的路徑和必要的域名(域名改爲你本身的)
git clone https://github.com/inconshreveable/ngrok.git ~/ngrok export GOPATH=~/ngrok/ export NGROK_DOMAIN="ngrok.sfantree.com" cd ~/ngrok
生成證書,Ngrok 會使用此證書加密通信
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
將證書文件複製到指定位置
cp base.pem assets/client/tls/ngrokroot.crt -i cp server.crt assets/server/tls/snakeoil.crt -i cp server.key assets/server/tls/snakeoil.key -i
服務器端爲linux-x86-64
export GOOS=linux export GOARCH=386 make release-server
編譯完成事後 ~/ngrok/bin/ngrokd
即爲服務端運行文件.
若客戶端版本與服務端一致,則無需更改 「COARCH」 值,直接編譯客戶端
make release-client
編譯完成事後 ~/ngrok/bin/ngrok
即爲客戶端運行文件。
注 : 這裏測試時只編譯了 i386 的服務器端和 i386 的客戶端,實際上能夠經過改變
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.sfantree.com
解析到服務器IP
注意:指定 A 記錄時 ngrok 與 *.ngrok 都要填上,這樣能方便地使用不一樣子域轉發不一樣的本地服務。
將編譯好的可執行文件移至 /usr/bin/
下
cp ~/ngrok/bin/ngrokd /usr/bin/
爲 ngrokd 單獨開一個 screen
yum install -y screen screen -dmS ngrokd screen -x ngrokd
運行 ngrokd
ngrokd -domain="ngrok.sfantree.com" -httpAddr=":80" -httpsAddr=:10001 -tunnelAddr=:10002
屏幕會輸出一連串日誌信息,httpAddr、httpsAddr 分別是 ngrok 用來轉發 http、https 服務的端口,服務端設置 tunnelAddr 端口用來跟客戶端通信,注意設置防火牆使端口開放。
將 ~/ngrok/bin/ngrok
移至客戶端下
新建配置文件
mkdir ~/ngrok/ && cd ~/ngrok/ touch ~/ngrok/ngrok.cfg echo "server_addr: ngrok.sfantree.com:10002" >> ~/ngrok/ngrok.cfg echo "trust_host_root_certs: false" >> ~/ngrok/ngrok.cfg
運行客戶端
注意給客戶端賦予執行的權限
# 指定子域名爲 pi,採用 http 協議和使用 80 端口 ./ngrok -subdomain pi -proto=http -config=ngrok.cfg 80
瀏覽器地址欄輸入 pi.ngrok.sfantree.com
從 Ngrok 強大的反向代理功能能夠看出 Go 語言獨特魅力,除了 glibc 的版本有必定要求,其跨平臺編譯爲部署省去了很多時間,固然 Go 還有更多的優勢,本文提到的也只是 Ngrok 的冰山一角,利用其 TCP 轉發也能夠遠程 SSH 樹莓派,更多玩法就自行百穀了。