FirewallD 防火牆使用概述
FirewallD 是由紅帽發起的提供了支持網路/防火牆 區域 定義網路鏈接以及介面安全等級的動態防火牆管理工具。它支持 IPv4、IPv6 防火牆設置以及乙太網橋接,並且擁有運行時配置和永久配置選項。它也支持允許服務或者應用程序直接添加防火牆規則的介面。
由於 FirewallD 項目本身的自由軟體特性,像 Debian Linux 社區發行版已經默認在軟體倉庫中收錄了該防火牆組件軟體包。隨著各個新 GNU/Linux 發行版中防火牆引擎逐步從 iptables 向 nftables 遷移,FirewallD 是目前唯一能夠支持該兩種防火牆後端引擎的前端服務組件,用戶掌握以後可以方便的進行防火牆配置並很好的規避了從 iptables 向 nftables 遷移帶來的學習恐慌。
筆者通過查閱 RedHat 8 發行版網路配置手冊,並結合自己在 Debian Linux 10 社區版上進行 FirewallD 防火牆的實際配置使用,對該服務組件的功能和日常使用進行整理。希望通過該文能幫助其他 Linux 用戶掌握該防火牆,並通過該防火牆提高主機測網路安全防禦能力,打造可信的網路安全環境。
一、安裝
在 Debian Linux 10 社區版中使用如下命令:
apt-get install firewall-applet firewall-config firewalld
就可以直接進行 FirewallD 防火牆軟體組件包的安裝,其中:
firewall-applet
為 FirewallD 托盤小程序,firewall-config
為 FirewallD 圖形化系統配置管理工具firewalld
為 FirewallD 防火牆軟體組件的主組件包,其中包含firewall-cmd
、firewall-offline-cmd
等命令行系統配置管理工具。
在 RedHat 8 下該防火牆組件默認已經進行了安裝,如果用戶進行特殊定製安裝之後需要單獨安裝該軟體組件可以使用命令
yum install firewall-config
直接進行安裝即可。
筆者在兩個系統裝進行過安裝對比,發現該軟體組件包在兩個系統上除了安裝命令稍有差異外,其它從配置文件到 systemd 服務配置並沒有任何區別。隨後的內容將不再強調操作系統。
二、防火牆默認區域
- Block(阻塞)
任何對該區域的連接請求都會被以 IPv4 的 icmp-host-prohibited 信息或 IPv6 的 icmp6-adm-prohibited 信息所拒絕。只能從系統內部啟動網路連接。 - Dmz(隔離)
用於你的隔離區內的電腦,此區域內可公開訪問,可以有限地進入你的內部網路,僅僅接收經過選擇的連接。 - Drop(丟棄)
對進入該區域的所有數據包丟棄,並且不進行任何回包,區域內主動發起連接的流入回程數據包允許通過,允許進行出方向的網路連接。 - External(外部)
用於在啟用偽裝的外部網路上使用,尤其路由器、防火牆認為在這個網路上的其它主機不可信。僅僅接收經過選擇的連接。 - Home(家庭)
默認其他同區域內主機可信,僅僅接收經過選擇的連接。同時默認放行 ssh、mdns、ipp-client、amba-client 與 dhcpv6-client 服務產生的連接。 - Internal(內部)
從描述中可以等同於家庭區域。 - Public(公開)
公共區域,也是防火牆配置的默認區域,防火牆認為該區域主機不可信。僅僅接收經過選擇的連接。同時默認放行 ssh 與 dhcpv6-client 服務產生的連接。 - Trusted(可信)
可信區域,防火牆放行一切流量。等同於關閉防火牆功能。 - Work(工作)
工作區域,防火牆認為在這個網路上的其它主機不可信。僅僅接收經過選擇的連接。同時默認放行 ssh、ipp-client 與 dhcpv6-client 服務產生的連接。
這些區域的命名不言自明,用戶可以很快選擇一個合適的安全區域,從而簡化和避開很多安全問題。當然用戶也可以根據自己的需要或者安全評估來根據自己的實際需求對相應安全域進行更個性化的配置,以適應自己的安全管理規範。儘管有些安全域的安全規則是相同的,但之所以還要在名字上有所區別,主要是為了從習慣上讓用戶更好區分不同域的獨特使用場景,對用戶來說更好理解和便於區分。
三、防火牆日常管理
3.1、查看防火牆當前狀態
查詢狀態:
firewall-cmd --state
更多的防火牆系統服務狀態信息可以使用
systemctl status firewalld
在你配置新的防火牆規則之前,你需要了解如何通過命令查看當前防火牆配置。查看防火牆當前配置可以通過圖形界面或者在終端模式下使用命令進行。
在圖形界面下可以直接通過點擊應用程序「firewall-config」圖標或者在終端窗口中輸入 firewall-config
命令進行防火牆配置。如果當前用戶為非 root 用戶,系統將彈出管理員認證窗口,用戶正確輸入管理員密碼後,防火牆配置窗口就會打開,用戶即可以按照窗口界面提供的功能進行操作。
用戶也可以在命令行下使用 firewall-cmd
工具進行防火牆配置。命令行工具雖然學習起來需要一定的時間,不過該工具可以完全在系統處於終端模式下進行各種複雜的防火牆全功能配置,用戶有必要進行認真的學習和掌握。
3.2、防火牆基礎命令
FirewallD 使用了區域進行數據流的管理,當用戶使用 firewall-cmd --list-all
命令時,如果沒有使用 --zone
指定區域,那麼系統將返回默認區域的當前配置狀態。
默認區域由配置文件 /etc/firewalld/firewalld.conf
中的欄位 DefaultZone
定義,初始狀態下,默認區域被定義為 public
(公共區域)。
用戶可以使用命令:
firewall-cmd --get-zones
查看當前系統防火牆設置的的區域名列表,也可以使用命令:
firewall-cmd --get-default-zone
查看防火牆當前的默認區域;同時,可使用命令:
firewall-cmd --set-default-zone=[zonename]
或者通過直接編輯配置文件中 DefaultZone
欄位的值進行默認區域的修改。
啟動防火牆:
systemctl unmask firewalld
systemctl start firewalld
讓防火牆隨系統啟動一起啟動:
systemctl enable firewalld
停止防火牆:
systemctl stop firewalld
停止隨系統啟動:
systemctl disable firewalld
停止通過訪問 firewalld D-Bus 介面和其他服務需要 firewalld 依賴導致的 firewalld 自動啟動,更加乾淨的關閉 firewalld 服務:
systemctl mask firewalld
按照 RedHat 的官方文檔定義,防火牆運行之後被稱為運行時狀態,保存了啟動默認參數之後的配置被稱為永久狀態。在當前運行狀態對防火牆進行的所有配置修改,系統即時生效,但重啟後防火牆會恢復到它之前的永久狀態,其實這一過程就是從保存之後的配置文件中載入相應配置參數的過程。
用戶可以使用命令:
fiewall-cmd --runtime-to-permanent
對當前修改過的規則即時保存為永久配置,也可以使用命令 firewall-cmd --permanent
並在其後添加其它參數永久進行修改。
重新啟動 firewalld 將關閉所有打開的埠並停止網路通信,需要使用命令:
firewall-cmd --reload
重新載入永久配置使之生效。
FirewallD 提供了一種系統受到攻擊的緊急操作功能。假設攻擊者對系統進行攻擊,用戶可以直接使用命令:
firewall-cmd --panic-on
關閉網路通信並且切斷攻擊者,而不用像之前那樣通過物理拔除網線來進行斷網操作,防止了系統在多網口環境中一次性插拔所有網線可能帶來的混亂以及由此引發的系統恢復後延續問題。
需要恢復網路通信時用戶只要使用命令:
firewall-cmd --panic-off
關閉恐慌模式即可,用戶也可以使用命令:
firewall-cmd --query-panic
查詢防火牆當前恐慌模式的狀態。
3.2、防火牆服務管理命令
用戶可以通過命令行工具添加預定義的服務類型,防火牆會自動根據所需的埠並將其他設置修改為服務定義文件。
使用命令:
firewall-cmd --list-services
可以查看當前區域內被允許的服務。使用命令:
firewall-cmd --get-services
可以列出所有防火牆已經給定的預定義服務名稱。使用命令:
firewall-cmd --add-service=<service-name>
可以添加具體服務,服務名稱用戶可以根據自己的實際需求從預定義服務名稱中選取合適的服務名進行添加。完成之後用戶可以使用命令:
firewall-cmd --runtime-to-permanent
將對運行時的修改保存為永久。用戶可以通過命令 firewall-config
、firewall-cmd
和 firewall-offline-cmd
,或者通過直接將 /usr/lib/firewalld/services
目錄的默認模板 XML 文件複製到 /etc/firewalld/services
目錄中進行編輯來添加一個自定義服務類型。具體過程如下:
方法一:執行 firewall-cmd –new-service=service-name
,系統將直接在 /etc/firewalld/services
目錄下創建一個以 .xml
結尾的同名文件,自定義服務類型添加完成。
方法二:在相應目錄使用編輯軟體直接編輯好 XML 文件並執行 firewall-cmd --new-service-from-file=service-name.xml
,系統將自動完成同名自定服務類型的添加。
埠作為特定系統服務的接收和區分網路流量並將其轉發到系統服務的邏輯設備,系統守護進程通常偵聽特定的服務埠。防火牆在默認的服務類型配置中已經定義了相應服務需要放行的對應的埠。當用戶還需要在某個服務中放行特定的自定義埠或者埠段的時候可以通過 firewall-cmd
完成,格式如下:
firewall-cmd [--zone=zone_name] [--service=service_name] --add-port=port-number/port-type
這裡需要說明的是 --zone
、--service
為可選參數,如果用戶不添加這兩個參數執行命令時相當與在默認區域中直接添加了埠,當只選取了 --zone
參數時,命令執行的結果是在指定區域直接添加埠,此時與服務狀態無關。只有在使用 --service
參數時才是在相應的服務中添加埠。
當用戶需要刪除一個埠時可以使用如下命令:
# firewall-cmd [--zone=zone_name] [--service=service_name] --remove-port=port-number/port-type
當用戶需要向不同區域添加服務時,用戶可以通過如下步逐進行:
# firewall-cmd --add-service=ssh --zone=drop
該命令將向區域 drop
中添加 ssh
服務,其實質就是放行 ssh
服務定義中的默認 22
埠入站方向的流量及連接。
在多網路介面主機中,可以使用如下方法將指定的網路介面添加到需要的區域中,從而實現每個介面的安全連接區域要求,實現真正的區域化網路安全管理。
使用命令:
firewall-cmd --get-active-zones
查看當前激活的安全區域和相應的網路介面配置。使用命令
firewall-cmd --zone=work --change-interface=ens3p0
則將網卡 ens3p0
加入到了 work
區域,之後所有通過該網卡的流量將受到區域安全規則的約束和限制,該配置是即時生效的並且會自動保存為永久配置。
用戶需要將某個網卡加入到特定安全區域也可以直接使用:
vi /etc/sysconfig/network-scripts/ifcfg-connection-name
並在該文件下加入 ZONE=zone-name
行,該網卡即屬於特定的安全區域。
用戶可以對安全區域進行默認規則設置,默熱規則包括三個選項 ACCEPT
、REJECT
、DROP
,其中 ACCEPT
選項將放行所有流量,REJECT
、DROP
選項將阻止所有進入該安全區域的流量,與 REJECT
不同的是 DROP
選項直接丟棄進入安全區域的數據包,並不會向該數據包的發起者回復任何信息。用戶可以使用命令:
firewall-cmd --zone=zone-name --set-target=<default|ACCEPT|REJECT|DROP>
進行相應安全區域的默認規則設置。
3.3、使用區域根據來源來管理傳入流量
你可以使用區域根據來源管理流入流量,這使你可以對傳入流量進行排序,並將其路由到不同區域,以允許或禁止該流量可以到達的服務。
如果將源添加到區域,則該區域將變為活動狀態,並且來自該源的任何傳入流量將通過它。你可以為每個區域指定不同的設置,該設置將應用於來自給定來源的流量。即使你只有一個網路介面,也可以使用更多區域。
通過以下實例,我們可以將特定網段對 HTTP 的請求流量進行更細緻的管理,使用命令:
firewall-cmd --zone=trusted --add-source=192.168.1.0/24
將該網段作為資源加入到 trusted
區中,通過命令:
firewall-cmd --zone=trusted --add-service=http
將 Web 服務添加到相同區域中,隨後該目標地址產生的訪問 Web 服務流量將可以順利通過。
3.4、防火牆鎖機制
為了防止本地程序比如 KVM 虛擬機組件對防火牆的修改,FirewallD 還提供了一種鎖閉機制來防止本地程序或者服務組件對防火牆配置的修改,並且該命令只有 root 用戶本身才可以執行。
用戶可以使用命令:
firewall-cmd --query-lockdown
查詢防火牆鎖閉狀態,當需要鎖閉時可以直接執行命令:
firewall-cmd --lockdown-on
恢復到非鎖閉狀態時可以執行命令:
firewall-cmd --lockdown-off
四、後記
FirewallD 防火牆組件作為 RedHat 對自由軟體社區的貢獻之一,具有很好的普適性,希望通過本文的講解使更多的用戶開始熟悉該防火牆軟體組件,並將其作為主機本地側防護很好的技術手段,不斷提高主機自身的 IPS 能力。在當今網路環境複雜的形勢下讓主機具有更好的安全性和可用性。
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive