用 UniFi Controller 實現小孩的網路使用時段控制

2022/05/31更新:若使用 UDM-Pro / UDM-SE 可參考此文章 「用 UniFi UDM-Pro / UDM-SE 實現小孩的網路使用時段控制

原本先前不管使用 Asus RT-AC86u / Asus RT-AC66u 或是 Fortigate 50e 來作為路由器管理,對於裝置的使用時段都可以很簡單的透過系統管理網頁進行管理,最近在測試 UniFi Controller 與 UniFi Security Gateway (USG-3P) 的整合時,發現 UniFi Controller 的管理介面中竟然沒有任何時段的控制,這真是令我大吃一驚。後來上網搜尋了一下,大約得知若是搭配 UniFi 的 AP 系列,在無線網路的管理介面中就可以設定使用時段的控制,可惜現階段我並沒有任何 UniFi 的 AP,而且若要控制的裝置是使用有線的網路,那也無法從無線網路的管理介面中進行管控。

再進一步研究進階的文章之後,發現其實還是有方法可以搭配管理介面並透過檔案參數的設定,來達到裝置的使用時段控制。以下是參考這篇文章([GUIDE] Step-By-Step Parent Control – Custom Firewall Rule Instructions for USG)並且經過多次測試失敗,才發現原來自己沒看清楚該篇文章開頭提到的注意事項,才多走了一些冤枉路。以下就開始進行說明:

  • 新增預計要管控裝置的區網 IP 群組

首先預計要管控的裝置在區網中必須設定為固定 IP,如此一來才能避免因為裝置 IP 的變動,而無法達到阻擋連線的目的。至於怎麼設定裝置為固定 IP 不在此篇文章的討論範圍,請自行搜尋研究。

  1. 新增要管控裝置的區網 IP 群組

像我家小孩要管控的裝置有兩台,所以我就設定了一個 IPv4 的 IP 群組,名為「小孩的裝置」,其中把兩台裝置的固定 IP 設定進去。

  1. 新增不做任何管控的群組

這個群組的目的是為了臨時可以取消管控而設定,(請特別注意,取消裝置使用時間的管控並不是從防火牆的規則進行關閉disable,先前我就是卡在這邊錯很久),所以新增群組以後,不設定任何裝置。

群組設定完畢後,會顯示這樣

  • 依據需求新增防火牆的阻擋規則

IP群組設定好之後,因為是要管控區網裝置往外連線,所以就可以來設定 LAN_OUT 防火牆規則,但這邊的防火牆規則也僅止於設定要管控的裝置 IP 群組而已,至於時間的設定則在下一階段在 UniFi Controller 上透過參數設定檔來進行設定。依據我家小孩允許使用網路的時間,平常週日~週四都是晚上 9:00準時關電視,而隔天放假的週五跟週六則是允許可以看到晚上 10:30,所以平常的時候就會需要兩組防火牆的設定。另外,為了某些時候可能會使用到更晚的時段(例如:寒暑假),所以可能會需要第三組規則。以下就來設定各個防火牆規則。

  1. 限制使用時間-週間時段隔天上課 (週日~週四21:00-07:00)

名稱:可以設定為自己好辨識的,所以我就設定為「限制使用時間-週間時段隔天上課 (週日~週四21:00-07:00)」。
已啟用:請務必開啟。
規則已套用:請設定在「預設規則之前」。
操作:既然要阻擋,當然請設定為「丟棄」。
IPv4協議:請選擇「全部」。
紀錄(啟用日誌記錄):可勾選也可以不勾,端看是否符合規則時是否要記錄阻擋的軌跡。
目的的目標類型請選擇為「地址/埠群組」,其次 IPv4 地址群組請從下拉選單選擇剛剛建立的「小孩的裝置」群組。

時段的部分如同剛剛前面提到的,在下一階段才會從 UniFi Controller 的參數設定檔進行設定。

  1. 限制使用時間-週間時段隔天放假 (週五~週六22:30-07:00)

這條規則設定的目的是週五週六延長使用時間到晚上 10:30,但因為時段的部分如同剛剛前面提到的,在下一階段才會從 UniFi Controller 的參數設定檔進行設定,所以這條規則的設定跟前一條規則設定完全相同,只有名稱的不同而已,所以名稱我就設定為「限制使用時間-週間時段隔天放假 (週五~週六22:30-07:00)」,其餘選項說明請參考第一條規則。

名稱:可以設定為自己好辨識的,所以我就設定為「限制使用時間-週間時段隔天放假 (週五~週六22:30-07:00)」。

  1. 限制使用時間-寒暑假期間隨便用 (週一~週日00:00-07:00)

這條規則設定的目的在於可能某些時候可以使用到更晚,例如寒暑假的時候,但因為目前不套用,所以「目的」中的「IPv4地址群粗」請設定為剛剛建立的「取消限制」群組,也就是不套用到任何裝置上。

