查看 UFW 狀態與規則清單

查看 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://你的伺服器IPhttps://你的伺服器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」,讓安全性再提升一個等級嗎?

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *