前言
之前寫過一篇透過 DuckDNS 與 NGINX Reverse Proxy 做 TLS/SSL 加密連線的教學,原本想說 DDNS 這種類型的應用很基本應該不用特別寫教學,但看到蠻多人對於如何使用 DuckDNS 也很陌生,就補上這篇基礎篇,可以當成上篇來看。
需求條件
-
家中的網路需要有對外 IP(動態 IP 或固定 IP 都可以),有些社區網路透過數據機取得的是內部 IP,會無法使用,或是要去跟系統業者申請開啟特定 port。
-
要會設定 port forwarding。由於每家 router(路由器、分享器)的設定介面不同,請參閱裝置的使用手冊。
關於 DNS 與 DDNS 的基礎知識
網路上的裝置,上至機房裡的主機下至我們手上的手機,基本上都是透過 IP 位址來連線的,例如我如果輸入 216.58.200.238 在瀏覽器上,會連到 Google 的首頁。但是人對於沒有特別關聯性的東西,記憶能力是很差的,所以就算今天把 216.58.200.238 給背起來,幾天後要我再說出這個 IP 位址,大概會非常困難,但大部分的人要記憶 google.com 大概沒什麼問題,幾個月後再問也不容易忘記。
所以 DNS(Domain Name System - 域名系統)就是為此而生的。我們可以把 DNS 類比成一個電話簿,域名(domain name)就是人名或暱稱,而 IP 位址就是電話號碼。我們手機裡可能有一堆的電話號碼,但通常記得的都沒幾個,都是透過人名或暱稱來搜尋。
有了 DNS 這個電話簿系統,我們在瀏覽器上輸入 google.com 的時候,電腦就會去 DNS 主機上查詢這個域名對應到哪個 IP 位址,查到是 216.58.200.238 後,就透過這個 IP 來進行連線的動作(實際上的行為其實更複雜,這邊極度簡化以便容易理解)。
通常我去網上買一個新的域名,域名註冊單位會要求我輸入 hosting 主機的 DNS server 位址以便能做查詢時的連結,之後我就會在 DNS server 上建立 DNS record,設定我的域名要如何對應到各種不同的服務。而這部分的設定通常會使用固定的 IP 位址,避免有變動時造成服務中斷。假設我家的網路對外 IP 是 123.123.123.123 好了,我會建立一個 DNS record 把我的(假)域名 edwin.home 指向 123.123.123.123,這樣有人輸入 edwin.home 這個域名,就會連到設定的 IP 位址。
那什麼是 DDNS 呢?
前面有說到一般我們做 DNS 的設定時,會使用固定 IP 位址。但一般人家裡的網路不一定會有固定 IP 位址,很多時候會是動態的 IP 位址,也就是說網路服務提供者(ISP)會不定時的更新數據機取得的對外 IP ,如果我家是動態的 IP 位址,假如 IP 一變動,我前面設定的 edwin.home 的設定就會失效,因為指向的 IP 已經改變,服務就會受到影響。
DDNS(Dynamic DNS)主要的用途,就是解決這個問題。通常 DDNS 服務會包含一個用戶端的程式或呼叫方式,會定時檢查你的 IP 位址是否有變更,假如有的話,就會通知配合的 DDNS server 把變更的 IP 改上去,讓服務可以持續運作。
關於 DuckDNS 服務
DuckDNS 是一個免費的 DDNS 服務,Home Assistant 預設 add-on 裡就有提供 DuckDNS 的客戶端程式,讓你設定一個 myname.duckdns.org 的域名(myname 可以自己選擇)便於連結到你的 Home Assistant。然後透過這個 add-on,可以定時檢查對外 IP 是否有改變,有的話就會去修改 DNS server 上的紀錄,因此使用者只要記得自己的域名,就不用去煩惱現在 IP 到底是哪個。
那假如我家有固定 IP 位址(例如中華電信提供 7 個動態 1 個固定 IP),也可以用 DuckDNS 嗎?
當然是沒問題的,差別只在你的 IP 都不會變動罷了,使用 DuckDNS 的話就可以省下自己買域名以及維護的費用,也是一個不錯的應用方式。
不過要記得一個關鍵,要使用 DuckDNS 或同類型的 DDNS 服務,你的網路環境至少要有一個你有控制權的對外 IP(public IP - 不管是固定的還是動態的都行),有些社區網路給你的是內部網路用的 IP 位址,雖然你用 DuckDNS 還是會幫你更新 IP 位址,但是對應到的會是系統業者設備的 IP,無法對應到數據機取得的 IP。
註冊 DuckDNS 服務
首先,先到 DuckDNS.org 官網,官方提供數種登入的方式,擇一選用:
登入後,把 token 複製起來待會會用到,然後在下方 domains 的地方申請一個自己喜歡的名字:
接下來,到 Home Assistant 的 add-on 中,安裝 DuckDNS,然後在設定裡面會看到類似下面的設定參數:
lets_encrypt:
accept_terms: true #設成 true,可以自動申請安全憑證
certfile: fullchain.pem
keyfile: privkey.pem
token: put_your_token_here #把 token 複製到這邊
domains:
- myname.duckdns.org #輸入你申請的子域名
aliases: []
seconds: 300
設定改好後就可以啟用 DuckDNS Client,有興趣的人可以看一下 log 看看整個註冊流程是否正常:
在 Router 上設定 Port Forwarding
現在我們已經完成了 DuckDNS 的設定,之後輸入 myname.duckdns.org 時,瀏覽器就會嘗試用 DuckDNS更新的 IP 去連結。
如果你本來就有設定 port forwarding,可以用外部 IP 來瀏覽 Home Assistant 的話,現在就可以把 IP 用域名取代了。例如本來用 http://123.123.123.123:8123 來連,現在就可以改成用 http://myname.duckdns.org:8123,因為 DNS 主機已經知道 myname.duckdns.org = 123.123.123.123。
如果還沒設定過,剛好可以嘗試一下 port forwarding 是在做什麼。
在我們使用的 TCP/IP 網路協定上,裝置與裝置之間除了可以用 IP 找到對方,另外每個裝置也可以透過使用不同的 port 來做不同的通訊用途。譬如說我們常用的 http:// 就是使用 port 80,所以如果我有一台機器 IP 是 123.123.123.123,且有設定 web server 的話,在瀏覽器上打 http://123.123.123.123 或是 http://123.123.123.123:80 就會看到網頁。(因為瀏覽器看到 http:// 會預設使用 port 80 因此平常都不用打)
我們可以把 IP 位址想成是一棟公寓的地址,不同的 port 是不同房號,每個套房則是負責不同的服務,所以我到 123.123.123.123 這個地址的公寓,到 80 號房,就會看到網頁,如果我要 ftp 服務,我就可以找 21 號房,要收 POP3 郵件,就找 110… 以此類推。
但如果今天我是在社區大樓(220.12.34.56),社區有個對外的管理室,而我要找的服務是在 A 大樓(10.0.10.107)的 8123 房,我從外面說我要找 A 大樓的 8123 房就找不到,因為 A 大樓只有這個社區內的人才知道,外面的人只知道社區的地址,這時就要請管理室幫忙做轉送,而管理室會依照管理人設定的條件去轉送:
以上圖為例,透過 220.12.34.56 我可以連到 router,然後把對外的 port 443 轉到 10.0.10.107 的 port 443。而 port forwarding 不一定內、外兩個 port 要相同,我也可以轉不同的 port,例如我把對外的 port 80 轉到 10.0.10.107 的 port 8123,整個 port forwarding 的概念大概就是這樣而已。
剛剛有說過像 port 80 是 http:// 的預設 port 可以省略,假設我希望外部連結時只要打 IP 或網址,不要打 port 就可以連到 Home Assistant 的網頁介面,那我就把對外的 port 80 轉到 Home Assistant 那台機器 IP 的 port 8123(HA 預設的 web UI port),那之後我在瀏覽器上只要打 http://220.12.34.56 或是 http://myname.duckdns.org 就可以了,其實搞清楚概念後也沒有太複雜,是吧?