2025年2月2日 星期日

Mapleboard MP510-50 測試 (二十二) : 安裝 ufw 防火牆

由於 Hinet 年初更換了我的光世代固定 IP, 趁過年期間將 Mapleboard 主機重開機取得新的固定 IP 後到 Namecheap 將 tony1966.cc 域名綁定到新的固定 IP 恢復了此域名的運作, 接下來要安裝 ufw 防火牆來加強主機安全性, 做法參考 :


本系列測試文章參考 : 



1. 啟用 ufw 防火牆 : 

ufw 是 Uncomplicated FireWall 的縮寫, 具有指令簡單好記, 設定規則淺顯易懂優點, Ubuntu 通常已預設安裝 ufw, 可用下列指令查看防火牆狀態 :
 
sudo ufw status   

one@LX2438:~$ sudo ufw status   
[sudo] one 的密碼: 
狀態:不活動  (inactive)

Inactive 狀態表示雖然 ufw 已安裝卻尚未啟用, 須使用下列指令啟用 (activate) :

sudo ufw enable   

tony1966@LX2438:~$ sudo ufw enable   
[sudo] tony1966 的密碼: 
在系統啟動時啟用防火牆   

在下次啟動時才會啟用 ufw 防火牆. 這時再次檢視防火牆狀態會顯示已啟用 (active) :

tony1966@LX2438:~$ sudo ufw status       
狀態: 啓用   

若執行上述指令出現未找到 ufw 錯誤, 表示系統尚未安裝 ufw (例如屬於 Debian 系統的樹莓派預設並未安裝 ufw), 要先用下列指令安裝 : 

udo apt-get install ufw    


2. 設定防火牆規則

下列指令會顯示目前的防火牆規則 : 

sudo ufw status verbose

tony1966@LX2438:~$ sudo ufw status verbose    
[sudo] tony1966 的密碼: 
狀態: 啓用
日誌: on (low) 
Default: deny (incoming), allow (outgoing), disabled (routed)
新建設定檔案: skip

可見 ufw 預設會拒絕所有進入主機的連線, 但允許所有出去的連線; 預設關閉封包轉送功能 (作為路由器與 VPN 時才需要打開). 日誌功能已開啟, 紀錄等級預設為 low (等級有五個等級 : off/low/medium/high/full), 可用下列指令更改等級 :

sudo ufw logging medium    

如果要更改預設規則可用下列指令 : 

sudo ufw default allow   (不安全, 不建議)
sudo ufw default deny    (較安全, 預設)

接下來要設定主機的允入連線埠號, 由於我這台 Mapleboard MP510-50 主機主要是作為網頁伺服器與 API 測試之用, 因此只要開啟 TCP 協定的埠口即可, UDP 目前用不到不需要開啟. 未來如果要做 DNS 伺服器 (53 埠), NTP 伺服器 (123 埠), 或 VPN 伺服器 (OpenVPN 1194 埠) 等用途再開啟各埠之 UDP. 

首先是埠號 22 的 ssh 遠端連線服務 : 

sudo ufw allow ssh/tcp  或 sudo ufw allow 22/tcp   

tony1966@LX2438:~$ sudo ufw allow 22/tcp       
[sudo] tony1966 的密碼: 
已添加規則
已添加規則 (v6)
 
埠號 80 的 HTTP 連線是作為網頁伺服器主機一定要開啟此埠 :

sudo ufw allow 80/tcp   

tony1966@LX2438:~$ sudo ufw allow 80/tcp   
已添加規則
已添加規則 (v6)

埠號 443 的 HTTPS 連線也是作為網頁伺服器主機一定要開啟的埠號 (雲端的遠端連線服務 RealVNC Cloud 也是透過 443 埠連線) :

sudo ufw allow 443/tcp  

tony1966@LX2438:~$ sudo ufw allow 443/tcp     
已添加規則
已添加規則 (v6)

另外直連的 VNC 使用 5900/5901 埠 (TCP) 也要打開 :  

sudo ufw allow 5900/tcp    

tony1966@LX2438:~$ sudo ufw allow 5900/tcp    
已添加規則
已添加規則 (v6)

tony1966@LX2438:~$ sudo ufw allow 5901/tcp   
[sudo] tony1966 的密碼: 
已添加規則
已添加規則 (v6)

