智能家居 EP11:用反向代理取代端口轉發(NPM+DuckDNS)
我們在 智能家居 EP9:利用DDNS、通訊埠轉發進行遠端控制 已經透過 Port Forwarding 的方法實現外網訪問,可以成功在外面控制家中設備。
但實際上,在網路安全的領域中,端口轉發意味著 port 的暴露,其實大家都看得到你有哪些 port 是開的。例如,我用外網透過 nmap 來掃描我家可以看到:
開放的 port 那是一個清清楚楚明明白白。
對此,我們使用 Nginx Proxy Manager (下稱 NPM)來替我們進行反向代理,減少我們直接開 port 的需求。假設我架設了五個服務,本來我要分別開五個 port 來訪問。現在透過 NPM,我可以只開 80 跟 443 出來給 NPM,往後需要訪問什麼服務,通通都去問 NPM,讓 NPM 統一替我們處理請求。這就是所謂的代理(proxy)。
在此架構中,NPM 可以運行在與 HA 同網路的另一個設備中、與 HA 同一個設備中的不同容器(如 docker)中、或甚至以 add-on 的形式裝在 HA 身上(該附加元件在這裡)。而我此處是運行在與 HA 同網路的另一個設備中,可以參考一下我目前的架構:
編輯 configuration.yaml
設定
因為 Home Assistant 自帶的安全性策略,在我們親自設定之前,並不會允許 proxy 轉過來的連線請求。所以我們要來編輯一下 configuration.yaml
。(至於如何找到並編輯 configuration.yaml
我們在 智能家居 EP7:File Editor 有討論過,還請參考。)
而因為 智能家居 EP9:利用DDNS、通訊埠轉發進行遠端控制 那時候我們是透過 DuckDNS 替我們弄 SSL 的,所以 configuration.yaml
中本來是:
1 | http: |
但我們現在要把 SSL 的事務交給 NPM,這邊的就要取消掉,變成:
1 | http: |
其中的 use_x_forwarded_for
就是允許 proxy 轉發,而 trusted_proxies
就是你 NPM 所在的位置。
DuckDNS 設定
DDNS 的部分我們一樣繼續使用 DuckDNS 的服務:
但一樣到 DuckDNS 在 HA 的附加元件中的設定把 SSL 的服務關閉:
1 | lets_encrypt: |
Nginx Proxy Manager 設定
接著我們到 NPM 設定。
Domain Name 就填入 DuckDNS 申請的域名,以後只有透過這個名字進來的請求,才轉發給 HA。反之,如果直接用 IP 位置訪問,NPM 會說你要做啥,不講清楚我可不讓進。
Forward Hostname 跟 Forward Port 就是你本來端口轉發的目的(也就是 HA 的位置)。
注意此處的 scheme 要選擇 http,這表示連入之後,內網部分就用 http 溝通即可。而 Websockets Support 必須打開,因為 HA 的前後端確實是用 websocket 持續溝通的(才能在你關燈之後,不需重新整理就顯示已關閉)。
而 SSL 的部分我們就全部打開。
關掉端口轉發!
最後,我們本來特別開給 HA 的 port 就可以關掉了。保留 80 跟 443 給 NPM 即可:
如此一來,設定完畢。我們的遠端訪問方式已經從端口轉發進階成反向代理,除了更安全之外,家中網路的架構也變得更有條有理,再也不需要到處打洞開 port 了。
不過話說回來,DuckDNS 只有五個域名可以用,那如果我有更多需求的話,有什麼其他選擇嗎?還請留言告訴我,感謝各路大神。