Ubuntu 22.04 防火牆設定完整教學(UFW iptables 安裝、規則與實務應用)
Ubuntu 22.04 為什麼需要設定防火牆? Ubuntu 22.04 Server 如果直接暴露在公開網路上,SSH、Web、資料庫或管理後台都有可能被掃描與攻擊。防火牆的目的,就是只允許必要的連線進入伺服器,其他不必要的流量一律阻擋。
Ubuntu 22.04 為什麼需要設定防火牆?
Ubuntu 22.04 Server 如果直接暴露在公開網路上,SSH、Web、資料庫或管理後台都有可能被掃描與攻擊。防火牆的目的,就是只允許必要的連線進入伺服器,其他不必要的流量一律阻擋。
在 Ubuntu 22.04 中,最常見的防火牆管理方式有兩種:UFW 與 iptables。UFW 適合新手與一般伺服器管理,語法簡單、容易維護;iptables 則比較底層,適合需要精細控制規則、NAT、轉發或進階安全策略的管理者。
本文會從實務角度說明 Ubuntu 22.04 防火牆設定流程,包含 UFW 安裝與規則設定、iptables 基本規則、Port 開放與封鎖、IP 白名單與黑名單、服務啟動關閉、連線測試、故障排除與進階安全建議。
本文會完成哪些內容?
- 了解 UFW 與 iptables 的差異
- 檢查 Ubuntu 22.04 是否已安裝 UFW
- 啟用、停用與重設 UFW 防火牆
- 開放 SSH、HTTP、HTTPS 常用 Port
- 允許指定 IP 連線到 SSH
- 封鎖指定 IP 或網段
- 查看與刪除 UFW 防火牆規則
- 使用 iptables 查看底層規則
- 建立 iptables 基本允許與封鎖規則
- 測試防火牆是否正常運作
- 避免設定錯誤導致自己無法 SSH 登入
- 整理常見故障排除與 Q&A
- 補充伺服器防火牆實務應用與進階強化建議
UFW 與 iptables 有什麼不同?
UFW 全名是 Uncomplicated Firewall,是 Ubuntu 常用的防火牆管理工具。它的目標是讓防火牆規則設定變得簡單,例如 ufw allow 22/tcp 就能開放 SSH Port。
iptables 則是 Linux 傳統的封包過濾工具,可以直接設定 INPUT、OUTPUT、FORWARD 等 chain,也可以處理 NAT、Port forwarding、封包狀態與更細節的規則。UFW 實際上會在底層產生對應的防火牆規則,因此你可以把 UFW 視為比較容易操作的上層管理工具。
對大多數 Ubuntu 22.04 Server 來說,建議先使用 UFW 管理基本防火牆規則。只有在需要更複雜的封包控制、NAT、路由轉發或進階安全策略時,再使用 iptables。
- UFW:語法簡單,適合一般伺服器防火牆設定
- iptables:控制細緻,適合進階網路與安全規則
- UFW 適合管理 SSH、HTTP、HTTPS、MySQL 等常用服務
- iptables 適合做 NAT、Port forwarding、封包轉發與進階封鎖策略
- 初學者建議先用 UFW,熟悉後再學 iptables
安裝前準備與安全提醒
在遠端伺服器上設定防火牆時,最重要的是不要把自己鎖在外面。啟用防火牆前,請先確認 SSH Port 已經被允許。如果你已經把 SSH 改成非 22 Port,例如 2222,也要先開放新的 Port。
正式操作前,建議保留一個已登入的 SSH 視窗,不要立刻關閉。設定完成後,再開啟新的終端機測試是否能重新登入。確認新連線正常後,再關閉舊連線。
- 確認目前 SSH Port,例如 22 或 2222
- 啟用防火牆前先允許 SSH Port
- 遠端操作時保留一個已登入的 SSH 視窗
- 修改規則後用新視窗測試連線
- 雲端主機還要確認 Security Group 或防火牆規則
- 不要在不了解規則的情況下直接 deny incoming
Step 1:檢查 UFW 是否已安裝
Ubuntu 22.04 通常已內建 UFW,但在最小化安裝環境中仍建議先確認。
sudo ufw status
如果系統顯示 command not found,可以使用 apt 安裝 UFW。
sudo apt update
sudo apt install ufw -y
Step 2:查看目前防火牆狀態
安裝完成後,先查看目前 UFW 狀態。預設情況可能是 inactive,代表防火牆尚未啟用。
sudo ufw status verbose
常見輸出如下。
Status: inactive
Step 3:設定 UFW 預設規則
一般伺服器防火牆的基本原則是:預設拒絕外部連入,允許伺服器對外連線。也就是 deny incoming、allow outgoing。
sudo ufw default deny incoming
sudo ufw default allow outgoing
這代表外部不能任意連入你的伺服器,但伺服器仍可正常對外更新套件、下載檔案或連線到外部服務。
Step 4:先開放 SSH Port,避免遠端斷線
啟用 UFW 前一定要先允許 SSH。若你使用預設 22 Port,可以使用 OpenSSH profile 或直接開放 22/tcp。
sudo ufw allow OpenSSH
或使用 Port 寫法:
sudo ufw allow 22/tcp
如果你的 SSH Port 已改成 2222,請改成:
sudo ufw allow 2222/tcp
Step 5:啟用 UFW 防火牆
確認 SSH Port 已開放後,就可以啟用 UFW。啟用前請再次確認目前仍有一個 SSH 連線保持開啟。
sudo ufw enable
啟用後查看目前規則。
sudo ufw status verbose
Step 6:開放 HTTP 與 HTTPS 網站服務
如果這台 22.04 Server 要架設網站,需要開放 HTTP 80 與 HTTPS 443 Port。
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
如果系統安裝 Apache,也可以使用 UFW 的應用程式 profile。
sudo ufw app list
sudo ufw allow 'Apache Full'
Apache Full 通常會同時允許 HTTP 與 HTTPS。
Step 7:允許指定 IP 連線到 SSH
比起直接開放 SSH 給所有來源,更安全的做法是只允許你的固定管理 IP 連線。以下範例允許 203.0.113.10 連線到 22/tcp。
sudo ufw allow from 203.0.113.10 to any port 22 proto tcp
如果你的 SSH Port 是 2222,則改成:
sudo ufw allow from 203.0.113.10 to any port 2222 proto tcp
這種方式適合固定辦公室 IP、VPN 管理網段或只允許特定管理者連線的伺服器。
Step 8:封鎖指定 IP 或網段
如果你發現某個 IP 不斷掃描或攻擊伺服器,可以使用 UFW 封鎖該 IP。
sudo ufw deny from 198.51.100.23
也可以封鎖整個網段。
sudo ufw deny from 198.51.100.0/24
如果要封鎖該來源連線到特定 Port,例如 SSH:
sudo ufw deny from 198.51.100.23 to any port 22 proto tcp
Step 9:查看 UFW 規則編號
當規則越來越多時,建議使用 numbered 模式查看規則編號,方便後續刪除或調整。
sudo ufw status numbered
輸出範例如下。
Status: active
To Action From
-- ------ ----
[ 1] 22/tcp ALLOW IN Anywhere
[ 2] 80/tcp ALLOW IN Anywhere
[ 3] 443/tcp ALLOW IN Anywhere
[ 4] Anywhere DENY IN 198.51.100.23
Step 10:刪除 UFW 防火牆規則
刪除規則有兩種方式,一種是依規則內容刪除,另一種是依 numbered 編號刪除。實務上,編號刪除比較直覺。
sudo ufw delete 4
也可以用完整規則刪除。
sudo ufw delete deny from 198.51.100.23
UFW 服務啟動、停用、重設與狀態查詢
UFW 常用管理指令如下。請注意,disable 會停用防火牆,reset 會重設所有 UFW 規則,正式主機操作前要小心。
sudo ufw enable
sudo ufw disable
sudo ufw reload
sudo ufw reset
sudo ufw status
sudo ufw status verbose
sudo ufw status numbered
常用 UFW 規則範例
以下整理 Ubuntu 22.04 Server 最常用的 UFW 規則。
# 開放 SSH
sudo ufw allow 22/tcp
# 開放自訂 SSH Port
sudo ufw allow 2222/tcp
# 開放 HTTP
sudo ufw allow 80/tcp
# 開放 HTTPS
sudo ufw allow 443/tcp
# 開放 MySQL,只建議內網或指定來源使用
sudo ufw allow from 192.168.1.0/24 to any port 3306 proto tcp
# 封鎖指定 IP
sudo ufw deny from 198.51.100.23
# 只允許指定 IP 連 SSH
sudo ufw allow from 203.0.113.10 to any port 22 proto tcp
Step 11:使用 iptables 查看底層防火牆規則
即使你使用 UFW,也可以透過 iptables 查看底層規則。這對除錯、確認封鎖狀態或理解防火牆運作很有幫助。
sudo iptables -L -n -v
你也可以查看 INPUT chain。
sudo iptables -L INPUT -n -v
iptables 基本概念
iptables 主要透過 table、chain 與 rule 管理封包。一般防火牆最常用的是 filter table,其中包含 INPUT、OUTPUT、FORWARD 三個常見 chain。
INPUT 控制進入本機的連線,OUTPUT 控制本機對外連線,FORWARD 控制通過本機轉發的封包。對一般 Web Server 來說,最常操作的是 INPUT chain。
- INPUT:進入本機的封包
- OUTPUT:本機送出的封包
- FORWARD:經由本機轉發的封包
- ACCEPT:允許封包
- DROP:丟棄封包
- REJECT:拒絕封包並回應錯誤
- ESTABLISHED:已建立連線
- RELATED:與既有連線相關的封包
Step 12:iptables 開放 SSH、HTTP、HTTPS
如果你要直接使用 iptables 管理防火牆,可以手動加入允許規則。以下範例開放 SSH、HTTP 與 HTTPS。
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
同時建議允許已建立連線與本機 loopback。
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
Step 13:iptables 封鎖指定 IP
使用 iptables 封鎖指定 IP,可以在 INPUT chain 加入 DROP 規則。
sudo iptables -A INPUT -s 198.51.100.23 -j DROP
如果要封鎖某個 IP 連線到 SSH Port:
sudo iptables -A INPUT -p tcp -s 198.51.100.23 --dport 22 -j DROP
Step 14:iptables 設定預設拒絕連入
iptables 的預設策略非常重要。若要設定預設拒絕 INPUT,必須先確認 SSH、已建立連線與必要服務都已允許,否則可能會中斷遠端連線。
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT
遠端操作時,若你不熟悉 iptables,不建議一開始就直接設定 INPUT DROP。新手建議先使用 UFW。
Step 15:儲存 iptables 規則
iptables 規則預設重開機後可能消失。如果你直接使用 iptables 管理規則,可以安裝 iptables-persistent 來保存規則。
sudo apt install iptables-persistent -y
sudo netfilter-persistent save
sudo netfilter-persistent reload
儲存後,系統會在開機時自動載入目前規則。
Step 16:測試防火牆是否正常運作
設定防火牆後,應該測試 SSH、HTTP、HTTPS 是否符合預期。你可以從另一台主機使用 ssh、curl 或 nc 測試連線。
# 測試 SSH
ssh -p 22 user@your-server-ip
# 測試 HTTP
curl -I http://your-server-ip
# 測試 HTTPS
curl -I https://your-domain.com
# 測試 Port 是否開放
nc -vz your-server-ip 22
nc -vz your-server-ip 80
nc -vz your-server-ip 443
如果是在本機測試,可以使用 ss 查看服務是否有監聽對應 Port。
sudo ss -tulpn
常見伺服器防火牆設定情境
情境 1:一般網站伺服器
一般網站伺服器通常只需要開放 SSH、HTTP 與 HTTPS。MySQL、Redis、管理後台等服務不應該直接對外公開。
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
情境 2:只允許固定 IP 管理 SSH
若你的管理 IP 固定,建議只允許該 IP 連 SSH,其他來源一律不能登入。
sudo ufw allow from 203.0.113.10 to any port 22 proto tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
情境 3:MySQL 只允許內網連線
資料庫不應該開放給全世界連線。如果必須開放 MySQL,應限制來源為內網或指定主機。
sudo ufw allow from 192.168.1.0/24 to any port 3306 proto tcp
情境 4:封鎖惡意掃描 IP
如果你從 access log、auth.log 或安全系統發現惡意 IP,可以直接封鎖。
sudo ufw deny from 198.51.100.23
常見故障排除
問題 1:啟用 UFW 後 SSH 連不上
這通常是因為啟用 UFW 前沒有先允許 SSH Port,或 SSH 已改成自訂 Port 但防火牆仍只開放 22。
sudo ufw status numbered
sudo ss -tulpn | grep ssh
sudo ufw allow 22/tcp
sudo ufw allow 2222/tcp
如果已經無法透過 SSH 連線,需要透過雲端主控台、VNC、實體 Console 或救援模式修正防火牆規則。
問題 2:網站無法從外部開啟
請確認 Web Server 是否有啟動、防火牆是否開放 80 與 443,以及雲端安全群組是否也有允許。
sudo systemctl status apache2
sudo systemctl status nginx
sudo ufw status verbose
sudo ss -tulpn | grep -E ':80|:443'
問題 3:UFW 規則設定錯誤想全部重來
可以使用 ufw reset 重設規則,但正式主機要小心,因為所有規則會被清除。重設後請先重新允許 SSH,再啟用防火牆。
sudo ufw reset
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 22/tcp
sudo ufw enable
問題 4:iptables 規則重開機後消失
iptables 規則若沒有保存,重開機後可能會消失。可以使用 iptables-persistent 保存規則。
sudo apt install iptables-persistent -y
sudo netfilter-persistent save
問題 5:UFW 與 iptables 規則看起來不一致
UFW 會產生自己的 iptables 規則。如果你同時手動改 iptables,又使用 UFW,可能會造成規則順序與管理混亂。一般建議選一種主要管理方式,除非你非常清楚底層規則。
sudo ufw status verbose
sudo iptables -L -n -v
防火牆安全強化建議
- 預設拒絕外部連入,只開放必要服務
- SSH 不建議直接開放給全世界,最好限制來源 IP 或 VPN
- HTTP 與 HTTPS 可公開,但後台登入路徑應另外保護
- 資料庫服務不要直接暴露到公網
- Redis、Memcached、Elasticsearch 等服務不得公開開放
- 定期檢查 ufw status numbered
- 定期查看 auth.log 與 web access log
- 搭配 Fail2ban 自動封鎖暴力破解 IP
- 雲端主機需同時檢查系統防火牆與 Security Group
- 重要服務修改規則前先保留既有 SSH 連線
- 將防火牆規則納入維運文件與備份
進階應用:UFW 搭配 Fail2ban
UFW 負責靜態防火牆規則,例如允許 22、80、443;Fail2ban 則負責動態封鎖攻擊來源,例如 SSH 暴力破解 IP。這兩者搭配起來,是 Ubuntu Server 很常見的基礎防護架構。
例如你可以使用 UFW 限制只開放必要 Port,再用 Fail2ban 監控 /var/log/auth.log,當同一個 IP 短時間內多次登入失敗,就自動封鎖。
sudo apt install fail2ban -y
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
sudo fail2ban-client status
進階應用:防火牆搭配 GateKeeper 或網站安全系統
防火牆主要處理網路層與 Port 存取控制,但網站攻擊通常還會發生在應用層,例如 Bot 掃描、惡意 User-Agent、暴力登入後台、異常請求路徑與爬蟲濫用。
因此比較完整的架構是:UFW 或 iptables 負責第一層 Port 與 IP 控制,Fail2ban 負責動態封鎖登入攻擊,GateKeeper 或網站安全系統負責分析 Web 行為、Geo 來源、Bot 指紋與風險事件。
Internet
↓
UFW / iptables:限制 Port 與 IP 來源
↓
Fail2ban:封鎖 SSH / Web 暴力破解 IP
↓
Apache / Nginx:提供網站服務
↓
GateKeeper:分析 Bot、Geo、User-Agent、異常行為
↓
Web / CMS / API 系統
Q&A 常見問題
Q1:Ubuntu 22.04 建議用 UFW 還是 iptables?
一般伺服器建議先使用 UFW,因為語法簡單、容易維護。iptables 適合需要進階封包控制、NAT、轉發或複雜規則的情境。
Q2:啟用 UFW 會不會讓 SSH 斷線?
如果啟用前沒有允許 SSH Port,就可能造成遠端 SSH 無法重新連線。因此啟用 UFW 前一定要先執行 sudo ufw allow 22/tcp,或開放你實際使用的 SSH Port。
Q3:UFW 可以封鎖指定 IP 嗎?
可以。可以使用 sudo ufw deny from IP_ADDRESS 封鎖指定 IP,也可以封鎖整個 CIDR 網段。
sudo ufw deny from 198.51.100.23
sudo ufw deny from 198.51.100.0/24
Q4:MySQL Port 3306 可以直接開放嗎?
不建議直接對公網開放 MySQL。若必須遠端連線,應限制來源 IP 或 VPN 網段,並搭配 MySQL 帳號權限與強密碼。
Q5:iptables 規則和 UFW 規則可以一起用嗎?
技術上可以,但不建議新手混用。UFW 會在底層管理 iptables 規則,如果再手動加入大量 iptables 規則,容易造成規則順序與維護混亂。
Q6:如何確認防火牆真的有擋住連線?
可以從另一台主機使用 nc、curl、ssh 測試 Port 是否開放,也可以使用 ufw status、iptables -L -n -v 查看規則與封包計數。
nc -vz your-server-ip 22
curl -I http://your-server-ip
sudo ufw status verbose
sudo iptables -L -n -v
延伸閱讀與內鏈建議
- Ubuntu 22.04 SSH 安全最佳實務
- Ubuntu 22.04 Fail2ban 安裝與設定教學
- Linux Server Hardening 伺服器安全強化
- Ubuntu 22.04 LAMP Server 安裝教學
- iptables 防火牆規則進階教學
- GateKeeper Bot 防護與攻擊來源分析
總結
Ubuntu 22.04 防火牆設定的核心原則是:預設拒絕不必要的連入,只開放真正需要的服務。對一般網站伺服器來說,通常只需要開放 SSH、HTTP 與 HTTPS,而資料庫、Redis、內部管理服務不應直接暴露到公網。
UFW 適合大多數 Ubuntu Server 使用者,語法簡單、維護容易;iptables 則適合需要更細緻封包控制、NAT 或進階網路策略的管理者。若你是初學者,建議先用 UFW 建立穩定的防火牆基礎,再逐步學習 iptables。
如果你的 we-blog CMS 要做 AI SEO,這篇文章已經包含 UFW、iptables、安裝、設定、測試、服務管理、故障排除、Q&A 與進階實務應用,適合拆成 post_blocks 儲存,也適合後續產生 FAQ Schema、HowTo Schema、Related Posts 與 AI 搜尋摘要。