樹莓派:漂洋過海來看你

Vamei發表於2017-01-03

作者:Vamei 出處:http://www.cnblogs.com/vamei 嚴禁任何形式轉載。

 

給樹莓派連上顯示器和鍵盤滑鼠,就可以像使用一臺電腦一樣使用它了。但很多時候,我們是把體積小巧的樹莓派當做一個便攜裝置來使用的。這種時候,使用者可不希望隨身帶著體積龐大的滑鼠、鍵盤和顯示器。如果能用手中的電腦直接連線樹莓派,然後用該電腦的輸入輸出裝置來操縱樹莓派電腦,就可以省去很多不必要的麻煩。除此之外,樹莓派在物聯網情境下的應用,也離不開多樣的遠端連線方式。

 

區域網SSH登陸

常見的家庭或辦公網路都是以一個WiFi路由器為中心的。這種區域網場景下,可以很容易的用SSH的方式來遠端登陸樹莓派。SSH是用於遠端伺服器管理的加密協議。SSH分為伺服器和客戶端兩端。樹莓派將作為伺服器端,而同一區域網下的另一臺電腦可以作為客戶端。客戶端成功登陸之後,我們可以從客戶端用命令列的方式來遠端操作伺服器端。

 

首先,我們需要開啟樹莓派上的SSH伺服器。樹莓派已經預裝好了SSH伺服器,我們只需要進入樹莓派的設定頁面開啟就可以。從終端用命令列進入設定頁面:

sudo raspi-config

然後在"5 Interfacing Options" -> "P2 SSH"中開啟SSH伺服器:

為了遠端連線,我們必須知道樹莓派的IP地址。在樹莓派上,我們可以用ifconfig命令來找到樹莓派的IP地址:

ifconfig

從ifconfig的輸出中找到樹莓派在區域網中的IP地址。比如ifconfig輸出中給出了對應WiFi連線的wlan0埠地址為192.168.1.101。這個時候,就可以用同一區域網下的其他電腦來登入樹莓派了。我們需要用這臺電腦上的SSH客戶端,比如說用UNIX下的ssh命令:

ssh pi@192.168.1.101

輸入使用者pi的密碼,就可以遠端登入到樹莓派上。其實使用SSH客戶端時,除了說明樹莓派的IP地址,還需要一個埠號。在省略埠號時,客戶端預設為埠22。在Windows下,可以使用PuTTy這樣的SSH客戶端軟體。

 

Bonjour

但在上面的過程中,我們必須從樹莓派本地執行ifconfig來查詢它的IP地址,給遠端登陸增加了不必要的麻煩。我們可以用區域網掃描工具來找到樹莓派的IP地址。UNIX系統下提供了arp命令列工具,通過ARP協議來找到區域網下所有裝置的MAC地址和對應的IP地址。此外,在不同的平臺下也有很多圖形化的區域網掃描軟體,例如IPhone上的Fing、Mac OSX下的LanScan、跨平臺的Angry IP Scanner,都可以幫助你列出同一區域網下所有裝置的MAC地址和對應的IP。此外,你還可以登入路由器的管理頁面。很多路由器都會列出連線裝置及其IP。當然,通過這種方式得到的IP是一個列表,還要從中篩選出目標IP。如果區域網下裝置較多,其過程還是比較痛苦。

 

更方便的,樹莓派提供了對Bonjour的支援。Bonjour用於自動發現網路上的裝置,可以實現區域網上的自動域名解析。在同一區域網下,可以用主機名.local的形式,找到對應的IP地址。由於樹莓派的預設主機名是raspberrypi,因此可以用raspberrypi.local來登陸到樹莓派:

ssh pi@raspberrypi.local

如果區域網內有多個以raspberrypi為名的主機,那麼Bonjour將依次把它們稱呼為:

raspberrypi
raspberryipi-2
raspberryipi-3
...

 

為了徹底避免主機名的衝突,你還可以重新命名樹莓派的主機名。在raspi-config的設定頁面中,選擇"7 Advanced Options"->"A2 Hostname",更改主機名再重新啟動樹莓派,就能以新的主機名來進行Bonjour定址。需要注意的是,Windows系統並沒有自帶對Bonjour的支援。你可以通過下載安裝iTunes"Bonjour Print Services for Windows"來獲得Bonjour功能。

 

