基于ssh的穩(wěn)定內(nèi)網(wǎng)穿透and遠(yuǎn)程控制

Raspberry.jpeg

Scenario

上圖的樹莓派里面跑著我用于Blockchain + IOT的一個小demo喝噪,但是就面臨著內(nèi)網(wǎng)穿透的問題旺韭,畢竟不可能為每個IOT分配IP地址的兰吟。

場景一:

假設(shè)你擁有大量的樹莓派設(shè)備,有一臺公網(wǎng)服務(wù)器茂翔,也有一臺個人電腦混蔼。這時候你需要通過個人電腦控制大量的樹莓派設(shè)備。

場景二:

假設(shè)你是一個很牛逼的AI實驗室的成員珊燎,剛好你要到外地工作一段時間惭嚣,剛好你需要實驗室里的幾張1080Ti顯卡的服務(wù)器,但是實驗室的服務(wù)器一般是局域網(wǎng)使用的悔政,這個時候晚吞,你面臨的問題就是如何在外地訪問它。

解決這個場景的主要框架如下圖谋国,我們在IOT端反向映射到云服務(wù)器槽地,然后在本機(jī)電腦正向映射到云服務(wù)器,這樣就可以實現(xiàn)從本機(jī)訪問內(nèi)網(wǎng)的機(jī)器了芦瘾。

MainFrameWork.png

具體的步驟是這樣的:

一捌蚊、Cloud Server Configuration

首先,我們創(chuàng)建為ssh的接入創(chuàng)建一個獨立的用戶近弟。
(on the server)

sudo useradd -m tunnel

然后缅糟,我們使用tunnel用戶登陸,然后創(chuàng)建相對應(yīng)的ssh配置祷愉。
(on the server)

sudo su tunnel
mkdir ~/.ssh
chmod 700 ~/.ssh
touch ~/.ssh/authorized_keys

然后窗宦,我們需要切換出tunnel用戶,為了安全起見二鳄,我們會禁掉tunnel用戶執(zhí)行命令的功能赴涵。
(on the server)

# if you are still logged in as tunnel, exit:
exit
sudo chsh -s /bin/false tunnel

然后,我們需要對/etc/ssh/sshd_config文件進(jìn)行修改订讼,控制tunnel用戶的權(quán)限髓窜。把下面的內(nèi)容加到文件的末尾。
(on the server)

...

Match User tunnel
    AllowAgentForwarding no
    AllowTcpForwarding remote
    GatewayPorts no
    AllowStreamLocalForwarding no

二躯嫉、IoT (Raspberry Pi) Configuration

為了穩(wěn)定的ssh連接纱烘,我采用了autossh對ssh進(jìn)行穩(wěn)定監(jiān)控和管理。采用supervisord對autossh進(jìn)行監(jiān)控祈餐。 so擂啥,我們需要install這兩個東西。

( on the Raspberry Pi)

sudo apt install autossh -y
sudo apt install supervisor -y

需要配置一下supervisord帆阳。
( on the Raspberry Pi)

[program:ssh-forward]
process_name=%(program_name)s_%(process_num)02d
command=/usr/bin/autossh -M 10001 -N -R 10000:localhost:22 tunnel
autostart=true
autorestart=true
user=root
numprocs=1
redirect_stderr=true
stdout_logfile=/var/log/ssh-forward.log

上述的配置可以通過啟動帶有監(jiān)控端口10001和10002的autossh來監(jiān)控ssh連接哺壶,從而tunnel可以在云服務(wù)器上通過打開10000端口來和IOT進(jìn)行通信。

我們還需要創(chuàng)建私鑰和公鑰蜒谤,而且需要由root來開啟tunnel山宾,因為ssh port是小于1024的而且無法前向。
( on the Raspberry Pi)

# login as root
sudo -i
ssh-keygen -t rsa

nano /root/.ssh/config

Add the following to the config file (replace 123.123.123.123 with your cloud server’s IP address):

Host tunnel
    Hostname 123.123.123.123
    User tunnel

