UFW 防火牆教學:如何設定 VPS 安全規則
學習如何使用 UFW 為 VPS 設定防火牆。本文提供設定 default-deny 策略的步驟,並特別強調在啟用前必須先執行 allow SSH 指令,以避免因封鎖連接埠而導致無法遠端登入系統的風險。
什麼是 UFW 以及為何需要它
UFW 代表 Uncomplicated Firewall,其名稱名副其實。它是 Linux 核心內建防火牆的簡易前端,讓您無需撰寫原始規則,只需輸入如 ufw allow 22/tcp 之類的簡短指令。在全新的 VPS 上,預設情況下所有監聽服務皆可從網路存取。防火牆能反轉此狀態:先拒絕所有連線,再僅允許您實際使用的少數連接埠。僅需約 4 個指令,即可大幅降低系統暴露風險。
在操作之前,請先確認哪些服務正在監聽,因為防火牆將決定這些服務的存取權限。使用 ss -tlnp 查看監聽狀態 是正確的第一步。
避免把自己鎖在系統外的唯一準則
這是許多人畏懼防火牆的原因。如果你啟動 UFW 並設定為預設拒絕(default-deny)策略,卻未先允許 SSH,一旦防火牆生效,你的連線會立即中斷且無法重新連入。避免此問題的關鍵,是在啟用 UFW 之前務必先允許 SSH。以下步驟將依正確順序執行,確保操作安全。
若不慎發生此情況,你並非無計可施:服務供應商提供的 Web Console(透過 VNC 或 Serial 連線)不經過 SSH,因此你可以透過該方式登入,並執行 ufw disable 或新增缺失的規則。
Step 1: 設定預設策略
首先,設定 UFW 拒絕所有連入流量,並允許所有連出流量:
sudo ufw default deny incoming
sudo ufw default allow outgoingdeny incoming 是關鍵部分。這代表若沒有明確的允許規則,任何連接埠對外部而言都是關閉的,即便該連接埠已有服務在監聽。allow outgoing 則讓您的伺服器能正常連線至網路以進行更新等作業。這兩條指令僅修改策略;在第 3 步啟用 UFW 之前,不會執行任何限制。
Step 2: 僅開放必要的連接埠
在啟用前,請先開啟 SSH 以維持連線:
sudo ufw allow 22/tcpUFW 也提供 SSH 速率限制功能:sudo ufw limit 22/tcp 會允許該連接埠,但會封鎖在 30 秒內嘗試 6 次以上連線的 IP,無需額外軟體即可防禦暴力破解腳本。
若您有執行 Web Server,請同時開啟 HTTP 與 HTTPS:
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp僅開放對公眾提供的服務。例如連接埠 5432 的 Postgres 資料庫,幾乎不應設定 allow 規則。應將其綁定至 127.0.0.1,使其僅限本機存取。每個開啟的連接埠都是一個需要防禦的入口,請保持清單精簡。
您可以在此建立完整的 ufw 指令序列,然後依序執行:
Step 3: 啟用並確認已開啟
sudo ufw enable系統會警告此指令可能會中斷現有的 SSH 連線。由於您在 step 2 已允許 22/tcp,因此您的連線不會中斷。請確認結果:
sudo ufw status verboseStatus: active
Default: deny (incoming), allow (outgoing)
To Action From
-- ------ ----
22/tcp ALLOW IN Anywhere
22/tcp (v6) ALLOW IN Anywhere (v6)
80/tcp ALLOW IN Anywhere請閱讀以下兩項資訊。Status: active 表示防火牆正在執行。且每條規則會出現兩次,一次為純文字,一次帶有 (v6),這代表 UFW 同時支援 IPv6 與 IPv4。若缺少 (v6) 行,則表示您的 IPv6 端未受管理,這是一個潛在風險,詳見 IPv6 防火牆專文。
稍後管理規則
若要查看帶有編號的規則以進行刪除:
sudo ufw status numbered
sudo ufw delete 3若要僅允許特定位址存取連接埠(這是將管理服務僅開放給您自身 IP 的良好做法):
sudo ufw allow from 10.0.0.24 to any port 5432 proto tcp防火牆僅是其中一層防禦。它控制可存取連接埠的流量,但無法阻止針對開放連接埠(例如 SSH)的暴力攻擊。針對此問題,請加入 Fail2ban in front of SSH 來封鎖重複違規者。深度防禦(Defence in depth)是指每一層防禦都能補足其他層無法涵蓋的範圍。
只有在了解 連接埠定義與服務監聽方式 後,使用防火牆才有意義;配置防火牆是 新 VPS 前 10 分鐘 的必要步驟。
FAQ
啟用 UFW 會導致 SSH 連線中斷嗎?
若先允許 SSH 則不會。請在執行 sudo ufw enable 之前先執行 sudo ufw allow 22/tcp,連線將保持穩定,因為防火牆已允許 port 22。危險在於啟用預設拒絕(default-deny)的防火牆,卻未設定 SSH 允許規則,這會導致連線中斷。若發生此情況,請透過供應商提供的 VNC 或 serial console 登入,並執行 ufw disable。
VPS 應該開啟哪些 port?
僅開啟需對公網提供的服務。包含用於管理主機的 SSH (22/tcp),以及若有架設網站則需開啟的 HTTP 與 HTTPS (80/tcp, 443/tcp)。其餘所有服務皆應保持拒絕狀態。如資料庫等內部服務應綁定至 127.0.0.1 且不設定任何防火牆規則,以確保無法從網路存取。
UFW 是否支援 IPv6?
在現代 Ubuntu 版本中,是的:/etc/default/ufw 已設定 IPV6=yes,因此每條規則同時適用於兩種協定,且 ufw status 會在 IPv6 規則後加上 (v6) 標記。相關錯誤處理方式請參閱 IPv6 防火牆陷阱。
如何刪除 UFW 規則?
執行 sudo ufw status numbered 以列出帶有索引編號的規則,接著執行 sudo ufw delete N,其中 N 為欲刪除的規則編號。您也可以透過規格刪除,例如 sudo ufw delete allow 80/tcp。
如何僅允許特定 IP 位址存取 port?
請使用 from 規則,而非一般的 allow。若要僅允許辦公室位址存取 PostgreSQL,請執行 sudo ufw allow from 10.0.0.10 to any port 5432 proto tcp。在預設拒絕的策略下,port 在規則開啟前對所有人都是關閉的,因此此 from 規則是唯一的進入方式:整個網際網路仍會被封鎖,僅您指定的位址可以通過。請勿同時新增一般的 allow 5432/tcp,否則會將 port 對所有人開放。這是公開資料庫或管理介面最安全的方式。執行 sudo ufw status verbose 可確認結果,該指令會在 port 旁顯示來源位址。