查看 UFW 狀態與規則清單
最基本的檢查指令是 status,它會告訴你防火牆目前是開啟(active)還是關閉(inactive)狀態,並列出目前的過濾規則。
Bash
sudo ufw status
查看詳細資訊與編號
如果你需要更深入的資訊,例如預設的防火牆政策(Default policy)或是規則的建立順序,可以使用以下兩種進階用法。
使用 verbose 可以看到更詳細的設定:
Bash
sudo ufw status verbose
使用 numbered 可以顯示每條規則的編號。這在你想刪除特定規則時非常有用,因為你可以直接指定編號刪除,而不用輸入一長串的 IP 位址:
Bash
sudo ufw status numbered
規則內容解讀
當你執行上述指令後,會看到一個列表。主要包含以下欄位:
- To:目標連接埠或服務(例如 80/tcp)。
- Action:動作。ALLOW 代表允許,DENY 代表拒絕。
- From:來源。如果你之前設定了 Cloudflare,這裡會顯示 Cloudflare 的 IP 位段。如果顯示 Anywhere,則代表全世界的流量都能進入該連接埠。
刪除特定的防火牆規則
如果你發現某條規則設定錯誤,可以利用剛才提到的編號來快速刪除。例如,若要刪除編號為 3 的規則:
Bash
sudo ufw delete 3
sudo ufw status numbered
Status: inactive
啟用 UFW 防火牆
當你看到 Status: inactive 時,代表 UFW 雖然已經安裝,但目前並沒有在運作,所有的連線都不會被攔截。在正式啟用前,請務必確認你已經放行了 SSH 連接埠(預設是 22),否則你可能會失去遠端主機的控制權。
輸入以下指令啟用:
Bash
sudo ufw enable
系統會詢問你是否要繼續執行,輸入 y 並按下 Enter 即可。
確認預設政策
啟用後,建議先設定預設的連線政策。通常我們會設定為:預設拒絕所有連入(Incoming),但允許所有連出(Outgoing)。
Bash
sudo ufw default deny incoming
sudo ufw default allow outgoing
再次查看狀態
啟用並設定好 Cloudflare 腳本後,再次執行 status numbered,你應該會看到類似下面的輸出:
Plaintext
Status: active
To Action From
-- ------ ----
[ 1] 22/tcp ALLOW IN Anywhere
[ 2] 80/tcp ALLOW IN 173.245.48.0/20
[ 3] 443/tcp ALLOW IN 173.245.48.0/20
...
停用或重新啟動
如果你在設定過程中發現連線出現問題,或是想暫時關閉防火牆進行除錯,可以使用以下指令:
- 停用防火牆:
sudo ufw disable - 重新載入規則(修改腳本後常用):
sudo ufw reload - 重設所有規則(清空回預設狀態):
sudo ufw reset
➜ ~ sudo ufw status
Status: active
To Action From
-- ------ ----
22 ALLOW Anywhere
443 ALLOW Anywhere
80 ALLOW Anywhere
80,443/tcp ALLOW 173.245.48.0/20
80,443/tcp ALLOW 103.21.244.0/22
80,443/tcp ALLOW 103.22.200.0/22
80,443/tcp ALLOW 103.31.4.0/22
80,443/tcp ALLOW 141.101.64.0/18
80,443/tcp ALLOW 108.162.192.0/18
80,443/tcp ALLOW 190.93.240.0/20
80,443/tcp ALLOW 188.114.96.0/20
80,443/tcp ALLOW 197.234.240.0/22
80,443/tcp ALLOW 198.41.128.0/17
80,443/tcp ALLOW 162.158.0.0/15
80,443/tcp ALLOW 104.16.0.0/13
80,443/tcp ALLOW 104.24.0.0/14
80,443/tcp ALLOW 172.64.0.0/13
80,443/tcp ALLOW 131.0.72.0/22
19790 (v6) ALLOW Anywhere (v6)
443 (v6) ALLOW Anywhere (v6)
80 (v6) ALLOW Anywhere (v6)
80,443/tcp ALLOW 2400:cb00::/32
80,443/tcp ALLOW 2606:4700::/32
80,443/tcp ALLOW 2803:f800::/32
80,443/tcp ALLOW 2405:b500::/32
80,443/tcp ALLOW 2405:8100::/32
80,443/tcp ALLOW 2a06:98c0::/29
80,443/tcp ALLOW 2c0f:f248::/32
修正防火牆規則衝突
從你提供的清單來看,目前的設定有一個嚴重的安全漏洞:雖然你加入了 Cloudflare 的 IP 範圍,但清單最上方仍有 443 與 80 埠開放給 Anywhere。
在 UFW 的邏輯中,規則是由上而下執行的。既然第一條已經允許了 Anywhere,後面的 Cloudflare 限制就不會生效,任何人還是可以直接連線到你的伺服器。
刪除過於寬鬆的規則
你需要先刪除允許 Anywhere 連入 80 與 443 的規則。請先列出編號:
Bash
sudo ufw status numbered
找到寫著 443 ALLOW Anywhere 與 80 ALLOW Anywhere 的編號(根據你的清單應該是 2 和 3,以及 v6 的部分),然後執行刪除。例如:
Bash
# 假設 2 號是 443 Anywhere
sudo ufw delete 2
# 刪除後編號會遞補,請再次查看編號後刪除 80 Anywhere
重複此動作,直到清單中不再出現 Anywhere 存取 80 和 443 為止。
驗證最終安全性
整理完畢後,你的 sudo ufw status 應該只剩下 SSH 埠(19790)是 Anywhere,而 80 與 443 的來源(From)欄位應該全部都是 Cloudflare 的 IP 位段。
為什麼 SSH 使用 xxx 埠
看到你的 SSH 埠設定在 xxx 而非預設的 22,這是一個很好的安全實踐,能避開大多數的自動化暴力掃描。請確保這個編號永遠保留在 ALLOW 清單中,否則一旦防火牆擋掉這個埠,你就無法再遠端登入伺服器。
你想知道如何測試目前的設定是否真的成功擋掉了非 Cloudflare 的連線嗎?
thought
測試防火牆是否生效
要確認防火牆是否成功阻擋了非 Cloudflare 的連線,最直接的方法就是繞過域名,直接使用你的伺服器真實 IP 進行連線測試。
方法一:使用瀏覽器直接訪問
在瀏覽器的網址列輸入 http://你的伺服器IP 或 https://你的伺服器IP。
- 如果成功: 代表防火牆規則沒設好,或是 Anywhere 的規則還沒刪乾淨。
- 如果失敗(顯示連線逾時): 代表防火牆運作正常,因為你的電腦 IP 不在 Cloudflare 的允許名單內。
方法二:使用 curl 指令測試
如果你手邊有另一台 Linux 或是在自己的電腦終端機,可以使用 curl 並設定連線逾時來快速檢查。
Bash
# 測試 80 埠
curl -I --connect-timeout 5 http://你的伺服器IP
# 測試 443 埠
curl -I --connect-timeout 5 https://你的伺服器IP
如果看到 curl: (28) Connection timed out,表示防火牆已經成功把非 Cloudflare 的流量擋在門外了。

方法三:透過 Cloudflare 診斷工具
如果你透過原本的網域名稱可以正常開啟網頁,但直接連 IP 會失敗,這就是最完美的狀態。這代表流量確實有經過 Cloudflare 代理,而你的伺服器也只聽 Cloudflare 的話。
檢查 UFW 日誌
如果你想親眼看到被擋掉的紀錄,可以開啟 UFW 的日誌功能:
Bash
sudo ufw logging on
接著查看 /var/log/ufw.log,你會看到許多來自不同 IP 但被 [UFW BLOCK] 的紀錄。
Bash
tail -f /var/log/ufw.log
需要我幫你確認如何從 Cloudflare 後台開啟「Authenticated Origin Pulls」,讓安全性再提升一個等級嗎?