即使服務運行在 SLES 15 伺服器上,遠端用戶端仍然可能因防火牆阻止新的傳入流量而逾時。解決方法通常是識別活動的 firewalld 區域,並僅允許應用程式所需的服務或連接埠。用於執行此操作的 SLES 命令列工具是firewall-cmd。
本指南遵循 SUSE SLES 15 SP7 安全加固指南和 firewalld 命令參考,並於 2026 年 10 月 7 日進行了驗證。早期服務包和升級到 SLES 12 的系統可能具有不同的狀態或舊版防火牆配置。終端影像僅顯示範例,並非實際伺服器的擷取結果;請將介面名稱、區域和服務替換為您主機上的對應值。
1. 檢查 firewalld 是否正在運行
SUSE 文件顯示,firewalld 在 SLES 15 上預設安裝並啟用。 YaST 通常會在安裝後啟動它,並將介面置於預設public區域。不過,為了確保預設設定不變,最好還是檢查一下機器。請使用具有相應權限的帳戶執行以下命令sudo:
sudo systemctl status firewalld
sudo firewall-cmd --state
服務管理器應報告該服務firewalld處於活動狀態,並firewall-cmd --state應報告其他資訊running。如果該服務已安裝但已停止,請啟動它並使其在啟動時生效:
sudo systemctl enable --now firewalld
如果firewall-cmd缺少該firewalld軟體包,請檢查它是否已安裝並位於已啟用的 SUSE 軟體倉庫中。切勿在受管伺服器上盲目安裝或替換防火牆組件。
範例終端檢查 firewalld 狀態,並顯示一個具有 eth0 介面的活動公共區域範例。
2. 找到保護伺服器介面的區域
Firewalld 將規則分組到不同的區域中,每個區域代表不同的信任等級。public非信任區域通常用於不受信任的網路。在一個區域中開啟的服務不會自動在所有區域中打開,因此,如果正確的規則位於錯誤的區域中,則可能會導致應用程式無法存取。
sudo firewall-cmd --get-active-zones
sudo firewall-cmd --get-default-zone
sudo firewall-cmd --zone=public --list-all
使用 active-zone 輸出查找附加到承載客戶端流量的介面的區域。介面名稱可能是 `<interface_name>` eth0、ens160`<interface_name>` 或其他名稱。如果需要檢查單一接口,請執行:
sudo firewall-cmd --get-zone-of-interface=eth0
替換eth0為實際接口。未明確分配給區域的介面將由預設區域處理。請勿隨意更改預設區域:這樣做可能會影響依賴該區域的介面。在遠端伺服器上,請識別 SSH 或其他管理區域,並在重新載入防火牆設定之前確認其存取規則。如果存在控制台或帶外恢復路徑,請保持其可用。
區域清單顯示了在進行任何變更之前,哪些介面和服務與範例公共區域相關聯。
3. 選擇命名服務或特定連接埠
firewalld服務是一個命名定義,可以包含一個或多個連接埠和協定。通常,透過名稱允許已知服務比記住其連接埠號碼更容易。在使用服務定義前,請檢查已安裝的服務清單並仔細查看其定義:
sudo firewall-cmd --get-services
sudo firewall-cmd --info-service=http
對於 Web 伺服器,預先定義的http服務通常會覆寫 TCP 連接埠 80;httpsTLS Web 流量則使用單獨的服務。 SLES 文件也展示了基於服務的方法,並提供了 DHCP 等範例。請使用應用程式實際需要的服務,如果不確定,請在本機上驗證服務定義。
如果沒有預先定義的服務符合要求,則只需開放所需的連接埠和協定。例如,可以允許監聽 TCP 連接埠 8443 的應用程式通過--add-port=8443/tcp防火牆。在防火牆中開啟連接埠並不會啟動應用程式、將其綁定到網路或使其安全;請確認服務本身已配置為監聽目標位址。
先測試臨時規則
對於短期測試,請將規則套用至執行時間配置。運行時變更會立即生效,但除非您同時永久儲存,否則防火牆重新載入或服務重新啟動後變更將會遺失。 Firewalld 支援有時限規則,當您希望測試自動過期時,此功能非常有用:
sudo firewall-cmd --zone=public --add-service=http --timeout=5m
對於一次性連接埠測試,請使用 ` --add-port=8443/tcp --timeout=5m<zone>` 取代 `<zone>` --add-service=http。選擇實際包含伺服器介面的區域;public如果您的主機使用其他區域,請勿複製。
範例命令將 HTTP 服務新增至公共區域的永久配置中,然後重新載入 firewalld 以套用它。
4. 儲存規則並重新載入 firewalld
當您準備保留某條規則時,請將其新增至永久配置。以下範例允許在公共區域中使用 HTTP 協定:
sudo firewall-cmd --permanent --zone=public --add-service=http
sudo firewall-cmd --reload
對於 HTTPS,請重複執行永久命令--add-service=https。對於自訂應用程式端口,請使用以下命令:
sudo firewall-cmd --permanent --zone=public --add-port=8443/tcp
sudo firewall-cmd --reload
這些範例首先修改永久配置,然後重新載入系統以使新規則生效。重新載入也會將運行時設定替換為永久配置。因此,其他地方的任何運行時更改都可能被丟棄。在重新載入生產系統之前,請務必檢查重要的執行時間規則和永久規則,尤其是遠端管理存取權限。
還有一個先運行時後服務的流程:在執行時測試規則,確認服務正常運作,然後新增相同的規則--permanent並重新載入。除非您打算儲存所有目前執行時間規則(包括其他管理員或軟體所做的臨時變更),否則請避免將其用作--runtime-to-permanent捷徑。
如何驗證變更是否生效?
檢查目前運行時規則和已儲存規則。對於公共區域中的 HTTP 服務,請執行:
sudo firewall-cmd --zone=public --query-service=http
sudo firewall-cmd --permanent --zone=public --list-services
sudo firewall-cmd --check-config
查詢應傳回結果yes,永久服務清單應包含http,且配置檢查應成功完成。對於連接埠規則,請在等效命令中使用 `--port`--query-port=8443/tcp和--list-ports`--port`。此外,也應從可存取伺服器的獨立用戶端進行測試;本機防火牆查詢僅確認規則存在,並不能確認 DNS、路由、上游防火牆或應用程式監聽器是否正確。
驗證命令檢查活動服務規則、已儲存的服務清單和永久設定語法。
常見問題及安全解決方法
- 規則已存在,但連線仍然逾時:請確保已將其新增至與用戶端介面關聯的區域。然後驗證應用程式是否正在監聽預期的位址和端口,並檢查上游網路防火牆。
- 該規則在重新加載之前一直有效:它可能只在運行時添加了該規則。新增該規則
--permanent並重新加載,然後查詢兩個配置。
- SSH 存取權有風險:請在重新載入之前檢查活動區域和永久區域的服務。如果需要 SSH 服務但該
ssh服務不存在,請在重新載入之前將其永久新增至正確的區域。在測試第二個連線之前,請勿關閉目前的遠端會話。
- 您正在從較舊的 SUSE 版本遷移: SLES 15 用 firewalld 取代了 SuSEfirewall2。 SUSE 警告說,舊版防火牆設定檔的向後相容性有限;請查閱遷移指南,不要想當然地認為所有舊規則都已轉換。
- 規則似乎有衝突: firewalld 旨在管理主機的防火牆規則。 SUSE 警告不要使用諸如 之類的工具分別修改相同的規則
iptables,這可能會混淆當前配置。
若要移除不必要的永久服務或端口,請使用匹配的--remove-service`or`--remove-port選項--permanent,然後重新載入並再次驗證。例如,使用 `removeHTTP` 從公共區域移除 HTTP,然後sudo firewall-cmd --permanent --zone=public --remove-service=http使用 `removeHTTP` sudo firewall-cmd --reload。
完成前請先自我檢查
firewalld正在運行,並在伺服器啟動時啟動。
- 您已確定接收流量的介面的活動區域。
- 該區域只允許應用程式所需的服務或連接埠。
- 重新載入前後,遠端管理仍然可用。
- 該規則出現在執行時間查詢和永久查詢中,並且配置檢查通過。
- 從另一台主機進行的連接測試證實應用程式可存取。
有關特定版本的詳細信息,請參閱SUSE SLES 15 SP7 防火牆指南、firewall-cmd 手冊以及 firewalld 關於運行時和永久配置以及打開端口或服務的說明。