在Ubuntu下的進階UFW防火牆管理

前言

UFW;全名是「Uncomplicated Firewall」,其目的是提供一組輕量化模組並可以輕易地去操作複雜的iptables來設定防火牆的規則,從Ubuntu 8.0.4的版本開始,該指令就預設並內建在該版本Linux發佈版中。

在之前的文章中,已經有簡單的說明使用UFW如何在Ubuntu下的作業系統進行控制IPTable,設定規則等方式,在這篇文章中,要再詳述有關於UFW的更進階的設定與應用。

指令使用

若我們要看目前的防火牆規則有哪一些,則我們可以透過下列的指令來看到目前設定的規則清單:


sudo ufw status

上述的指令執行之後,所產生的訊息如下:


localadmin@dbteam3:~$ sudo ufw status
Status: active

To Action From
-- ------ ----
Anywhere DENY 10.41.0.0/24
60105/tcp ALLOW Anywhere
8000/tcp ALLOW Anywhere
8080/tcp ALLOW Anywhere
80/tcp ALLOW Anywhere
443/tcp ALLOW Anywhere
60105/tcp (v6) ALLOW Anywhere (v6)
8000/tcp (v6) ALLOW Anywhere (v6)
8080/tcp (v6) ALLOW Anywhere (v6)
80/tcp (v6) ALLOW Anywhere (v6)
443/tcp (v6) ALLOW Anywhere (v6)

若要讓上述產生的規則清單具有編號的話,則可以將上述的指令後面再加上「numbered」之參數,則可以變成下列的指令:


sudo ufw status numbered

上述的指令執行完成之後,則輸出的訊息如下:


localadmin@dbteam3:~$ sudo ufw status numbered
Status: active

To Action From
-- ------ ----
[ 1] Anywhere DENY IN 10.41.0.0/24
[ 2] 60105/tcp ALLOW IN Anywhere
[ 3] 8000/tcp ALLOW IN Anywhere
[ 4] 8080/tcp ALLOW IN Anywhere
[ 5] 80/tcp ALLOW IN Anywhere
[ 6] 443/tcp ALLOW IN Anywhere
[ 7] 60105/tcp (v6) ALLOW IN Anywhere (v6)
[ 8] 8000/tcp (v6) ALLOW IN Anywhere (v6)
[ 9] 8080/tcp (v6) ALLOW IN Anywhere (v6)
[10] 80/tcp (v6) ALLOW IN Anywhere (v6)
[11] 443/tcp (v6) ALLOW IN Anywhere (v6)

若要刪除規則,則可以透過上面規則清單的編號進行刪除,相關的指令與輸出的訊息如下:


localadmin@dbteam3:~$ sudo ufw delete 1
Deleting:
deny from 10.41.0.0/24
Proceed with operation (y|n)?

從輸出的訊息可知道,會詢問是否要將指定的規則刪除,要刪除則輸入「y」,不要的話則輸入「n」並按下「Enter」按鍵。

若要讓其他的IP不能透過ICMP協定來執行ping的指令,去判斷我們的機器是否有回應,則可以編輯「/etc/ufw/before.rules」檔案並找到下列的檔案內容:


# ok icmp codes for INPUT
-A ufw-before-input -p icmp --icmp-type destination-unreachable -j ACCEPT
-A ufw-before-input -p icmp --icmp-type time-exceeded -j ACCEPT
-A ufw-before-input -p icmp --icmp-type parameter-problem -j ACCEPT
-A ufw-before-input -p icmp --icmp-type echo-request -j ACCEPT

# ok icmp code for FORWARD
-A ufw-before-forward -p icmp --icmp-type destination-unreachable -j ACCEPT
-A ufw-before-forward -p icmp --icmp-type time-exceeded -j ACCEPT
-A ufw-before-forward -p icmp --icmp-type parameter-problem -j ACCEPT
-A ufw-before-forward -p icmp --icmp-type echo-request -j ACCEPT

將上面的檔案內容都註解掉,並執行「sudo ufw  reload」指令去重新載入防火牆之後,其他的機器都不能透過ping指令來判斷我們的機器是否有存活了。

若要指定某個來源的IP位址範圍是禁止訪問我們的機器,則可以透過下列的指令來達成:


sudo ufw insert 1 deny from 45.135.232.0/24

從上述的指令可以知道,插入一個規則,該規則順序是首位,意思是優先權最高(insert 1;1是規則編號1),指定「45.135.232.1」到「45.135.232.254」之IP位址範圍都無法存取該台機器上的port number(埠號)。

若要指定某個IP位址或位址範圍可以透過網路介面名稱連線進來,則可以透過下列的指令:


sudo ufw allow in on ens3 to any port 80

從上述的指令可以得知,允許連上IP位址是配在「ens3」的網路介面並允許(allow)任何的地方IP位址(any)都可以連到該台機器的80埠號。

「on ens3」也可以不填,但不填的話,則是所有在這台機器上面的網路介面都允許任何的地方IP位址(any)都可以連到該台機器的80埠號。

若要設定成拒絕,則將上述的指令內容把「allow」改成「deny」即可,其他的注意事項包括:

  1. 埠號後面還可以再指定是用哪個網路層的協定連上該埠號;例如:可以寫成「80/tcp」或是「80/udp」。
  2. 也可以指定應用層之網際網路協定名稱,這時會去允許/拒絕該協定名稱之預設埠號;例如:可以寫成「http」、「https」或是「ssh」,相關指令範例如下:

sudo ufw allow in ssh

參考資料

  • https://zh.wikipedia.org/zh-tw/Uncomplicated_Firewall
  • https://www.configserverfirewall.com/ufw-ubuntu-firewall/block-pings
  • https://serverfault.com/questions/1067662/how-to-deny-ip-ranges-with-ufw
  • https://www.hostinger.com/tutorials/how-to-configure-firewall-on-ubuntu-using-ufw
  • https://www.digitalocean.com/community/tutorials/how-to-set-up-a-firewall-with-ufw-on-ubuntu-22-04