Bonjour給裝置了提供了一個動態域名,用於對應該裝置的IP地址。在Mac OSX下,你可以用下面命令來查詢背後的IP地址:

dns-sd -q raspberrypi.local

 

網際網路SSH登陸

介紹了區域網和點對點情況下的SSH登陸,我們可以把野心放大一點,嘗試在網際網路環境中遠端登陸SSH。我下面用幾種不同的方式實現。

 

1)NAT埠對映

如果我們能拿到樹莓派在網際網路上的公網IP地址,那麼就可以直接用一個命令SSH到該IP地址。問題是,現在大部分區域網路都用DHCP來給裝置分配網內的私有IP,很可能只有閘道器才享有一個公網IP地址。有些閘道器允許設定基於NAT的埠對映。如下圖所示,一組公網IP和埠號,能對應唯一的私網IP和埠號。這種情況下,我們就能從外網連線到區域網中的樹莓派:

我們可以利用這一機制來找到樹莓派,比如說,通過設定閘道器,讓公網的199.165.145.1:8999對應私網的10.0.0.1:22。這裡的199.165.145.1是閘道器的公網IP。10.0.0.1是樹莓派的私網IP。22是SSH協議的預設埠。這時在網際網路上的其他電腦上,就可以SSH連線到區域網中的樹莓派:

ssh pi@199.165.145.1:8999

為了用該方法,我們的閘道器必須允許相關的埠對映設定。而很多閘道器出於安全考慮,完全不向外網開放類似的埠對映。因此,這一方法看似可行,但實踐中會遇到很多困難。

 

2)REMOT3.IT

樹莓派官網提供了一種簡便的方法,即使用Weaved公司推出的REMOT3.IT。首先要在樹莓派上安裝相關的工具: 

sudo apt-get install weavedconnectd
sudo weavedinstaller

在安裝過程中,REMOT3.IT會要求你輸入REMOT3.IT網站的賬戶資訊。樹莓派上安裝完成後,在REMOT3.IT網站登陸自己的賬戶,就能看到樹莓派裝置。如下圖所示,網站會提供用於在網際網路上連線到該樹莓派所需的地址和埠號。根據地址和埠號,你就可以在任何一個連線到網際網路的電腦上,用SSH客戶端訪問該樹莓派。這個服務很好用,只恨該網站不但會限制樹莓派數目,還會限制SSH連線的時間。想要避免這些限制,就需要繳費了。

3)SSH反向隧道

其實,類似於REMOT3.IT的技術不難自行實現。我們可以用SSH反向隧道(reverse tunneling)技術,從外網遠端登陸樹莓派。首先,讓樹莓派主動向公網伺服器的某個埠發起SSH連線,比如vameilab.com:8999,形成一個SSH隧道。當我們使用網際網路上的其他電腦,通過SSH連線到伺服器的這一埠時,伺服器會把通訊內容接力到與樹莓派的SSH隧道中,最終抵達樹莓派。整個過程如下圖所示。由於公網伺服器的域名和IP地址都相對固定,我們也不用為找不到樹莓派的IP地址而頭痛。

SSH反向隧道

 

瞭解原理之後,我們也可以自行實現一個類似的中繼伺服器。你可以使用Amazon或阿里雲的彈性雲來架設中繼伺服器。你需要在雲的控制檯中開放用於反向連線的埠,如8999。從樹莓派上用SSH命令建立反向隧道:

ssh -R 8999:localhost:22 vamei@vameilab.com

 

上面的命令,從樹莓派的22埠到vameilab.com的8999埠建立反向隧道。登陸時用的vamei是中繼伺服器上的一個賬戶。反向隧道建立之後,你就可以從網際網路上直接登陸樹莓派了:

ssh -p 8999 pi@vameilab.com

 

總結

這篇文章介紹了點對點、區域網、網際網路三個層面的遠端登陸。在這三個層面上,樹莓派還有很多種其他的遠端登陸方式。我會在未來繼續探索,並不斷補充到這篇文章中。

 

歡迎閱讀“騎著企鵝採樹莓”系列文章 

相關文章