然后把樹莓派的公鑰加到云服務(wù)器的/home/tunnel/.ssh/authorized_keys中鳍徽,(這個就不用我講了吧= =#)

Ok资锰,我們需要先測試一下ssh的轉(zhuǎn)發(fā)功能有沒有效果。
( on the Raspberry Pi)

ssh -N -R 10000:localhost:22 tunnel

-N: 表示轉(zhuǎn)發(fā)功能阶祭,ssh會一直堵塞監(jiān)聽轉(zhuǎn)發(fā)的绷杜。當(dāng)執(zhí)行這個命令的時候,ssh會對tunnel這個服務(wù)器的包進(jìn)行tcp轉(zhuǎn)發(fā)濒募。假如看見一直堵塞鞭盟,沒有報錯,說明樹莓派的ssh配置好了瑰剃。

然后齿诉,我們可以啟動supervisor了。

service supervisor reload
service supervisor status

# login to your cloud server with your normal (NOT tunnel) user
netstat -tulpn | grep 10000

# and you will see
tcp        0      0 127.0.0.1:10000         0.0.0.0:*               LISTEN      -               
tcp6       0      0 ::1:10000               :::*                    LISTEN      -  

三晌姚、Accessing your IoT Device remotely

最后在本地的機(jī)器上運行

(your pc)

ssh -N -L 9090:localhost:10000 youruser@yourserver

youruser是指云服務(wù)器上區(qū)別于tunnel的user粤剧,yourserver是指云服務(wù)器上的ip地址。

本地建立了ssh通道之后挥唠,通過執(zhí)行一下命令就可以連到樹莓派/內(nèi)網(wǎng)服務(wù)器了俊扳。一定要注意的是!user指的是樹莓派的用戶猛遍,或者內(nèi)網(wǎng)的用戶馋记!

(your pc)

ssh user@localhost -p 9090

隨便一談

對于我來說,掌握內(nèi)網(wǎng)穿透和遠(yuǎn)程控制技術(shù)十分重要懊烤。特別是遇到blockchain + IOT的項目研發(fā)方向梯醒,我需要控制/喚醒大規(guī)模的物聯(lián)網(wǎng)設(shè)備;遇到跨地域開發(fā)的時候腌紧,也需要用到各個地區(qū)的服務(wù)器資源來跑AI茸习。Teamviewer無疑是一個好東西,但是lisences太貴了壁肋,作為吃飯都成問題的學(xué)生黨号胚,真的無法承受籽慢,只能從開源項目著手。(致敬開源精神猫胁。箱亿。。)

在搭建網(wǎng)絡(luò)的過程中弃秆,會遇到很多很多的問題届惋。 本文也是避免描述這些問題的解決方案,在解決問題的過程中菠赚,需要各個小伙伴對TCP/IP的機(jī)制很熟悉脑豹,不然會容易疑惑為什么有時候能連上,有時候連不上衡查。如果實在無法解決瘩欺,可以發(fā)郵件一起討論和學(xué)習(xí)。(再次致敬開源精神拌牲。击碗。。)

Email: csx.software.engineer@gmail.com

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末们拙,一起剝皮案震驚了整個濱河市稍途,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌砚婆,老刑警劉巖械拍,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異装盯,居然都是意外死亡坷虑,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進(jìn)店門埂奈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來迄损,“玉大人,你說我怎么就攤上這事账磺∏鄣校” “怎么了?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵垮抗,是天一觀的道長氏捞。 經(jīng)常有香客問我,道長冒版,這世上最難降的妖魔是什么液茎? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上捆等,老公的妹妹穿的比我還像新娘滞造。我一直安慰自己,他們只是感情好栋烤,可當(dāng)我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布谒养。 她就那樣靜靜地躺著,像睡著了一般班缎。 火紅的嫁衣襯著肌膚如雪蝴光。 梳的紋絲不亂的頭發(fā)上她渴,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天达址,我揣著相機(jī)與錄音,去河邊找鬼趁耗。 笑死沉唠,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的苛败。 我是一名探鬼主播满葛,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼罢屈!你這毒婦竟也來了嘀韧?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤缠捌,失蹤者是張志新(化名)和其女友劉穎锄贷,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體曼月,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡谊却,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了哑芹。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片炎辨。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖聪姿,靈堂內(nèi)的尸體忽然破棺而出碴萧,到底是詐尸還是另有隱情,我是刑警寧澤末购,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布勿决,位于F島的核電站,受9級特大地震影響招盲,放射性物質(zhì)發(fā)生泄漏低缩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望咆繁。 院中可真熱鬧讳推,春花似錦、人聲如沸玩般。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽坏为。三九已至究驴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間匀伏,已是汗流浹背洒忧。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留够颠,地道東北人熙侍。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像履磨,于是被迫代替她去往敵國和親蛉抓。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,465評論 2 348

推薦閱讀更多精彩內(nèi)容