簡介
Firewalld 是一款適用於許多 Linux 發行版的防火牆管理解決方案。它作為 Linux 核心提供的 iptables 封包過濾系統的介面。在本指南中,您將學習如何為您的伺服器設定防火牆。我們還將向您展示使用 firewall-cmd 管理工具管理防火牆的基本方法。
Firewalld 基礎知識
FirewallD 使用區域(zones)和服務(services)的概念,而不是 iptables 的鏈(chain)和規則(rules)。根據您設定的區域和服務,您可以控制允許或不允許進出系統的流量。可以使用命令列公用程式 firewall-cmd 來設定和管理 FirewallD。
安裝並啟用防火牆以在開機時啟動
在大多數 Linux 發行版中,firewallD 已經安裝。但是,如果您需要自行安裝,請輸入以下語法:
|
1 |
sudo yum install firewalld |
安裝 firewalld 後,您可以啟用該服務並重新啟動伺服器:
|
1 2 |
sudo systemctl enable firewalld sudo reboot |
接下來,重新啟動您的伺服器。成功重新啟動伺服器後,您的防火牆將被啟用。之後,使用以下命令驗證服務是否已啟用:
|
1 |
sudo firewall-cmd --state |

輸出顯示預設的防火牆設定正在運作。
檢查預設值
您可以使用此命令檢查伺服器選取的區域:
|
1 |
firewall-cmd --get-default-zone |

輸入以下內容以驗證作用中的區域:
|
1 |
firewall-cmd --get-active-zones |

使用此語法列印預設區域的設定,以了解附加到公共區域的規則:
|
1 |
sudo firewall-cmd --list-all |

輸出表示此區域既是預設區域也是作用中區域。它還顯示 eth0 和 eth1 介面已分配給此區域。
檢查其他區域
除了預設和作用中區域外,還有其他區域供您探索。輸入此命令以查看所有可用的區域:
|
1 |
firewall-cmd --get-zones |

在 –list-all 命令中加入 –zone= 參數,以檢查分配給特定區域的設定:
|
1 |
sudo firewall-cmd --zone=home --list-all |

變更介面區域
您可以使用 –change-interface 選項輕鬆變更介面區域。以下命令將把介面 eth1 分配給工作區:
|
1 |
sudo firewall-cmd --zone=work --change-interface=eth1 |
您可以輸入以下內容來驗證變更:
|
1 |
sudo firewall-cmd --get-active-zones |
變更預設區域
要變更預設區域,請使用 –set-default-zone,後跟您要設為預設的區域名稱。例如,要變更預設區域,您應該執行以下命令:
|
1 |
sudo firewall-cmd --set-default-zone=home |
接下來,您可以使用以下命令驗證變更:
|
1 |
sudo firewall-cmd --get-default-zone |
為您的應用程式設定規則
讓我們來了解為服務定義防火牆例外所需的基本步驟:
將服務新增至您的區域
最直接的方法是將您需要的連接埠或服務新增至您正在使用的區域。同理,您可以使用 –get-services 選項來查看所有可用的服務:
|
1 |
firewall-cmd --get-services |

您可以使用 –add-service = 參數來啟用特定區域的服務。此操作針對預設區域或由 –zone = 參數定義的任何區域。預設情況下,僅設定目前的防火牆工作階段。您可以透過啟用 –permanent 旗標來設定永久的防火牆組態。例如,如果您正在執行提供一般 HTTP 流量的網頁伺服器,您可以透過輸入以下內容,在本次工作階段中允許我們 “public” 區域中介面的此流量:
|
1 |
sudo firewall-cmd --zone=public --add-service=http |
如果您想變更預設區域,可以省略 –zone =。您可以使用 –list-all 或 –list-services 操作來檢查操作是否成功:
|
1 |
sudo firewall-cmd --zone=public --list-services |

一旦您確認一切運作正常,您很可能希望變更永久防火牆規則,以便在重新啟動後仍可使用您的服務。我們可以透過輸入以下語法,永久變更我們的 “public” 區域:
|
1 2 3 4 |
sudo firewall-cmd --zone=public --permanent --add-service=http 輸出: 成功 |
您可以透過在 –list-services 操作中加入 –permanent 旗標來檢查是否成功。您必須在所有永久操作中使用 sudo:
|
1 2 3 4 |
sudo firewall-cmd --zone=public --permanent --list-services 輸出: dhcpv6-client http ssh |
您的 “public” 區域現在允許連接埠 80 上的 HTTP 流量。您可以使用以下命令將此設定新增至目前的工作階段和持久規則集中:
|
1 2 3 |
sudo firewall-cmd --zone=public --add-service=https sudo firewall-cmd --zone=public --permanent --add-service=https |
如果沒有符合您需求的服務,您有兩個極佳的選擇來處理這種情況:
- 為您的區域開啟連接埠
為特定應用程式新增支援最直接的方法是開啟每個區域中使用的連接埠。這非常簡單,只需為您需要開啟的連接埠指定連接埠或連接埠範圍以及對應的協定即可。例如,如果您的應用程式在連接埠 5000 上執行並使用 TCP,您可以使用 –add-port = 參數將其新增至此工作階段的 “public” 區域。協定可以是 TCP 或 UDP:
|
1 2 3 4 |
sudo firewall-cmd --zone=public --add-port=5000/tcp 輸出: 成功 |
為了檢查操作是否成功,請使用 –list-ports 操作:
|
1 2 3 4 |
sudo firewall-cmd --zone=public --list-ports 輸出: 5000/tcp |
您也可以透過用連字號分隔範圍中的起始和結束連接埠,來指定連續連接埠的範圍。例如,如果您的應用程式使用 UDP 連接埠 4990 到 4999,您可以透過輸入以下內容在 “public” 中開啟它們:
|
1 |
sudo firewall-cmd --zone=public --add-port=4990-4999/udp |
測試後,我們可能想將它們新增至永久防火牆。您可以透過輸入以下內容來執行此操作:
|
1 2 3 |
sudo firewall-cmd --zone=public --permanent --add-port=5000/tcp sudo firewall-cmd --zone=public --permanent --add-port=4990-4999/udp sudo firewall-cmd --zone=public --permanent --list-ports |

- 定義服務
服務是具有關聯名稱和描述的連接埠集合。服務比連接埠更容易管理,但需要一些初始工作。最直接的入門方法是將現有的指令碼(位於 / usr / lib / firewalld / services 中)複製到 /etc/firewalld/services 目錄。例如,您可以複製 SSH 服務定義以在 “example” 服務定義中使用,如下所示。檔名減去 XML 後綴決定了防火牆服務清單中的服務名稱:
|
1 |
sudo cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/example.xml |
此時,您可以調整複製檔案中的定義:
|
1 |
sudo vi /etc/firewalld/services/example.xml |
首先,該檔案包含您複製的 SSH 定義:
|
1 2 3 4 5 6 |
<?xml version="1.0" encoding="utf-8"?> <service> <short>SSH</short> <description>安全Shell (SSH) 是 一個 協定用於 登入到與 執行命令在遠端機器. 它提供安全加密通訊. 如果 您計劃在存取您的機器遠端透過SSH 經由 一個 受防火牆保護的介面, 啟用此 選項. 您需要此openssh-伺服器套件 已安裝以使 此 選項能 發揮作用.</description> <port protocol="tcp" port="22"/> </service> |
此定義的大部分由中介資料組成。您必須變更 <short> 標籤中的服務簡短名稱。這是一個易於辨識的服務名稱。假設對於我們的 “example” 服務,我們必須為 TCP 開放連接埠 7777,為 UDP 開放連接埠 8888。您可以透過按 i 進入 INSERT 模式來變更現有定義:
|
1 2 3 4 5 6 7 |
<?xml version="1.0" encoding="utf-8"?> <service> <short>範例服務</short> <description>這 是 只是一個範例服務. 它可能不應該't 被使用在 一個 實際系統.</description> <port protocol="tcp" port="7777"/> <port protocol="udp" port="8888"/> </service> |
接下來,按 ESC 並輸入 :x 以儲存並關閉檔案。然後,輸入以下命令重新啟動防火牆,以便存取您的新服務;
|
1 |
sudo firewall-cmd --reload |
之後,使用以下命令獲取可用服務的清單:
|
1 |
firewall-cmd --get-services |

