智能家居 EP9:利用DDNS、通訊埠轉發進行遠端控制
出門在外也能控制 Home Assistant 嗎?
出門在外也能控制 Home Assistant 嗎?必須得可以!這也是智能家居很重要的一環,舉凡人在外面控制燈具、瓦斯、門窗開關、透過攝影機查看家裡狀況、回家路上提前開冷氣、提前啟動電飯鍋開始煮飯…… 遠端控制是必不可少的功能。
此篇我們就來實作,走起!
釐清家中的網路拓撲(怎麼互相連接的?如何上網的?)
以我為例,在此篇操作之前的拓撲為:
1 | +———————+ |
建議各位一定要先稍微梳理一下家中的網路連接狀況,否則很容易跟我之前一樣犯很不必要的錯。(錯誤案例留在文末,供大家嘲笑並警惕)
此例中,我家裡同時有兩台路由器在搞路由,各自維護了兩個內網網段。所以假設我今天手機 wifi 連 MiWifi 來上網,實際上是小烏龜向中華電信取得了 111.87.87.87
這個外網 IP,然後 DHCP 分配給 MiWifi 一個內網 IP 例如 192.168.1.69
,接著 MiWifi 再 DHCP 分配給手機一個內網 IP 如 192.168.31.168
來上網的。
一般家庭為了更好的 wifi 訊號額外買一台分享器是很常見的情形,而由於小烏龜本來就預設開著 DHCP,大家在安裝上很容易變得跟此例一樣。但如此一來,家裡變成了「雙重路由」,等等設定通訊埠轉發(Port Forwarding)會比較麻煩。
我這邊的解法是,MiWifi 改為 PPPoE 撥號直接跟中華電信額外再要一組 IP,各位不妨可以參考。不過如果你不介意,做兩層通訊埠轉發也是 ok 的。
分享器直接撥號
反正中華電信可以同時給我們八組 IP(其實是不是挺大方的?還是因為台灣人口少所以沒差?),那我們就讓小烏龜拿一組(主要給MOD用)、MiWifi 也拿一組,各自對外。
你說你不知道你的 PPPoE 撥號帳號密碼?嗯跟我一樣,就打去中華電信問一下吧 XD
順帶一提,帳號部分我本來輸入的是跟小烏龜一樣的 xxx@wifi.hinet.net ,但連不上,於是嘗試了 xxx@hinet.net 就意外成功了,各位可以嘗試。而 xxx@ip.hinet.net 應該是申請固定 IP 之後才會使用到的。
如此一來,我的拓撲就變成了:
1 | +———————————————————————————+ |
對於 MiWifi 來說,小烏龜此時就單純作為 Modem(數據機、調製解調器),而非上層路由器。對我們的 HA 來說,就是通向外網的障礙(?)少了一層,耶✌🏻
固定HA的內網位置
如果存粹交給 MiWifi 用 DHCP 來分配內網 IP 給 HA 的話,可能過一陣子位置就跑掉。所以我們來固定一下內網的 IP 位置:
如此一來,HA 就會乖乖待在 192.168.31.254
了。
設定通訊埠轉發(Port Forwarding)
此處注意「端口轉發」、「通訊埠轉發」、「Port Forwarding」指的是同一件事情,免得找不到設定入口。
此處可以先把外部的 80port(http 預設端口)轉到 IP為254(我們剛剛固定的位置)的 8123port(HA預設的端口)。簡單來說就是外部的 80 轉到內部的 8123。
而我們預先設好另一組外部 443 轉內部 8123,等等會用到。(443 是 https 預設端口)
設定DDNS + 走 https
而因為我這裡並沒有跟中華電信申請固定 IP,所以外網位置每隔一段時間會回收重發。那我從外網要怎麼追蹤 HA 目前最新的外網位置呢?
此處我們使用 DuckDNS 這個 DDNS 服務(動態DNS)。DuckDNS 透過附加元件安裝到 HA 裡面以後,會幫你偵測 HA 的外網位置,如果改變,就幫你記得,你只要用設定好的域名訪問就 ok 了,非常方便。
到 https://www.duckdns.org/ 註冊好,申請一組域名,取得 token。
接著從「設定 > 附加元件 > 附加元件商店」搜尋「Duck DNS」,安裝並開啟(記得設定成啟動時開啟)。進入 Duck DNS 裡面的設定(如下圖右側),填入你取得的域名與 token,在 Let’s Encrypt 欄位裡面填入:
1 | accept_terms: true |
設定為 true 表示我們要透過 https 連線。
接著到 HA 的 configuration.yaml
加入設定(如下圖左側),如果你不知道怎麼編輯這個 file,請參考之前的智能家居 EP7:File Editor:
1 | http: |
沒錯,DuckDNS 也幫我們集成了 Let’s Encrypt 的加密簽署服務了,揪甘心餒!
HA開啟外部存取
到「設定 > 系統 > 網路」將外部存取打開:
成功遠端訪問!
至此,設定完畢 :)
錯誤示范
當初網際網路知識還太嫩,失敗收場。將錯誤案例留下供大家參考,最後會解釋失敗原因。
此篇「遠端控制」失敗收場,目前未解,若有高手還請救救我QQ(已解決!)
為實現遠端連線,參考了以下三篇:
路由器設定 Port Forwarding
路由器把 HA 伺服器的內網位置給固定住:
然後設定好端口轉發:
HA 安裝 DuckDNS
註冊好 DuckDNS,並在 HA 安裝完畢。
設定完畢:
HA 開啟外部存取
你看我這裡也開了:
URL 也嘗試過各種方法了:
我試過 https, http, 80, 443, 8123,在 port forwarding 的設定也給過 80, 443, 8123 諸如此類。但沒半個可以成功。
除了我訪問 https://myurl.duckdns.org
能連進我的中華電信小烏龜後台。
目前懷疑是小烏龜的設定問題,但進去檢查了一輪沒什麼特別發現。
中華電信小烏龜後台
順帶一題,中華電信小烏龜後台進入的方式預設為:https://192.168.1.1
。記得一定要走 https,否則不給進。
簡單設定可以選擇以 user 登入,帳號密碼皆為 user
。
進階設定有一說是一定要實體乙太網路接電腦才能進去,但我這邊透過 wifi 進去也是可以的。帳號為 cht
,密碼為小烏龜型號後四碼+小烏龜MAC後四碼,皆為小寫。以我為例即為 25gqxxxx
。
敗因解析
1 | 中華電信 |
當初的拓撲如上所示。
為什麼最後總是只能訪問到小烏龜後台呢?如今看來就很明顯了。
透過 DuckDNS 幫我們找到的外網的 IP 位置,是誰的位置呢?是小烏龜透過 PPPoE 撥號向中華電信借來的 IP,所以當然是直接連到小烏龜身上。
所以我們在 MiWifi 裡面用心地設置的 Port Forwarding 當然不會生效,因為壓根就沒有訪問請求進來過!
這題的解法有二:
- 不改變上網方式的前提之下,可以設定兩層 Port Forwarding,小烏龜一層、MiWifi 再一層。
- 讓 MiWifi 也取得一組外網 IP。
以我為例,反正中華電信允許多撥(可以同時撥八組),我 MiWifi 直接 PPPoE 要一組外網 IP,一切就迎刃而解了。