名稱:可以設定為自己好辨識的,所以我就設定為「限制使用時間-寒暑假期間隨便用 (週一~週日00:00-07:00)」。
已啟用:請務必開啟。
規則已套用:請設定在「預設規則之前」。
操作:既然要阻擋,當然請設定為「丟棄」。
IPv4協議:請選擇「全部」。
紀錄(啟用日誌記錄):可勾選也可以不勾,端看是否符合規則時是否要記錄阻擋的軌跡。
目的的目標類型請選擇為「地址/埠群組」,其次 IPv4 地址群組請從下拉選單選擇剛剛建立的「取消限制」群組。

三個規則都設定完畢後,請回到防火牆 LAN_OUT 規則清單中,應該可以看到如下的設定。請注意抄下紅框中我們新增的這三條防火牆規則的規則編號,在這裡的範例就是要抄下 2000/2001/2002這三組數字,同時請勿隨意拖拉防火牆的先後規則順序,否則規則編號也會跟著跳動改變,由於下一階段的參數設定是依據規則編號來進行管控,如果規格編號跳動了,那麼管控當然也會跟著不如預期了。

未來若臨時要關閉防火牆規則,請不要將「已啟用」狀態改為關閉(這樣下一階段的設定完畢後,在 UniFi Controller 的 server.log 就會出現 ‘action’ must be defined 的錯誤訊息,同時造成 USG-3P 一直處於「同步中」的狀態),「已啟用」狀態必須一直保持啟用,若要臨時關閉阻擋的效果,請編輯進入規則,並調整目的的裝置群組為「取消限制」群組即可。

  • 在 UniFi Controller 主機上設定參數檔

好了,終於到最重要的部分,也就是使用時段的管控到底要如何設定呢?

其實就是要在 UniFi Controller 上新增一個 config.gateway.json 的設定檔,config.gateway.json 的設定檔則是在 <unifi_base>\data\sites\<站台代號> 路徑下。<unifi_base> 路徑會依據作業系統的不同而有所變化,各個作業系統的路徑可以參考此篇文章(UniFi – Where is <unifi_base>?)來尋找。因為我使用的是 Windows VM,所以路徑就在 UniFi Controller 的安裝路徑下,也就是 C:\Users\<使用者名稱>\Ubiquiti UniFi。而完整設定檔路徑在 <unifi_base>\data\sites\<站台代號>下面,由於我只有一個預設站台,所以路徑就在 C:\Users\<使用者名稱>\Ubiquiti UniFi\data\sites\default。若有其他站台,對應路徑可以參考先前提到的文章([GUIDE] Step-By-Step Parent Control – Custom Firewall Rule Instructions for USG),裡面寫得很清楚。

所以要做到使用時段的管控,請在這個路徑下,新增一個 config.gateway.json 檔案,依據前面的防火牆規則定義以及規則編號,設定檔案內容如下:

{
    "firewall":{
       "name":{
          "LAN_OUT":{
             "rule":{
                "2000":{
                   "time":{
                      "starttime":"21:00:00",
                      "stoptime":"07:00:00",
                      "weekdays":"Sun,Mon,Tue,Wed,Thu"
                   }
                },
                "2001":{
                   "time":{
                      "starttime":"22:30:00",
                      "stoptime":"07:00:00",
                      "weekdays":"Fri,Sat"
                   }
                },
                "2002":{
                   "time":{
                      "starttime":"00:00:00",
                      "stoptime":"07:00:00"
                   }
                }
             }
          }
       }
    }
 }

上述規則的設定邏輯,規則編號 2000,設定規則生效時間為週日到週四 21:00~隔天早上 07:00。規則編號 2001,設定規則生效時間為週日到週五及週六的 22:30~隔天早上 07:00。最後一條規則編號 2002,則是不分週一~週日,固定生效時間為 00:00~隔天早上 07:00,不過由於目前第三條規則套用的群組為「取消限制」,所以並不會有任何裝置被套用。

存檔完成之後,就可以回到 UniFi Controller 管理介面的裝置清單,然後找到防火牆管控的機器(在我的環境下就是 UniFi Security Gateway, USG-3P)點下小齒輪進行裝置管理。再選擇「裝置管理」裡的「強制同步」即可,即可強迫 USB-3p 重新載入防火牆的設定。

以上應該就可以生效對於區網裝置的使用時段管控。

如果從 UniFi Controller 管理介面中發現一直處於「同步中」的狀態,可能有幾種情形:

  1. 設定檔的 json 格式有誤,請注意務必前後括號要對稱,可以找線上找一些 json 格式驗證的網站測試一下檔案格式是不是有錯誤。
  2. 檢查 UniFi Controller 的 server.log(路徑位於C:\Users\<使用者名稱>\Ubiquiti UniFi\logs),從這兒可以觀察為何無法同步成功的一些錯誤訊息。如果發現有 ‘action’ must be defined 的錯誤訊息,類似下圖的黃底訊息,這是因為我們新增的三條防火牆規則,已啟用狀態被設定為「關閉」,改為啟用即可

以上隨筆紀錄自己的實驗結果。

 

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料