此服務現在已在您的區域中可用。
建立您的區域
雖然預定義的區域對大多數使用者來說可能已經足夠,但定義您自己的區域以更完整地描述其功能可能會很有用。
新增區域時,請將其新增至您的永久防火牆設定中。然後您可以重新載入以將設定套用至您的工作階段。例如,您可以透過輸入以下內容來建立前面討論的兩個區域:
|
1 2 |
sudo firewall-cmd --permanent --new-zone=publicweb sudo firewall-cmd --permanent --new-zone=privateDNS |
您可以使用此命令確認它們存在於您的永久設定中:
|
1 |
sudo firewall-cmd --permanent --get-zones |

重新載入防火牆以將這些新區域納入作用中設定:
|
1 2 3 4 5 |
sudo firewall-cmd --reload firewall-cmd --get-zones 輸出: block dmz drop external home internal privateDNS public publicweb trusted work |
現在,您可以將適當的服務和連接埠分配給您的區域。例如,對於 “publicweb” 區域,您可能想要新增 SSH、HTTP 和 HTTPS 服務:
|
1 2 3 |
sudo firewall-cmd --zone=publicweb --add-service=ssh sudo firewall-cmd --zone=publicweb --add-service=http sudo firewall-cmd --zone=publicweb --add-service=https |

此外,您可以使用此命令將 DNS 服務新增至您的「privateDNS」區域:
|
1 2 |
sudo firewall-cmd --zone=privateDNS --add-service=dns sudo firewall-cmd --zone=privateDNS --list-all |

接下來,您可以將您的介面變更為這些新區域以進行測試:
|
1 2 3 |
sudo firewall-cmd --zone=publicweb --change-interface=eth0 sudo firewall-cmd --zone=privateDNS --change-interface=eth1 |
測試設定以查看其是否正常運作。如果這些值對您有用,您必須將相同的規則新增至永久設定中。您可以透過使用 —permanent 指示器重新套用規則來執行此操作:
|
1 2 3 4 5 6 7 |
sudo firewall-cmd --zone=publicweb --permanent --add-service=ssh sudo firewall-cmd --zone=publicweb --permanent --add-service=http sudo firewall-cmd --zone=publicweb --permanent --add-service=https sudo firewall-cmd --zone=privateDNS --permanent --add-service=dns |
永久套用這些規則後,您可以重新啟動網路並重新載入防火牆服務:
|
1 2 3 |
sudo systemctl restart network sudo systemctl reload firewalld |
檢查區域是否已正確分配:
|
1 |
firewall-cmd --get-active-zones |

此外,請確保兩個區域都具有正確的服務:
|
1 2 3 4 |
sudo firewall-cmd --zone=publicweb --list-services 輸出: http https ssh |
|
1 2 3 4 5 |
sudo firewall-cmd --zone=privateDNS --list-services 輸出: dns |
如果您想將其中一個區域設定為其他介面的預設區域,您必須使用此命令並搭配參數 –set-default-zone= 來設定此行為:
|
1 |
sudo firewall-cmd --set-default-zone=publicweb |
結論
至此,您已成功建立了自己的區域。您應該對在 CentOS 系統上管理 firewalld 服務以進行日常使用有了基本的瞭解。深入掌握 firewalld 服務能讓您充分發揮其強大功能與靈活性。
祝您使用愉快!


留言
目前尚無留言。成為第一個留言的人吧。