UFW 防火牆設定教學:安全保護 VPS
學會用 UFW 設定 default-deny,僅允許必要連接埠,並在啟用前先放行 SSH,避免防火牆啟動後失去 VPS 連線。
UFW 是什麼,以及為什麼需要使用它
UFW 代表 Uncomplicated Firewall,這個名稱如實反映了它的用途。它是 Linux kernel 內建 firewall 的簡易前端,因此不必撰寫原始規則,只要輸入 ufw allow 22/tcp 這類簡短指令即可。在全新的 VPS 上,所有正在監聽的服務預設都能從網際網路連線。Firewall 會反轉這項預設行為:先拒絕所有連線,再放行實際使用的少數連接埠。只要執行約 4 個指令,就能大幅降低暴露風險。
開始設定前,請先確認哪些服務正在監聽,因為 firewall 會決定這些服務的連線是否可達。使用 ss -tlnp 查看正在監聽的服務 是正確的第一步。
讓你不會把自己鎖在伺服器外的唯一規則
這是讓許多人不敢使用防火牆的常見錯誤。你啟用採用 default-deny 政策的 UFW,卻沒有先允許 SSH。防火牆啟動後,現有連線會立即中斷,之後也無法重新連入。請務必在啟用 UFW 前先允許 SSH,即可避免這個問題。關鍵只有這一點,以下步驟會依安全順序執行。
即使真的發生這種情況,也不代表無法處理:服務供應商提供的 Web 主控台可透過 VNC 或 serial 連線,不會經過 SSH。你可以從該主控台登入,然後執行 ufw disable,或加入遺漏的規則。
步驟 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 防護 SSH,封鎖重複違規的來源。深度防禦表示每一層都負責處理其他層無法涵蓋的風險。
只有在了解 連接埠的用途以及服務如何監聽後,防火牆才有意義;設定防火牆也是 新 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 確認設定;該指令會在連接埠旁顯示來源位址。