Redhat Enterprise Linux7 已經默認使用 firewalld 作爲防火牆,其使用方式已經變化。
基於 iptables 的防火牆被默認不啓動,但仍然可以繼續使用。
RHEL7 中有幾種防火牆共存:firewalld、iptables、ebtables 等,默認使用 firewalld 作爲防
火牆,管理工具是 firewall-cmd。RHEL7 的內核版本是 3.10,在此版本的內核裏防火牆的包
過濾機制是 firewalld,使用 firewalld 來管理 netfilter,不過底層調用的命令仍然是 iptables
等。因爲這幾種 daemon 是衝突的,所以建議禁用其他幾種服務
例如若要禁用 iptables、ip6tables、ebtables 防火牆,方法如下圖
或
查看這幾種服務是否正在運行
或
RHEL7 雖然有 iptables 但是不建議使用了,使用新的 firewalld 服務。
查看 firewalld 軟件包是否安裝
Firewalld 提供了支持網絡/防火牆區域(zone)定義網絡鏈接以及接口安全等級的防火牆管理
工具。擁有運行時配置和永久配置選項。它也支持允許服務或者應用程序直接添加防火牆規
則的接口。以前的 system-config-firewall 防火牆模型是靜態的,每次修改都要求防火牆完全
重啓。這個過程包括內核 netfilter 防火牆模塊的卸載和新配置所需模塊的裝載等。相反,
firewall daemon 動態管理防火牆,不需要重啓整個防火牆便可應用更改。因而也就沒有必
要重載所有內核防火牆模塊了。
什麼是區域:網絡區域定義了網絡連接的可信等級
數據包要進入到內核必須要通過這些zone中的一個,而不同的zone裏定義的規則不一樣(即
信任度不一樣,過濾的強度也不一樣)。可以根據網卡所連接的網絡的安全性來判斷,這張
網卡的流量到底使用哪個 zone,比如上圖來自 eth0 的流量全部使用 zone1 的過濾規則,eth1
的流量使用 zone2。一張網卡同時只能綁定到一個 zone
預定義的服務:服務是端口和/或協議入口的組合。
端口和協議:定義了 tcp 或 udp 端口,端口可以是一個端口或者端口範圍。
kernel
Zone1
Zone2
Zone3
Zone4
eth0
eth1
eth2
ICMP 阻塞:可以選擇 Internet 控制報文協議的報文。這些報文可以是信息請求亦可是對信
息請求或錯誤條件創建的響應。
僞裝:私有網絡地址可以被映射到公開的 IP 地址。這是一次正規的地址轉換。
端口轉發:端口可以映射到另一個端口以及/或者其他主機。
在進行 firewalld 配置之前,我想來討論一下區域(zones)這個概念。默認情況就有一些有
效的區域。由 firewalld 提供的區域按照從不信任到信任的順序排序。
•丟棄區域(Drop Zone):如果使用丟棄區域,任何進入的數據包將被丟棄。這個類似與我
們之前使用 iptables -j drop。使用丟棄規則意味着將不存在響應。
•阻塞區域(Block Zone):阻塞區域會拒絕進入的網絡連接,返回 icmp-host-prohibited,只
有服務器已經建立的連接會被通過即只允許由該系統初始化的網絡連接。
•公共區域(Public Zone):只接受那些被選中的連接,默認只允許 ssh 和 dhcpv6-client。這
個 zone 是缺省 zone
•外部區域(External Zone):這個區域相當於路由器的啓用僞裝(masquerading)選項。只
有指定的連接會被接受,即 ssh,而其它的連接將被丟棄或者不被接受。
•隔離區域(DMZ Zone):如果想要只允許給部分服務能被外部訪問,可以在 DMZ 區域中定
義。它也擁有隻通過被選中連接的特性,即 ssh。
•工作區域(Work Zone):在這個區域,我們只能定義內部網絡。比如私有網絡通信才被允
許,只允許 ssh,ipp-client 和 dhcpv6-client。
•家庭區域(Home Zone):這個區域專門用於家庭環境。它同樣只允許被選中的連接,即 ssh,
ipp-client,mdns,samba-client 和 dhcpv6-client。
•內部區域(Internal Zone):這個區域和工作區域(Work Zone)類似,只有通過被選中的連
接,和 home 區域一樣。
•信任區域(Trusted Zone):信任區域允許所有網絡通信通過。記住:因爲 trusted 是最被信
任的,即使沒有設置任何的服務,那麼也是被允許的,因爲 trusted 是允許所有連接的
以上是系統定義的所有的 zone,但是這些 zone 並不是都在使用。只有活躍的 zone 纔有
實際操作意義。
Firewalld 的原則:
如果一個客戶端訪問服務器,服務器根據以下原則決定使用哪個 zone 的策略去匹配
1.如果一個客戶端數據包的源 IP 地址匹配 zone 的 sources,那麼該 zone 的規則就適
用這個客戶端;一個源只能屬於一個 zone,不能同時屬於多個 zone。
2.如果一個客戶端數據包進入服務器的某一個接口(如 eth0)區配 zone 的 interfaces,
則麼該 zone 的規則就適用這個客戶端;一個接口只能屬於一個 zone,不能同時屬於多個
zone。
3.如果上述兩個原則都不滿足,那麼缺省的 zone 將被應用
你可以使用任何一種 firewalld 配置工具來配置或者增加區域,以及修改配置。工具有例如
firewall-config 這樣的圖形界面工具, firewall-cmd 這樣的命令行工具,或者你也可以在配
置文件目錄中創建或者拷貝區域文件,/usr/lib/firewalld/zones 被用於默認和備用配置,
/etc/firewalld/zones 被用於用戶創建和自定義配置文件。
命令行工具 firewall-cmd 支持全部防火牆特性,基本應用如下:
一般應用:
1、 獲取 firewalld 狀態
2、在不改變狀態的條件下重新加載防火牆:
如果你使用--complete-reload,狀態信息將會丟失。
3、獲取支持的區域列表
這條命令輸出用空格分隔的列表
4、獲取所有支持的服務
這條命令輸出用空格分隔的列表。
服務是 firewalld 所使用的有關端口和選項的規則集合。被啓動的服務會在 firewalld 服務
開啓或者運行時自動加載。默認情況下,很多服務是有效的。使用下面命令可列出有效
的服務。
想要列出默認有效的服務,也可以進入下面的目錄也能夠取得。
#cd /usr/lib/firewalld/services/
想要創建自己的服務,需要在下面的目錄下定義它。比如,現在我想添加一個 rhmp 服務,
端口號 1935。首先,任選一個服務複製過來。
接下來把複製過來的文件重命名爲“rtmp.xml”,
接下來打開並編輯文件的頭部、描述、協議和端口號,以供 RTMP 服務使用,如下圖所示
重啓 firewalld 服務或者重新加載設置,以激活這些設置。
firewall-cmd --reload
爲確認服務是否已經啓動,運行下面的命令獲取有效的服務列表。
firewall-cmd --get-services
5、獲取所有支持的 ICMP 類型
這條命令輸出用空格分隔的列表。
6、列出全部啓用的區域的特性(即查詢當前防火牆策略)
解釋:特性可以是定義的防火牆策略,如:服務、端口和協議的組合、端口/數據報轉發、
僞裝、ICMP 攔截或自定義規則等
上面的命令將會列出每種區域如 block、dmz、drop、external、home、internal、public、trusted
以及 work。如果區域還有其它詳細規則(rich-rules)、啓用的服務或者端口,這些區域
信息也會分別被羅列出來
7、輸出區域全部啓用的特性。如果省略區域,將顯示默認區域的信息。
firewall-cmd [--zone=] --list-all
輸出指定區域啓動的特性
8、查看默認區域
public 區域是默認區域。
在文件/etc/firewalld/firewalld.conf 中定義成 DefaultZone=public。
9、設置默認區域
firewall-cmd --set-default-zone=區域名
流入默認區域中配置的接口的新訪問請求將被置入新的默認區域。當前活動的連接將不
受影響。
10、獲取活動的區域
這條命令將用以下格式輸出每個區域所含接口:
區域名
interfaces : 接口名
11、根據接口獲取區域即需要查看哪個區域和這個接口綁定即查看某個接口是屬於哪個zone
的:
firewall-cmd --get-zone-of-interface=接口名
這條命令將輸出接口所屬的區域名稱。
12、將接口(網卡)增加到區域
firewall-cmd [--zone=] --add-interface=接口名
如果接口不屬於區域,接口將被增加到區域。如果區域被省略了,將使用默認區域。接
口在重新加載後將重新應用。
13、修改接口所屬區域
firewall-cmd [--zone=] --change-interface=接口名
這個選項與 --add-interface 選項相似,但是當接口已經存在於另一個區域的時候,該接
口將被添加到新的區域。
14、從區域中刪除一個接口
firewall-cmd [--zone=] --remove-interface=接口名
注:如果某個接口不屬於任何 Zone,那麼這個接口的所有數據包使用默認的 Zone 的規
則
15、查詢區域中是否包含某接口
firewall-cmd [--zone=] --query-interface=接口名
如果區域被省略了,將使用默認區域
16、列舉區域中啓用的服務
firewall-cmd [ --zone= ] --list-services
如果區域被省略了,將使用默認區域
查看 home 區域中啓用服務
17、啓用應急模式阻斷所有網絡連接,以防出現緊急狀況
18、禁用應急模式
firewall-cmd --panic-off
19、查詢應急模式
firewall-cmd --query-panic
其他相關的配置項可以查看 firewall-cmd 的手冊頁:#man firewall-cmd
處理運行時區域:
運行時模式下對區域進行的修改不是永久有效的。重新加載或者重啓後修改將失效。
1、啓用區域中的一種服務即給某個區域開啓某個服務
firewall-cmd [--zone=區域] --add-service=服務 [--timeout=秒數]
此操作啓用區域中的一種服務。如果未指定區域,將使用默認區域。如果設定了超時時
間,服務將只啓用特定秒數。
18、禁用應急模式
firewall-cmd --panic-off
19、查詢應急模式
firewall-cmd --query-panic
其他相關的配置項可以查看 firewall-cmd 的手冊頁:#man firewall-cmd
處理運行時區域:
運行時模式下對區域進行的修改不是永久有效的。重新加載或者重啓後修改將失效。
1、啓用區域中的一種服務即給某個區域開啓某個服務
firewall-cmd [--zone=區域] --add-service=服務 [--timeout=秒數]
此操作啓用區域中的一種服務。如果未指定區域,將使用默認區域。如果設定了超時時
間,服務將只啓用特定秒數。
使區域中的 ipp-client 服務生效 60 秒:
啓用默認區域中的 http 服務:firewall-cmd --add-service=http
2、禁用區域中的某種服務即關閉某個服務
firewall-cmd [--zone=區域] --remove-service=服務
此舉禁用區域中的某種服務。如果未指定區域,將使用默認區域。
例:禁止默認區域中的 http 服務:
3、查詢區域中是否啓用了特定服務
firewall-cmd [--zone=區域] --query-service=服務
Yes 表示服務啓用,no 表示服務關掉了。
4、啓用區域端口和協議組合
firewall-cmd [--zone=區域] --add-port=portid[-portid]/protocol [--timeout=seconds]
此操作將啓用端口和協議的組合。端口可以是一個單獨的端口或者是一個端口範圍 - 。
協議可以是 tcp 或 udp。
5、禁用端口和協議組合
firewall-cmd [--zone=區域] --remove-port=portid[-portid]/protocol
6、查詢區域中是否啓用了端口和協議組合
firewall-cmd [--zone=區域] --query-port=portid[-portid]/protocol
7、啓用區域中的 IP 僞裝功能
firewall-cmd [--zone=區域] --add-masquerade
此操作啓用區域的僞裝功能。私有網絡的地址將被隱藏並映射到一個公有 IP。這是地址
轉換的一種形式,常用於路由。由於內核的限制,僞裝功能僅可用於 IPv4。
8、禁用區域中的 IP 僞裝
firewall-cmd [--zone=區域] --remove-masquerade
9、查詢區域的僞裝狀態
firewall-cmd [--zone=區域] --query-masquerade
注意:啓用僞裝功能的主機同時也需要開啓轉發服務:
echo 1 > /proc/sys/net/ipv4/ip_forward
或
#vi /etc/sysctl.conf 添加如下內容
net.ipv4.ip_forward = 1
保存退出並執行#sysctl -p 使修改生效
10、啓用區域的 ICMP 阻塞功能
firewall-cmd [--zone=區域] --add-icmp-block=icmp 類型
此操作將啓用選中的 Internet 控制報文協議(ICMP)報文進行阻塞。 ICMP 報文可以
是請求信息或者創建的應答報文,以及錯誤應答。
11、禁止區域的 ICMP 阻塞功能
firewall-cmd [--zone=區域] --remove-icmp-block=icmp 類型
12、查詢區域的 ICMP 阻塞功能
firewall-cmd [--zone=區域] --query-icmp-block=icmp 類型
13、在區域中啓用端口轉發或映射
firewall-cmd [--zone= 區 域 ]
--add-forward-port=port=portid[-portid]:proto=protocol[ :toport=portid[-portid]][ :toaddres
s=address [/mask]]
端口可以映射到另一臺主機的同一端口,也可以是同一主機或另一主機的不同端口。端
口號可以是一個單獨的端口或者是端口範圍 - 。協議可以爲 tcp 或 udp。目標端口可以
是端口號或者是端口範圍 - 。目標地址可以是 IPv4 地址。受內核限制,端口轉發功能
僅可用於 IPv4。
意思是凡是來從 external 進來的 22 端口的數據包全部轉發到 211.106.65.50
firewall-cmd --zone=external
--add-forward-port=port=22:proto=tcp:toaddress=211.106.65.50
14、禁止區域的端口轉發或者端口映射
firewall-cmd [--zone=]
--remove-forward-port=port=portid[-portid]:proto=protocol[ :toport=portid[-portid]][ :toad
dress=address [/mask]]
15、查詢區域的端口轉發或者端口映射
firewall-cmd
[--zone=]--query-forward-port=port=portid[-portid]:proto=protocol[ :toport=portid[-portid]]
[ :toaddress=address [/mask]]
處理永久區域:
永久選項不直接影響運行時的狀態。這些選項僅在重載或者重啓服務時可用。爲了使用運行
時和永久設置,需要分別設置兩者。選項--permanent 需要是永久設置的第一個參數。
1、獲取永久選項所支持的服務
firewall-cmd --permanent --get-services
2、獲取永久選項所支持的 ICMP 類型列表
firewall-cmd --permanent --get-icmptypes
3、獲取支持的永久區域
firewall-cmd --permanent --get-zones
4、配置防火牆在 public 區域打開 http 協議,並保存,以致重啓有效
firewall-cmd --permanent --zone=public --add-service=http
查看永久模式下 public 區域是否打開 http 服務。
firewall-cmd --permanent --zone=public --query-service=http
5、防火牆開放 8080 端口在 public 區域
firewall-cmd --permanent --zone=public --add-port=8080/tcp
6、命令行配置富規則:
查看富規則:# firewall-cmd --list-rich-rules
創建富規則:
firewall-cmd --add-rich-rule 'rule family=ipv4 source address=10.35.89.0/24 service
name=ftp log prefix="ftp" level=info accept' --permanent
firewall-cmd --add-rich-rule 'rule family=ipv4 source address=10.35.89.0/24 port port=80
protocol=tcp log prefix="80" level=info accept' --permanent
firewall-cmd --add-rich-rule rule family="ipv4" source address="192.168.10.30" forward-port
port="808" protocol="tcp" to-port="80" to-addr="10.10.10.2"
富規則中使用僞裝功能可以更精確詳細的限制:
firewall-cmd --add-rich-rule 'rule family=ipv4 source address=10.10.10.2/24 masquerade'
僅允許部分 IP 訪問本機服務配置
firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4"
source address="192.168.0.0/24" service name="http" accept"
禁止遠程 IP 訪問 ssh
firewall-cmd --permanent --zone=public --add-rich-rule=’rule family=ipv4
source address=192.168.0.0/24 service name=ssh reject’
7、刪除 rich 規則
firewall-cmd --permanent --zone=public --remove-rich-rule=’rule family=ipv4
source address=192.168.0.0/24 service name=ssh reject’
8、僅允許部分 IP 訪問本機端口配置
firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4"
source address="192.168.0.0/24"port protocol="tcp" port="8080" accept"
9、創建 rich 規則,可以指定日誌的前綴和輸出級別
firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source
address="192.168.0.4/24"port port=8080 protocol="tcp" log prefix=proxy level=warning
accept"
可以通過查看/var/log/messages 日誌文件
10、端口轉發。實驗環境下,desktop訪問server的5423端口,將訪問server的80端口。
Server 上的操作:(172.25.0.10 是 desktop 的 IP 地址)
11、172.25.1.0/24 網段內的客戶端不能訪問主機的 SSH
12、也可通過配置以下 XML 文件,進行對防火牆的配置修改
#cat /etc/firewalld/zones/public.xml
<?xml version="1.0" encoding="utf-8"?>
<zone>
<short>Public</short>
<description>For use in public areas. You do not trust the other computers on networks
to not harm your computer. Only selected incoming connections are accepted.</description>
<service name="dhcpv6-client"/>
<service name="ssh"/>
<rule family="ipv4">
<source address="192.168.0.4/24"/>
<service name="http"/>
<accept/>
</rule>
</zone>