【RHEL7/CentOS7防火牆之firewall-cmd命令詳解】

"Redhat Enterprise Linux7已默認使用firewalld防火牆,其管理工具是firewall-cmd。使用方式也發生了很大的改變。shell

基於iptables的防火牆已默認不啓動,但仍然能夠繼續使用。安全

RHEL7中有這幾種防火牆共存:firewalldiptablesip6tablesebtables服務器

RHEL7的內核版本是3.10,在此版本的內核裏防火牆的包過濾機制是firewalld,使用firewalld來管理netfilter,不過底層調用的命令仍然是iptables等。
@網絡


RHEL7雖然仍有iptables,但不建議使用了,而是使用新的firewalld服務。ssh

# 查firewalld軟件包是否安裝
[root@CentOS7 ~]# rpm -q firewalld
firewalld-0.5.5-1.fc28.noarch

因爲這幾種防火牆的daemon是衝突的,因此建議禁用其它幾種防火牆。tcp

# 禁用方法一:
[root@CentOS7 ~]# systemctl mask {iptables,ip6tables,ebtables}

# 禁用方法二:
[root@CentOS7 ~]# for service in iptables ip6tables ebtables;do
> systemctl mask ${service}.service
> done

禁用後,咱們查詢一下這幾種防火牆的狀態,以下圖:在這裏插入圖片描述
systemctl命令用於服務控制,詳見【Redhat7/CentOS7服務控制之systemctl命令】ide

firewalld提供了支持網絡/防火牆區域(zone)定義網絡連接以及接口安全等級的防火牆管理工具,擁有運行時配置永久配置選項。擁有容許服務或應用程序直接添加防火牆規則的接口。
.
之前的system-config-firewall防火牆模型是靜態的,每次修改都要求防火牆徹底重啓。這個過程包括內核netfilter防火牆模塊的卸載和新配置所須要模塊的裝載等。
.
相反,firewall daemon是動態管理防火牆,應用更改時沒必要重啓整個防火牆,於是也就沒有必要重載全部內核防火牆模塊。
在這裏插入圖片描述工具

補充知識點
.
預約義服務:這裏的服務是端口和(或)協議入口的組合。
.
端口和協議:定義的tcp/udp端口,端口能夠是一個端口,也能夠是端口範圍。
.
ICMP阻塞:能夠選擇Internet控制報文協議的報文,這些報文能夠是報文請求,亦但是對信息請求或錯誤條件建立的響應。
.
假裝:私有的網絡地址能夠被映射到公開的IP地址,這是一次正規的地址轉換。
.
端口轉發:端口能夠映射到另外一個端口以及(或者)其它主機。測試


Firewalld zone

什麼是zone(區域)?網絡區域定義了網絡連接的可信等級。
在這裏插入圖片描述
如上圖,數據包若要進入內核,必須通過其中一個zone。而不一樣的zone裏定義的規則也不同(即信任度不同,過濾的強度也不同)。
.
可根據網卡所鏈接的網絡的安全性來判斷某張網卡的流量使用的是哪一個zone。好比上圖中來自eth0網卡的流量所有使用zone1的過濾規則,eth1網卡的流量所有使用zone2的過濾規則。一張網卡同時只能綁定到一個zone.命令行

firewalld默認爲咱們提供了9個區域,默認就有一些區域是有效的。這些區域按照不信任到信任的順序排序,以下。
.
起---------------------------------
丟棄區域(Drop Zone)
若是使用丟棄區域,任何進入的數據包都將被丟棄。
這個相似於6.x版本中使用的iptables -j drop
使用丟棄規則意味着將不存在響應。
.
阻塞區域(Block Zone)
阻塞區域會拒絕進入的網絡鏈接,並返回icmp-host-prohibited
只有服務器已經創建的鏈接會被經過,即只容許由該系統初始化的網絡鏈接。
.
公共區域(Public Zone)
只接受被選中的鏈接,默認只容許ssh和dhcpv6-client。
這個zone是缺省zone,即被默認使用的Zone。
.
外部區域(External Zone)
只有指定的鏈接會被接受,即ssh,而其它的鏈接將被丟棄或不被接受。
這個區域相似於路由器的啓用假裝(masquerading)選項。
.
隔離區域(DMZ Zone)
該區域只容許被選中的鏈接通行。
若是隻容許部分服務能被外部訪問,能夠在DMZ區域中定義。
.
工做區域(Work Zone)
在這個區域,咱們只能定義內部網絡鏈接。
好比私有網絡通訊才被容許,只容許ssh, ipp-client和dhcpv6-client。
.
家庭區域(Home Zone)
這個區域專用於家庭環境。
它一樣只容許被選中的鏈接,即ssh,ipp-client,mdns,samba-client和dhcpv6-client。
.
內部區域(Internal Zone)
這個區域和工做區域相似,只有被選中的鏈接纔可通行,和家庭區域同樣。
.
信任區域(Trusted Zone)
信任區域容許全部網絡鏈接通行。
切記:trusted區域是最被信任的區域,使用該區域時,在不作任何配置的狀況下容許全部鏈接通行。
--------------------------------------始
.
以上是系統定義的全部的zone,但這些zone並非都在使用,只有活躍的zone纔有實際操做意義。

