[Docker]使用Docker為樹莓派做內網穿透

最近買了一個樹莓派 Model 3B放在了辦公室的桌子上,讓它平時替我跑一些腳本,好不愜意。但是當下班回家后就與它失去了聯系,比較苦惱,為樹莓派做內網穿透的想法應運而生。

內網穿透 ssh

使用到的開源項目或工具有:

  • Docker
  • ngrok 1.7
  • openssl
  • (非必需)國內Docker云服務提供商 + 備案的域名

編譯 ngrok server 和 client

我的編譯機器是 VPS Ubuntu 16.06
首先安裝必要的工具:

sudo apt-get install build-essential golang mercurial git

clone 源碼,簽發自己域名的證書用于建立可信的連接。

git clone https://github.com/tutumcloud/ngrok.git ngrokcd ngrok
cd ngrok
NGROK_DOMAIN="sample_domain.com" //替換成你自己的域名
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.csropenssl 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

開始編譯:

sudo make release-server release-client
//編譯運行于macOS的可以使用如下命令
sudo GOOS=darwin GOARCH=amd64 make release-server release-client
//編譯運行于樹莓派的可以使用如下命令
sudo GOOS=linux GOARCH=arm make release-server release-client

編譯完成后可以發現 bin目錄出現一個 ngrokd的二進制可執行文件,說明編譯是成功的。

連接 ngrok server 和 ngrok client

我在VPS上,使用如下命令開啟了一個 ngrok server, 可以通過 8081 和 8082 端口訪問轉發到 ngrok client, 只差客戶端來連接了。

sudo ./bin/ngrokd -tlsKey=server.key -tlsCrt=server.crt -domain="sample_domain.com" -httpAddr=":8081" -httpsAddr=":8082"  

在樹莓派上,建立一個簡單的配置文件 ngrok.cfg:

server_addr: sample_domain.com:4443
trust_host_root_certs: false

運行命令:

./ngrok -subdomain pi -proto=http -config=ngrok.cfg 80

不出意外,可以看到終端會輸出 Tunnel Status onlie的字樣,然后我們通過 pi.sample_domain.com:8081訪問的請求就會轉發到樹莓派的 80端口上。

去掉該死的 :8081,我只想通過域名就能訪問

ngrok server 在不指定 httpAddr的情況下會使用 80端口

Docker鏡像制作

ngrok和 nginx都在搶 80端口該怎么辦??顯然 nginx更重要,所以我打算用 Docker欺騙 ngrok,讓它誤以為自己綁定到了機器的 80端口。
工程目錄結構如下:

.├── Dockerfile
 ├── ngrok
 └── run.sh

Dockerfile 如下:

FROM hub.c.163.com/public/ubuntu:16.04
MAINTAINER summerbabybiu admin@stephenw.cc
ENV NGROK /opt/ngrok
ENV DOMAIN sample_domain.com //替換你自己的域名
EXPOSE 80 443 4443 59900
COPY ngrok/bin/ngrokd $NGROK/
COPY ngrok/server.crt $NGROK/ssl.crt
COPY ngrok/server.key $NGROK/ssl.key
COPY ngrok/server.csr $NGROK/ssl.csr
COPY run.sh $NGROK/
RUN chmod +x $NGROK/run.sh
CMD .$NGROK/run.sh

其中 run.sh 內容如下:

#!/bin/sh
/opt/ngrok/ngrokd -tlsCrt /opt/ngrok/ssl.crt -tlsKey /opt/ngrok/ssl.key -domain "sample_domain.com"

然后在工程目錄下執行:

//$REPO_NAME 你的 repo名稱
//$TAG 你的鏡像 tag
docker build -t $REPO_NAME:$TAG .

不出意外地,鏡像 build成功,然后我把它 push 到了 Docker Hub。在 VPS上,把鏡像 pull下來,執行命令:

docker run -d -p 127.0.0.1:8080:80 -p 127.0.0.1:8081:443 -p 4443:4443 -p 59900:59900 $REPO_NAME:$TAG

此時再次嘗試樹莓派連接,然后 VPS配置一下 pi.sample_domain.com proxy_pass 到 127.0.0.1:8080, 你就會發現可以不帶端口訪問到樹莓派了!

樹莓派的 ngrok client 自動啟動與 ssh 穿透

ssh 穿透和 http 原理差不多,不過它不需要分配子域名,只需要簡單的端口建立 tcp連接。編寫一個 ngrok client的配置文件:

server_addr: sample_domain.com:4443
trust_host_root_certs: false
tunnels: 
  http:
     proto: 
       http: 80
     subdomain: pi 
  ssh: 
    proto: 
       tcp: 22 
  remote_port: 59900

然后再次通過命令啟動:

ngrok client 二進制被我放在了 /opt/ngrok下,配置文件被我放在了 /opt/config下

/opt/ngrok/bin/linux_arm/ngrok -config=/opt/config/ngrok.cfg start http ssh

這樣啟動后,可以通過 59900端口 ssh到樹莓派上。
還不夠,目前的 ngrok client啟動處于阻塞態,一旦 tty失去連接就會斷開。為此我配置了一個 systemd service:

/etc/systemd/system/ngrok.service

[Unit]
Description=ngrok
After=network.target
[Service]
Type=simple
ExecStart=/opt/ngrok/bin/linux_arm/ngrok -config=/opt/config/ngrok.cfg start http ssh
[Install]
WantedBy=multc-user.target

然后通過 systemctl enable ngrok.service來使其開機自啟,service ngrok start來使其自動啟動。

優化 ngrok server的連接速度

我的 VPS地理位置處于日本,我在家時訪問樹莓派會比較慢(150ms左右),但是單獨為一個樹莓派開一臺國內的虛機很不劃算(月花費65元左右),于是我想到可以托管在 Docker云服務商那邊。具體做法很簡單,在 Docker云服務商提供的控制臺運行剛才 build好的鏡像,然后綁定你的域名(需要備案),根據 docker容器運行實際提供出來的端口對 client端的配置文件端口稍作修改就可以建立連接了。實測連接速度在 30ms左右,并且費用降到了 10-15元每月左右。
這只是 流量密集型的操作,所以實際上非常低的云服務配置也能提供非常多穩定的連接,性價比非常高。

手機SSH到遠程服務器可以安裝 Serverauditor這一款免費的 App,親測實用。

- EOF-

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,406評論 6 538
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,034評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,413評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,449評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,165評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,559評論 1 325
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,606評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,781評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,327評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,084評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,278評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,849評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,495評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,927評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,172評論 1 291
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,010評論 3 396
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,241評論 2 375

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,807評論 18 139
  • 最近幾天,因為質子的大力助攻,寫起代碼來帥的不行,我已經成為質砸迷妹> < 我要好好做人,愛智求真。真心的。 全班...
    燃音Chelsea閱讀 430評論 0 0
  • 經過商場你會看到有很多打折的衣服,路過廣場你會看到不少面容慘淡的人。這本是兩種不同性質的事物卻有著共同點:被打過折...
    16aa5fab5f62閱讀 467評論 0 0
  • 這部以「喪」而在中國大火的美劇《馬男波杰克》,第四季終于回歸了! 可能你沒看過它,但你一定見過出自此劇的金句截圖。...
    假裝大導演閱讀 327評論 0 1
  • 陰天的懶覺 陰暗的一本《懸崖山莊奇案》 玩不壞的替身反轉梗,阿婆套路深啊 馬普爾小姐《謀殺啟事》來一回,波洛大偵探...
    披著馬甲寫日記閱讀 207評論 0 0