UFW 防火牆設定教學:安全保護 VPS
學會用 UFW 設定 default-deny,僅允許必要連接埠,並在啟用前先放行 SSH,避免防火牆啟動後失去 VPS 連線。
UFW 是什麼,以及為什麼需要它
UFW 代表 Uncomplicated Firewall,名稱如實反映其用途。它是 Linux kernel 既有防火牆的友善前端,因此不必撰寫原始規則,只要輸入類似 ufw allow 22/tcp 的簡短指令即可。在全新的 VPS 上,所有正在監聽的服務預設都能從網際網路連入。防火牆會反轉這種預設:先拒絕所有流量,再放行實際使用的少數連接埠。只要執行約 4 個指令,就能透過這項變更移除大部分暴露面。UFW 是 Ubuntu 和 Debian 使用的工具;如果 VPS 執行 Rocky 或 AlmaLinux,則應改用 firewalld,它會將規則整理到不同 zone。
開始設定前,先確認哪些服務正在監聽,因為防火牆會決定這些服務是否能被連入。使用 ss -tlnp 查看正在監聽的服務是正確的第一步。
避免將自己鎖在伺服器外的唯一規則
以下是讓人不敢使用防火牆的常見錯誤。你以預設拒絕政策啟用 UFW,卻沒有先放行 SSH,因此防火牆啟動後,自己的連線立即中斷,之後也無法重新登入。請務必在啟用 UFW 前先放行 SSH。這就是全部要點,以下步驟會按照安全順序執行。
即使真的發生這種情況,也不代表無法處理:供應商提供的 Web console 可透過 VNC 或 serial 連線,不會經過 SSH,因此你可以從該處登入,執行 ufw disable 或加入遺漏的規則。防火牆造成的鎖定也有明顯徵兆:遭丟棄的封包會讓 SSH client 持續等待直到逾時;停止的 SSH daemon 則會立即拒絕連線。這就是 connection refused 與 connection timed out 的差異。
步驟 1:設定預設政策
先設定 UFW 拒絕所有傳入連線,並允許所有傳出連線:
sudo ufw default deny incoming
sudo ufw default allow outgoingdeny incoming 是其中的關鍵。這表示未明確設定允許規則的連接埠,對外都是關閉的,即使有服務正在監聽該連接埠也是如此。allow outgoing 可讓伺服器正常連線至網際網路,以取得更新及執行其他作業。這兩個命令只會變更政策;在步驟 3 啟用 UFW 前,這些政策都不會生效。
步驟 2:允許實際需要的連接埠
啟用前,先開放 SSH,以免中斷目前的連線:
sudo ufw allow 22/tcpUFW 也能為 SSH 設定速率限制:sudo ufw limit 22/tcp 會允許該連接埠,但封鎖在 30 秒內建立 6 次以上連線的來源位址。這可在不安裝其他軟體的情況下,降低暴力破解腳本的影響。
如果執行 Web 伺服器,也要允許 HTTP 和 HTTPS:
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp只允許對外提供服務所需的項目。例如,Postgres 使用的 5432 埠幾乎不應加入 allow 規則。改為繫結至 127.0.0.1,讓它只能在本機存取。每個開放的連接埠都需要加以防護,因此應縮短清單。
你也可以在此為伺服器建立完整的 ufw 指令序列,然後依序執行:
步驟 3:啟用並確認已啟動
sudo ufw enable系統會警告此命令可能中斷現有的 SSH 連線。由於你已在步驟 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當你自己的位址變更,或有多台機器需要連入時,這種做法就不再適用。一般的解法是完全不要公開開放該連接埠,改為透過私有網路連線到服務;將伺服器的私有子網路公布到 tailnet就是為此用途。
防火牆只是其中一層。它能控制哪些流量可以抵達某個連接埠,但無法減緩他人持續攻擊你所開放的連接埠,例如 SSH。針對這種情況,請在 SSH 前方加入 Fail2ban,封鎖重複違規的來源。深度防禦表示每一層都負責處理其他層無法涵蓋的問題。
只有了解 連接埠的用途及服務如何監聽後,防火牆才有意義;設定防火牆也是新 VPS 的前 10 分鐘中的一個步驟。
FAQ
啟用 UFW 會中斷 SSH 工作階段嗎?
如果先允許 SSH,就不會。請在 sudo ufw enable 前執行 sudo ufw allow 22/tcp。防火牆允許連接埠 22 後,連線就能持續。啟用預設拒絕的防火牆,卻未加入 SSH 允許規則,才會導致連線中斷。如果發生這種情況,請透過供應商的 VNC 或序列主控台登入,然後執行 ufw disable。
VPS 應開放哪些連接埠?
只開放提供給公眾的服務所需連接埠。若要管理伺服器,請開放 SSH(22/tcp);若執行網站,請開放 HTTP 與 HTTPS(80/tcp、443/tcp)。其他連接埠一律維持拒絕。資料庫等內部服務應繫結至 127.0.0.1,且完全不設定防火牆規則,避免從網路連線到這些服務。
UFW 支援 IPv6 嗎?
在現代 Ubuntu 上支援:IPV6=yes 設定於 /etc/default/ufw,因此每個規則都會套用至兩種 IP 協定堆疊,而 ufw status 會以 (v6) 尾碼顯示 IPv6 規則。可能導致設定失效的情況,請參閱IPv6 防火牆陷阱。
如何移除 UFW 規則?
執行 sudo ufw status numbered,以索引編號列出規則;接著執行 sudo ufw delete N,其中 N 是要移除的規則編號。您也可以依規則規格刪除,例如 sudo ufw delete allow 80/tcp。
如何只允許一個 IP 位址存取連接埠?
請使用 from 規則,而不要使用一般的 allow。若只允許辦公室位址連線至 PostgreSQL,請執行 sudo ufw allow from 10.0.0.10 to any port 5432 proto tcp。在預設拒絕的政策下,連接埠會先對所有人關閉,直到規則允許存取。因此,這個 from 規則是唯一的進入方式:整個網際網路都會遭到封鎖,只有您指定的位址能夠通過。不要另外加入一般的 allow 5432/tcp,否則會對所有人開放該連接埠。這是公開資料庫或管理面板時最安全的方式。請使用 sudo ufw status verbose 確認設定;該指令會在連接埠旁顯示來源位址。