Firewalld 原則
.
當一個客戶端訪問服務器時,服務器將根據如下原則決定使用哪一個zone的策略去匹配。
.
1
若是這個客戶端數據包的源IP地址匹配zone的sources(來源),那麼該zone的規則就適用這個客戶端。
注意:一個源只能屬於一個zone,不能同時屬於多個zone。
.
2
若是這個客戶端數據包進入服務器的某一個接口(如eth0)區配zone的interfaces, 則麼該zone的規則就適用這個客戶端。
一個接口只能屬於一個zone,不能同時屬於多個zone。
.
3
若是上述兩個原則都不知足,那麼缺省的zone將被應用,即便用public區域。


firewall-cmd

你可使用任何一種firewalld配置工具來配置區域和防火牆策略。
工具例如firewall-config圖形化工具;firewall-cmd命令行工具,命令行工具支持所有防火強特性。

你也能夠在配置文件目錄中建立或者拷貝區域文件。
/usr/lib/firewalld/zones目錄下的文件被用於默認和備用配置。
/etc/firewalld/zones目錄下的文件被用於用戶建立和自定義的配置文件。
在這裏插入圖片描述

基本應用

firewall-cmd --state
獲取firewalld狀態
.
firewall-cmd --reload
在不改變狀態的條件下重載防火牆
.
firewall-cmd --complete-reload
徹底重啓,狀態信息將會丟失
.
firewall-cmd --get-zones
獲取支持的區域
.
firewall-cmd --get-services
獲取全部支持的服務,支持的服務存放在/usr/lib/firewalld/services目錄下。
服務是firewalld所使用的有關端口和選項的規則集合。
被啓動的服務會在firewalld服務開啓或運行是自動加載。
咱們還能夠建立本身的服務,即添加端口和服務的對應關係,將在下面講解。
.
firewall-cmd --get-icmptypes
獲取全部支持的ICMP類型
.
firewall-cmd --list-all-zones
列出所有啓用的區域的特性(即查詢當前防火牆策略),特性是定義的防火牆策略。
策略如:服務、端口和協議的組合、端口/數據報轉發、假裝、ICMP攔截或自定義規則等。
該命令會列出全部區域的全部特性,包括詳細規則(rich-rules)。
.
firewall-cmd [--zone=區域] --list-all
輸出指定區域啓用的所有特性,若是區域被省略,將顯示默認區域的信息。
.
firewall-cmd --get-default-zone
查默認區域,默認的默認區域爲public
.
firewall-cmd --set-default-zone=區域
設置默認區域,也可經過/etc/firewalld/firewalld.conf中的DefaultZone配置項定義默認區域。
流入默認區域中配置的接口的新訪問請求將被置入新的默認區域。當前活動的鏈接將不受影響。
.
firewall-cmd --get-active-zones
獲取活動的區域,同時會輸出活動區域所包含的接口。
.
firewall-cmd --get-zone-of-interface=網卡名
查指定接口屬於哪一個區域
.
firewall-cmd [--zone=區域] --add-interface=接口名
將指定接口增長到指定區域,若是區域被省略了,將會被添加到默認區域。
一個接口同時只能屬於一個區域,接口會在防火牆從新加載後從新應用。
.
firewall-cmd [--zone=區域] --change-interface=接口名
修改接口所屬區域,這個選項與--add-interface選項類似。
但不一樣的是,當接口已經存在於另外一個區域的時候,該接口將被重置到新的區域。
.
firewall-cmd [--zone=區域] --remove-interface=接口名
從指定區域中刪除指定接口,刪除後,這個接口的全部數據包將使用默認區域的規則。
.
firewall-cmd [--zone=區域] --query-interface=接口名
查指定區域中是否包含指定接口,若是區域被省略了,將被指定爲默認區域。
.
firewall-cmd [--zone=區域] --list-services
列舉區域中啓用的服務,若是區域被省略了,將使用默認區域。
.
firewall-cmd --query-masquerade 檢查是否容許NAT轉發
firewall-cmd --zone=public --add-masquerade --permanent 永久開啓路由轉發
firewall-cmd --remove-masquerade 禁止防火牆NAT轉發
.
firewall-cmd --panic-on 啓用應急模式,將阻斷全部網絡鏈接,以防出現緊急情況。
firewall-cmd --panic-off 禁用應急模式
firewall-cmd --query-panic 查應急模式狀態
.
其它相關的配置可在手冊頁man firewall-cmd中查看。

