前言
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」即可,其他的注意事項包括:
- 埠號後面還可以再指定是用哪個網路層的協定連上該埠號;例如:可以寫成「80/tcp」或是「80/udp」。
- 也可以指定應用層之網際網路協定名稱,這時會去允許/拒絕該協定名稱之預設埠號;例如:可以寫成「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