2018年7月12日 星期四

一起學 Python 110 : 外部網路連回家中網路 遠端操控 Raspberry pi (使用 No-ip )

之前有實現過使用 Python 在電腦上架設一個 TCP 的 Client 然後在手機端使用手機 APP 架設一個 TCP 的 Server ,並且讓彼此進行通訊,以及將 Server 傳到 Client 的文字經由 Python 上傳到 Google sheet (詳見一起學 Python 105 : 接收與傳送 TCP/IP (Client 連至 Server) 並將接收到的值傳到 google sheet)

之後的文章我摸索了一下 Raspberry pi (Rpi)這個玩意兒,並且為了省去連接螢幕的麻煩,都是使用 SSH 經由區域網路連線到 Rpi ,使用終端機來對 Rpi 進行操控。

用了一陣子之後發現每次要連線到 Rpi 都要將電腦的網路切換到跟 Rpi 相同的網路( 基本上我的 Rpi 都連家中 Wi-fi ;電腦都連手機 Wi-fi ) 才能連上去。換來換去實在太麻煩了,有沒有什麼方法可以由外部的網路連接上家中的網路進行遠端操控呢 !?

本文就是在教學如何使用手機,連回家中網路(Rpi所屬網路),經由 SSH 的方式來遠端操控 Rpi

之前我一直沒有想搞這東西是因為我家中網路本身是沒有固定 IP 的,而我因為對網路通訊方面不是很熟悉,一直認為要有固定 IP 才有辦法從手機網路連回家中,後來我無意間發現 no-ip 這個東西,可以藉由 "網域名稱" 的方式來連回家中網路(就算家中網路是浮動 ip 也是可行的)

具體的原理以及一些名詞解釋我就不用篇幅來介紹了,請自行查閱。本文直接說明實行方法

Step 1. 先開啟瀏覽器申請 no-ip 的帳號密碼以及註冊 "網域名稱"

Step 2. 登入後就可以在裡面找到自己的 Hostname 了(像我是使用 wyj.hopto.org)


舉例來說我用 wyj.hopto.org 當我的 Hostname

Step3. 找到 Rpi 的 IP 以及 MAC 地址並且記下來



這部份我先將電腦連上跟 Rpi 相同的網域,並且使用 IP SCANER 來找到 Rpi 在區域網路的 IP 以及 MAC 地址,兩者都先記下來。舉例來說我是 192.168.0.105

MAC 地址為 B8:27:XX:XX:XX:XX:XX

Step 4. 連上家中分享器,並設定 Rpi 每次都會被分配到固定的區域網路 IP

在瀏覽器直接輸入 192.168.0.1 通常能夠直接連線到家中的網路分享器



輸入 Rpi 的 Mac 地址 ,並且讓他固定分配到 192.168.0.105 (此步是為了後續 Step 6 設定虛擬伺服器)

Step 5. 開啟 DDNS 服務




找到分享器中有關於 DDNS 的設置,選擇 No-ip 並且輸入 no-ip 的 帳號、密碼、網域名稱以及啟用 DDNS

Step 6. 為外部網路開啟一個 port 端口,並藉由分享器的設定讓外部連接可以找到區域網路中的 Rpi


找到虛擬伺服器的選項,開啟一個外部的端口(例如我這邊隨便輸入一個 54321 ),內部的端口選用 22 (因 Rpi 預設 SSH 使用的 port 為 22 ,這部份若想要更改 Rpi 的 SSH 預設 port 可以參考此連結)

Step 7. Rpi 先接上螢幕,使用電腦藉由 SSH 連線到 Rpi 並且為 Rpi 安裝 no-ip (for linux) 

連線到 Rpi 後鍵入(下方文字為 no-ip 官方所給的安裝教學)

1. sudo su
2. cd /usr/local/src
3. wget http://www.no-ip.com/client/linux/noip-duc-linux.tar.gz
4. tar xzf noip-duc-linux.tar.gz
5. cd no-ip-2.1.9
6. make
7. make install
8. sudo noip2

我在上述的第 5 點出現問題,報錯說找不到該路徑
我用滑鼠直接打開 Rpi 裡面的 /usr/local/src 資料夾發現它的資料夾名稱為 noip-2.1.9-1

所以第 5 點的地方改為 cd noip-2.1.9-1 就可以繼續執行後續步驟了

hint: 第 8 點完成之後 no-ip 就在背景執行了,本來我還想要去新增一些 Rpi 開機自動啟動 no-ip 程式的設定,但我發現上述 1~8 點做完後, no-ip 就已經自動在每次重開機後執行。

想知道現在 no-ip 有沒有執行可以使用

sudo noip2 -S

Step 8. 使用手機 APP ,從手機的網路連上家中的 Rpi

我使用的 App 名稱為 ' Mobile SSH '

進入 App 之後點選右上角的選單,並選擇 SSH Settings

基本上它數據大概是這樣傳遞的,手機藉由 "no-ip 網域名稱" 連接到家中網路的實體 ip (因 Rpi 常駐 no-ip 的程式,該程式每 30 分鐘 (在step7安裝時可以改變設定) 會抓一次目前網路的實體 ip 並綁定至這個 no-ip 網域名稱) 並由 Step 6 的 port 端口進入(也就是 54321),

由前面我們在分享器所設定的虛擬伺服器,會經由 port 54321 連接到內部 192.168.0.105 , port:22 也就是 Rpi 的位址



接著右上角選單裡面點選 connect




如此一來手機就會從網域名稱( Rpi 常駐的 no-ip 會每 30 分鐘幫你更新目前的實體 ip 去對應到網域名稱) 藉由我們前面在虛擬伺服器設的外部端口(54321)連到家中的網路,並且因我們有在虛擬伺服器設定外部 port 54321 對應到 內部 192.168.0.105 :: 22 ,就可以連到 Rpi 了



參考連結
How to Install the Dynamic Update Client on Linux
[Raspberry Pi] SSH 固定IP遠端連線 IP分享器設定
在树莓派上使用no-ip动态域名的方法,也适用其它Linux平台
Rpi 如何安裝 no ip
申請 No-IP 動態 DNS 服務,以浮動 IP 架站教學
如何用ssh連線從外網連到家中區域網路
DIR-605L如何設定虛擬伺服器
[入門] 遠端連回家中的pi 並更改SSH port