建立本身的服務
.
步驟一
進入目錄/usr/lib/firewalld/services,並複製其中一個服務:

[root@CentOS7 ~]# cd /usr/lib/firewalld/services
[root@CentOS7 services]# cp ssh.xml my_server.xml

.
步驟二
修改複製過來的服務文件,打開並編輯文件的頭部、描述、協議和端口號,以供自定義的服務使用,以下圖:
在這裏插入圖片描述
.
步驟三
重啓firewalld服務或者從新加載配置,以激活這些設置。
重啓命令firewall-cmd --reload
查剛建立服務是否被支持firewall-cmd --get-services | grep my_server


開始配置防火牆策略

這裏全部的對區域進行的配置都不是永久生效的,從新加載或重啓服務後都將失效。

可在命令後面加上--permanent指定爲永久生效,重載服務後配置生效。

服務相關

firewall-cmd [--zone=區域] --add-service=服務名 [--timeout=秒]
給某個區域開啓某個服務,若是未指定區域,將使用默認區域。
--timeout:用於指定服務在多少秒後從區域中刪除。
.
firewall-cmd [--zone=區域] --remove-service=服務
禁用指定區域中的指定服務,若是未指定區域,將使用默認區域。
.
firewall-cmd [--zone=區域] --query-service=服務
查指定區域中是否開啓了指定服務,若是未指定區域,將使用默認區域。

端口和協議相關

firewall-cmd [--zone=區域] --add-port=端口(端口範圍)/協議 [--timeout=秒數]
此操做將啓用端口和協議的組合。若是未指定區域,將使用默認區域。
端口能夠是一個單獨的端口,也能夠是一個端口範圍,協議能夠是tcp或udp。
示例1:在work區域開啓666/tcp端口,失效時間60秒
firewall-cmd --zone=work --add-port=666/tcp --timeout=60
示例2:在默認開啓10-20範圍的udp端口,失效時間60秒
firewall-cmd --add-port=10-20/udp --timeout=60
.
firewall-cmd [--zone=區域] --remove-port=端口(端口範圍)/協議
禁用端口和協議組合,若是未指定區域,將使用默認區域。
端口和協議同上的用法同上示例。
.
firewall-cmd [--zone=區域] --query-port=端口(端口範圍)/協議
查詢指定區域中是否啓用了指定端口和協議的組合,若是未指定區域,將使用默認區域。
端口和協議同上的用法同上示例。

IP假裝相關

firewall-cmd [--zone=區域] --add-masquerade
啓用區域中的 IP 假裝功能,私有網絡的地址將被隱藏並映射到一個公有IP。
這是地址轉換的一種形式,經常使用於路由。因爲內核的限制,假裝功能僅可用於IPv4。
.
firewall-cmd [--zone=區域] --remove-masquerade
禁用區域中的 IP 假裝。
.
firewall-cmd [--zone=區域] --query-masquerade
查詢區域的假裝狀態
.
注意:
啓用IP假裝功能的主機必須同時開啓路由轉發服務,具體操做以下:

# 方法一:
[root@CentOS7 ~]# echo 1 > /proc/sys/net/ipv4/ip_forward

# 方法二:
[root@CentOS7 ~]# echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
[root@CentOS7 ~]# sysctl -p

ICMP阻塞相關

ICMP:控制報文協議。
.
firewall-cmd [--zone=區域] --add-icmp-block=icmp類型
此操做將指定的ICMP報文進行阻塞。
ICMP報文能夠是請求信息或者建立的應答報文,以及錯誤應答。
經常使用的報文類型有:echo-request請求報文,echo-reply響應報文。
.
firewall-cmd [--zone=區域] --remove-icmp-block=icmp類型
禁用指定區域指定的ICMP報文阻塞。
.
firewall-cmd [--zone=區域] --query-icmp-block=icmp類型
查指定區域的是否開啓了指定的ICMP報文阻塞。

端口轉發/映射相關