顯示目前的防火牆規則 : 

tony1966@LX2438:~$ sudo ufw status verbose   
狀態: 啓用
日誌: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
新建設定檔案: skip

至                          動作          來自
-                          --          --
22/tcp                     ALLOW IN    Anywhere                  
80/tcp                     ALLOW IN    Anywhere                  
443/tcp                    ALLOW IN    Anywhere                  
5900/tcp                   ALLOW IN    Anywhere                  
5901/tcp                   ALLOW IN    Anywhere                  
22/tcp (v6)                ALLOW IN    Anywhere (v6)             
80/tcp (v6)                ALLOW IN    Anywhere (v6)             
443/tcp (v6)               ALLOW IN    Anywhere (v6)             
5900/tcp (v6)              ALLOW IN    Anywhere (v6)             
5901/tcp (v6)              ALLOW IN    Anywhere (v6)     

如果要刪除規則重新設定, 要先用下列指令查詢規則編號 :

sudo ufw status numbered  

tony1966@LX2438:~$ sudo ufw status numbered    
狀態: 啓用

     至                          動作          來自
     -                          --          --
[ 1] 22/tcp                     ALLOW IN    Anywhere                  
[ 2] 80/tcp                     ALLOW IN    Anywhere                  
[ 3] 443/tcp                    ALLOW IN    Anywhere                  
[ 4] 5900/tcp                   ALLOW IN    Anywhere                  
[ 5] 5901/tcp                   ALLOW IN    Anywhere                  
[ 6] 22/tcp (v6)                ALLOW IN    Anywhere (v6)             
[ 7] 80/tcp (v6)                ALLOW IN    Anywhere (v6)             
[ 8] 443/tcp (v6)               ALLOW IN    Anywhere (v6)             
[ 9] 5900/tcp (v6)              ALLOW IN    Anywhere (v6)             
[10] 5901/tcp (v6)              ALLOW IN    Anywhere (v6)             

然後以下列指令刪除指定編號之規則 :

sudo ufw delete 規則編號     

tony1966@LX2438:~$ sudo ufw delete 1    
刪除中:
 allow 22/tcp
 繼續執行(y|n)? y
已刪除規則 (v6)

如果想要全部重設, 可用下列指令 :

sudo ufw reset 

防火牆規則設定好後毋須重開機, 只要用下列指令重新載入即可 :

sudo ufw reload   

tony1966@LX2438:~$ sudo ufw reload   
已經重新載入防火牆


3. 使用應用程式設定防火牆規則 : 

除了上面利用 port/protocol 方式設定防火牆規則外, 也可以用應用程式名稱來設定, 先用下面指令顯示 ufw 預設的應用程式列表 : 

sudo ufw app list   

one@LX2438:~$ sudo ufw app list    
[sudo] one 的密碼: 
可用套用程序:
  CUPS
  Nginx Full
  Nginx HTTP
  Nginx HTTPS
  OpenSSH

我們可以直接用這些應用名稱來設定其防火牆規則, 不用手動輸入連接埠號碼.

首先用下列指令查詢應用程式的描述 : 

sudo ufw app info "應用程式名稱"   

例如 : 

tony1966@LX2438:~$ sudo ufw app info "Nginx Full"      
設定: Nginx Full
標題:Web Server (Nginx, HTTP + HTTPS)
描述: Small, but very powerful and efficient web server

tony1966@LX2438:~$ sudo ufw app info "Nginx HTTP"     
設定: Nginx HTTP
標題:Web Server (Nginx, HTTP)
描述: Small, but very powerful and efficient web server

埠號:
  80/tcp
tony1966@LX2438:~$ sudo ufw app info "Nginx HTTPS"    
設定: Nginx HTTPS
標題:Web Server (Nginx, HTTPS)
描述: Small, but very powerful and efficient web server

埠號:
  443/tcp
tony1966@LX2438:~$ sudo ufw app info "OpenSSH"   
設定: OpenSSH
標題:Secure shell server, an rshd replacement
描述: OpenSSH is a free implementation of the Secure Shell protocol.

埠號:
  22/tcp
tony1966@LX2438:~$ sudo ufw app info "CUPS"   
設定: CUPS
標題:Common UNIX Printing System server
描述: CUPS is a printing system with support for IPP, samba, lpd, and other
protocols.

如果使用應用程式名稱來設定防火牆規則只要用下列兩個指令即可, 做用與上面指定埠號/協定之效果一樣 :

sudo ufw allow "OpenSSH"       # 開啟 SSH
sudo ufw allow "Nginx Full"    # 開啟 HTTP 和 HTTPS

第一個指令相當於 sudo ufw allow 22/tcp; 第二個指令相當於 sudo ufw allow 80/tcp 與 sudo ufw allow 443/tcp. 


4. 檢視 ufw 防火牆日誌 : 

防火牆日誌檔放在 /var/log 下的 ufw.log, 可以用 less 指令按上下鍵一列一列瀏覽 (輸入 q 跳出) :

sudo less /var/log/ufw.log    




我擷取了一部分 log 請 ChatGPT 說明如下 :

🔹 Feb 4 08:40:43 → 記錄發生的時間
🔹 LX2438 → 你的主機名稱
🔹 kernel: → 這是來自 Linux 核心的訊息
🔹 [UFW BLOCK] → 這表示 UFW 防火牆封鎖了這個封包
🔹 IN=ppp0 → 這個封包來自 ppp0(你的撥接網路介面)
🔹 OUT= → 空白,代表這個封包沒有要轉發到其他網路介面
🔹 SRC=195.230.103.249 → 封包來源 IP(可疑來源)
🔹 DST=1xx.xxx.xxx.x2 → 你的主機 IP(目標 IP)
🔹 LEN=40 → 封包長度(40 bytes)
🔹 PROTO=TCP → 傳輸協定(這是 TCP 封包)
🔹 SPT=50878 → 來源埠(50878,這是動態隨機埠)
🔹 DPT=52217 → 目標埠(52217,通常是隨機端口,可能是掃描攻擊)
🔹 WINDOW=65535 → TCP 視窗大小(這是典型的 TCP 參數)
🔹 RES=0x00 → 預留欄位(一般無特別意義)
🔹 SYN → 這是 SYN 封包(表示有人嘗試建立 TCP 連線)
🔹 URGP=0 → 緊急指標(通常為 0,表示非緊急封包)

這些 log 顯示這些封包可能是惡意掃描或試圖入侵, 但 ufw 防火牆已阻擋了這些試圖連入主機的外部 IP. 目標埠 DPT=81 的連線可能是自動化掃描工具正在尋找開放的 Web 服務 (81 是 HTTP 常用的替代埠號), DPT=8081 表示有人試圖存取 API 或 Web 管理介面 (8081 通常是 HTTP 代理伺服器或管理介面); 而隨機埠 (例如 21804, 1039) 則可能是惡意掃描工具嘗試連線.

如果要連續監看即時的防火牆 log 可用下列指令 :

sudo tail -f /var/log/ufw.log    

此時終端機會被此程序占用, 欲停止監看可按 Ctrl + c (注意是小寫).

如果只想檢視最近幾筆日誌可用 tail 指令, 例如查看最近 50 筆 : 

sudo tail -n 50 /var/log/ufw.log      

可以搭配 grep 指令過濾日誌, 例如過濾最近 20 筆 SSH (22 埠) 連線 :

sudo grep "DPT=22 " /var/log/ufw.log | tail -n 20    

注意 22 後面要加一個空格才不會抓到 22 開頭的埠號. 

或者來自特定 IP 的連線 : 

sudo grep "189.144.115.217" /var/log/ufw.log | tail -n 20   

以上 ufw 指令摘要如下表 : 


 ufw 指令  說明
 sudo ufw enable  啟用 ufw 防火牆
 sudo ufw disable  停用 ufw 防火牆
 sudo ufw status  檢查防火牆狀態
 sudo ufw status verbose  顯示詳細的防火牆狀態
 sudo ufw allow 22/tcp  允許 SSH ( 22 埠 / TCP )
 sudo ufw deny 80/tcp  拒絕 HTTP ( 80 埠 / TCP )
 sudo ufw allow from 192.168.1.100  允許來自 192.168.1.100 的所有連線
 sudo ufw delete allow 22/tcp  刪除允許 SSH 的規則
 sudo ufw reset  重設 ufw 設定,回復到預設狀態
 sudo ufw reload  重新載入防火牆規則


參考 : 


沒有留言:

張貼留言