本篇將教您如何使用 CloudFlare 來保護您的 Home Assistant。

事前準備

  • 擁有一個網域:如未購買可參考 Gandi.net 購買,可依自身需求選擇適合的網域、價位 )
  • Home Assistant
  • CloudFlare 帳號:請先註冊,並將擁有的網域設定上去

將 Home Assistant 的預設 Port 進行更換

目前 CloudFlare 所支援的 HTTPS Port 如下:

  • 443
  • 2053
  • 2083
  • 2087
  • 2096
  • 8443

所以在這之前,我們需要把 Home Assistant 的 Port 更改為 CloudFlare 所支援的 HTTPS Port 。

在設定檔中,設定 http integration 中的  server_port,這邊以8443作為範例

http:
  server_port: 8443

修改完成之後,重新啟動Home Assistant,並且如果在路由器中有設定Port Forwarding規則的話,也要一併更改。

在 CloudFlare 中新增一個子網域

前往 CloudFlare 的 DNS 控制台,新增子網域址向您的 Home Assistant。

  • 按新增紀錄
  • 類型選擇 CNAME
  • 名稱設定為您想要的子網域(這邊以 homeassistant 作為範例)
  • 目標填寫您 DuckDNS 所對應的網域
  • Proxy 狀態請記得打勾,要不然無法透過 CloudFlare 進行保護

設定 CloudFlare 的加密模式

前往 CloudFlare 控制台,將加密模式設定為完整 (嚴格)。

CloudFlare控制台>選單>SSL/TLS>概覽>加密模式

為 Home Assistant 設定 SSL 證書

這時候試試先可以試試看能不能透過您的子網域連線上去,前往 https://homeassistant.您的網域:8443。

這時您可能會發現網頁顯示Error 526(Invalid SSL certificate)的錯誤。

因為這只有從您到Cloudflare有進行加密連線,而Cloudflare與HomeAssistant之間是沒有加密連線的,所以我們要讓Cloudflare與HomeAssistant之間進行加密連線。

圖片來源: CloudFlare

那在這裡,我們可以使用 CloudFlare 提供的原點憑證(Origin Certificate)來達到 CloudFlare 與 Home Assistant 之間的加密連線。

CloudFlare控制台>選單>SSL/TLS>原始伺服器>建立憑證

在主機名稱的選項中,選擇剛剛新增的子網域後按下建立。

這時候會看到原點憑證(Origin Certificate)與私密金鑰(Private Key),將這兩個內容,分別使用電腦中的文字編輯器儲存下來,並上傳至HomeAssistant。

  • 將原點憑證(Origin Certificate)另存到名稱叫做origin.pem的檔案
  • 將私密金鑰(Private Key)另存到名稱叫做origin.pem的檔案
  • 將這兩個上傳到 <您的Homeassistant>\ssl\cloudflare路徑中

再來在設定檔中,設定 http integration 中的  ssl_certificate 與 ssl_key 的路徑到剛剛上傳的檔案。

http:
  server_port: 8443
  ssl_certificate: /ssl/cloudflare/origin.pem
  ssl_key: /ssl/cloudflare/private.pem

修改完成之後,重新啟動Home Assistant,使CloudFlare與HomeAssistant之間進行加密連線。

圖片來源: CloudFlare

這時候再次前往 https://homeassistant.您的網域:8443,可以看到已經能夠正常連線了。

阻擋來自非CloudFlare的流量

因為我們現在已經使用CloudFlare來加密流量,但如果有人知道HomeAssistant伺服器的真實IP的話,它就可以繞過CloudFlare直接存取我們的HomeAssistant。

為了避免此狀況,可以前往路由器中的防火牆,設定防火牆規則。

這邊以RouterOS 指令作為範例,先新增 CloudFlare 的 IP 到 Address List (CloudFlare 的IP列表):

# 新增 CloudFlare 的 IPv4 到 CloudFlarev4 列表 
/ip firewall address-list
add list=CloudFlarev4 address=173.245.48.0/20
add list=CloudFlarev4 address=103.21.244.0/22
add list=CloudFlarev4 address=103.22.200.0/22
add list=CloudFlarev4 address=103.31.4.0/22
add list=CloudFlarev4 address=141.101.64.0/18
add list=CloudFlarev4 address=108.162.192.0/18
add list=CloudFlarev4 address=190.93.240.0/20
add list=CloudFlarev4 address=188.114.96.0/20
add list=CloudFlarev4 address=197.234.240.0/22
add list=CloudFlarev4 address=198.41.128.0/17
add list=CloudFlarev4 address=162.158.0.0/15
add list=CloudFlarev4 address=104.16.0.0/12
add list=CloudFlarev4 address=172.64.0.0/13
add list=CloudFlarev4 address=131.0.72.0/22

# 新增 CloudFlare 的 IPv6 到 CloudFlarev6 列表
/ipv6 firewall address-list
add list=CloudFlarev6 address=2400:cb00::/32
add list=CloudFlarev6 address=2606:4700::/32
add list=CloudFlarev6 address=2803:f800::/32
add list=CloudFlarev6 address=2405:b500::/32
add list=CloudFlarev6 address=2405:8100::/32
add list=CloudFlarev6 address=2a06:98c0::/29
add list=CloudFlarev6 address=2c0f:f248::/32
再來設定為僅允許來自 CloudFlare 的 IP 連線至 Home Assistant 
# 僅允許 CloudFlarev4 列表中的IP連線
/ip firewall filter add action=drop chain=forward comment="drop from !CloudFlarev4 to 8443" protocol=6 dst-port=8443 src-address-list="!CloudFlarev4"

# 僅允許 CloudFlarev6 列表中的IP連線(有待確認)
/ipv6 firewall filter add action=drop chain=forward comment="drop from !CloudFlarev6 to 8443" protocol=6 dst-port=8443 src-address-list="!CloudFlarev6"

在 Home Assistant 中允許 Proxy 請求

在設定檔中,設定 http integration 中的 use_x_forwarded_for 與 trusted_proxies。

http:
  server_port: 8443
  ssl_certificate: /ssl/cloudflare/origin.pem
  ssl_key: /ssl/cloudflare/private.pem
  use_x_forwarded_for: true
  trusted_proxies:
    - 173.245.48.0/20
    - 103.21.244.0/22
    - 103.22.200.0/22
    - 103.31.4.0/22
    - 141.101.64.0/18
    - 108.162.192.0/18
    - 190.93.240.0/20
    - 188.114.96.0/20
    - 197.234.240.0/22
    - 198.41.128.0/17
    - 162.158.0.0/15
    - 104.16.0.0/13
    - 104.24.0.0/14
    - 172.64.0.0/13
    - 131.0.72.0/22
    - 2400:cb00::/32
    - 2606:4700::/32
    - 2803:f800::/32
    - 2405:b500::/32
    - 2405:8100::/32
    - 2a06:98c0::/29
    - 2c0f:f248::/32

總結

基本上這樣設定完後就可以透過 CloudFlare 來保護您的 Home Assistant了,如上面內容有疏漏,還請告知,我會盡快補充,謝謝。

祝各位有個愉快的智慧家庭體驗。

延伸閱讀

聽說有隻叫做夜空藍喵の夜喵 的頭像

聽說有隻叫做夜空藍喵の夜喵

這位編輯懶到什麼自我介紹也沒打...

在 Home Assistant 上使用 CloudFlare 來保護 - QR Code

本站內容未經授權許可請勿擅自抄襲
如果需引用部分內容請註明來源網址

發表時間:2022/02/17 19:42:41

此頁面網址:https://blog.reh.tw/archives/3194

Facebook 留言