1、firewalld像iptables、nftables等一樣,本身並不是防火牆,只是防火牆管理工具,通過定義防火牆規則最終交由內核的netfilter進行包過濾實現防火牆功能。
澄清概念:
(1)許多人覺得執行systemctl stop firewalld可以關閉防火牆功能,就認為firewalld是防火牆,這個理解是錯誤的。執行systemctl stop firewalld,實際上是對底層包過濾規則清除(類似於nft flush ruleset 或iptables -F ,清除當前的ruleset)相當於關閉了防火牆。
(2)firewalld定義的防火牆規則要被內核的netfilter理解,中間的翻譯任務由iptables或nftables進行,也就是firewalld后端需要iptables或nftables。
firewalld軟件包提供了firewalld daemon和一系列工具如firewall-cmd、firewall-config、firewall-offline-cmd等。
firewalld由d-bus層和core層構成。d-bus層提供api,其它程序(如firewall-cmd、firewall-config、firewall-applet、甚至是你自己編寫的程序或守護進程)通過調用api可定義防火牆規則或查詢防火牆狀態等等。core層為d-bus層提供服務,負責和后端交互。架構圖如下:
備注:firewalld提供的firewall-offline-cmd不調用d-bus層,而是直接調用core層中的IO來修改防火牆規則。
2、firewalld、iptables和nftables關系
在centos7及之前版本中,iptables也提供了類似firewalld的daemon,用戶可以選擇iptables或firewalld daemon其一。centos8已棄用iptables,只用nftables。
nftables和iptables負責的應該屬於數據包過濾框架。nftables是從linux內核3.13開始出現,旨在替代現存的 {ip,ip6,arp,eb}_tables(本文統稱為iptables)。
(上圖中有處錯誤,nft指令錯寫成ntf指令)
3、firewalld zone、network interface、connection關系
firewalld易用特點就是使用zone、service簡化防火牆配置任務,另外一個優勢就是動態管理。
zone是firewalld一切的基礎,在zone中可配置各種規則,比如根據service/port(經常使用)、source等定義,或定義rich rule(富規則),所以說zone是預先定義的一組規則集。這樣zone就實現了對網絡可信等級的划分。firewalld缺省定義了9個zone(當然可以對其可修改,也可以自己創建額外的zone)。
通過對網卡(實際上是connection,即網卡配置文件。雖然一個網卡可有多個配置文件,但同時只能有一個活動的配置文件,可以在配置文件中使用zone=來定義connection所屬zone)切換zone,可快速將網絡置於不同的可信等級。
此外,firewalld zone也提供了類似路由器一些功能,如端口轉發、ip地址偽裝等。
對於一個接受到的請求具體使用哪個zone,firewalld是通過三種方法來判斷的:
- source,也就是源地址
- interface,接收請求的網卡
- firewalld.conf中配置的默認zone
這三個的優先級按順序依次降低,也就是說如果按照source可以找到就不會再按interface去查找,如果前兩個都找不到才會使用第三個,也就是firewalld.conf中配置的默認zone。