請確保開啓了本機的路由轉發服務,上面已經講解了開啓方法。
並打開firewalld的路由轉發服務:firewall-cmd --permanent --zone=public --add-masquerade
.
firewall-cmd [--zone=區域] --add-forward=port=端口(端口範圍):proto=協議:toaddress=目的地址
將指定區域負責的端口轉發到指定的地址。
端口能夠映射到另外一臺主機的同一端口,也能夠是同一主機或另外一主機的不一樣端口。
端口號能夠是一個單獨的端口,也能夠是端口範圍(例如10-20) ,協議能夠爲tcp或udp。
目標端口能夠是端口號,也能夠是端口範圍(例如10-20) 。
目標地址必須是IPv4地址。受內核限制,端口轉發功能僅可用於IPv4。
示例1:凡是來從work區域進來的22/tcp端口的數據包所有轉發到211.106.65.50
firewall-cmd --zone=work --add-forward=port=22:proto=tcp:toaddress=211.106.65.50
示例2:將80端口的流量轉發至192.168.0.1的8080端口
firewall-cmd --add-forward-port=port=80:proto=tcp:toaddr=192.168.0.1:toport=8080
.
firewall-cmd [--zone=區域] --remove-forward-port=port=端口(端口範圍):proto=協議:toaddress=目的地址
禁止區域的端口轉發或者端口映射
.
firewall-cmd [--zone=區域] --query-forward-port=port=端口(端口範圍):proto=協議:toaddress=目的地址
查詢區域的端口轉發或者端口映射。

終極用法 富規則

請確保開啓了本機的路由轉發服務,上面已經講解了開啓方法。
並打開firewalld的路由轉發服務:firewall-cmd --permanent --zone=public --add-masquerade
日誌文件:/var/log/messages
查已建立的富規則 firewall-cmd --list-rich-rules
.
這裏直接以示例講解
(如下示例未經測試,對照着語法寫的,有些示例須要開啓路由轉發)

# 1.容許10.35.89.0/24網段的主機訪問本機的ftp服務,同時指定日誌的前綴和輸出級別:
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

# 2.容許10.35.89.0/24網段的主機訪問本機的80/tcp端口,同時指定日誌的前綴和輸出級別:
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

# 3.將訪問端口是808且源ip是192.168.10.0/24的主機轉發到10.10.10.2:80
firewall-cmd --add-rich-rule 'rule family="ipv4" source address="192.168.10.0/24" forward-port port="808" protocol="tcp" to-port="80" to-addr="10.10.10.2"' --permanent

# 4.富規則中使用假裝功能能夠更精確詳細的限制:
firewall-cmd --add-rich-rule 'rule family=ipv4 source address=10.10.10.2/24 masquerade'

# 5.容許192.168.1.0/24網段的地址訪問本機的http服務:
firewall-cmd --zone=public --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" service name="http" accept'

# 6. 禁止192.168.1.0/24網段的地址訪問本機的ssh服務:
firewall-cmd --permanent --zone=public --add-rich-rule='rule family=ipv4 source address=192.168.1.0/24 service name=ssh reject'

# 7. 刪除示例6建立的富規則
firewall-cmd --permanent --zone=public --remove-rich-rule='rule family=ipv4 source address=192.168.1.0/24 service name=ssh reject'

# 8. 容許192.168.1.0/24端口的主機訪問本機的8080端口,同時指定日誌的前綴和輸出級別:
firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port port=8080 protocol="tcp" log prefix=proxy level=warning accept'

# 9.將訪問端口是5432且源ip是192.168.0.0/32的主機轉發到本機的80端口:
firewall-cmd --permanent --add-rich-rule 'rule family=ipv4 source address=192.168.0.0/32 forward-port port=5432 protocol=tcp to-port=80'

# 10. 容許icmp協議的數據包通訊:
firewall-cmd --add-rich-rule 'rule protocol value="icmp" accept' --permanent

終極用法 修改配置文件

其區域配置文件在/etc/firewalld/zones/目錄下。
.
文件內容解析以下圖:
在這裏插入圖片描述


總結

netfilter防火牆老是容易受到規則順序的影響,由於一條規則在鏈中沒有固定的位置。在一 條規則以前添加或者刪除規則都會改變此規則的位置。在靜態防火牆模型中,改變防火牆就是重建一個乾淨和完善的防火牆設置,默認鏈一般也沒有安全的方式添加或刪除規則而不影響其它規則。

動態防火牆有附加的防火牆功能鏈。這些特殊的鏈按照已定義的順序進行調用,於是向鏈中添加規則將不會干擾先前調用的拒絕和丟棄規則。從而利於建立更爲合理完善的防火牆配置。 下圖是一些由守護進程建立的規則,過濾列表中啓用了在公共區域對ssh、mdns和ipp-client的支持:
在這裏插入圖片描述

想要了解更多關於firewall防火牆的知識能夠查看其相關手冊頁:
在這裏插入圖片描述
rich-rule手冊頁:
在這裏插入圖片描述



"

相關文章
相關標籤/搜索