1. 程式人生 > >自建ngrok實現內網埠對映

自建ngrok實現內網埠對映

本文轉自:自搭Ngrok實現樹莓派內網穿透,有刪改。

如果把花生殼類比為使用別人搭好的ss服務,那麼自建Ngrok就是使用自己的ss服務,可見自搭Ngrok的優勢不言而喻,流量費用十分經濟,速度,穩定性和安全性將遠遠勝過花生殼。

現在花生殼是一種比較流行的穿透內網的方式,不過其穩定性隨著使用人數的增多而大打折扣,內網穿透的價格也不便宜,一套花生棒就是動軛上百,而且流量還要單獨買,如果遭遇流量攻擊套餐基本就泡湯了。

Ngrok編譯部署條件:

  • 域名 (.top域名4元首年)
  • 擁有獨立IP的VPS或雲主機 (標準配置低於50一年)

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

一、編譯Ngrok

1.1 安裝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

這裡使用國內映象下載原始碼

# 下載地址: 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編譯環境

[[email protected]~]# 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"

1.2 升級Git版本

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

[[email protected] ~]# git --version
git version 2.9.3

1.3 Ngrok原始碼配置

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

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

1.4 編譯伺服器端與客戶端

伺服器端為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可以指定為 windowslinuxfreebsddarwin (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

2.1 繫結域名

在編譯配置時的域名 ngrok.sfantree.com 解析到伺服器IP

注意:指定 A 記錄時 ngrok 與 *.ngrok 都要填上,這樣能方便地使用不同子域轉發不同的本地服務。

 

2.2 伺服器端部署

將編譯好的可執行檔案移至 /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 埠用來跟客戶端通訊,注意設定防火牆使埠開放。

 

2.3 客戶端部署

將 ~/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 樹莓派,更多玩法就自行百穀了。