1. 程式人生 > >【RHEL7/CentOS7防火墻之firewall-cmd命令詳解】

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

配置 cep 語法 watermark 不同的 類型 mil 全部 firewalld

目錄

  • Firewalld zone
  • firewall-cmd
  • 開始配置防火墻策略
  • 總結

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

基於iptables的防火墻已默認不啟動,但仍然可以繼續使用。

RHEL7中有這幾種防火墻共存:firewalldiptablesip6tablesebtables

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

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

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

由於這幾種防火墻的daemon是沖突的,所以建議禁用其它幾種防火墻。

# 禁用方法一:
[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命令】

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
.
這裏直接以示例講解
(以下示例未經測試,對照著語法寫的,有些示例需要開啟路由轉發)
```shell

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手冊頁:
技術分享圖片

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