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

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

目錄

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

基於iptables的防火牆已預設不啟動,但仍然可以繼續使用。

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

RHEL7的核心版本是3.10,在此版本的核心裡防火牆的包過濾機制是firewalld,使用firewalld來管理netfilter,不過底層呼叫的命令仍然是iptables

等。
@
***

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

# 查firewalld軟體包是否安裝
[[email protected] ~]# rpm -q firewalld
firewalld-0.5.5-1.fc28.noarch

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

# 禁用方法一:
[[email protected] ~]# systemctl mask {iptables,ip6tables,ebtables}

# 禁用方法二:
[[email protected]
~]# 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,並複製其中一個服務:

[[email protected] ~]# cd /usr/lib/firewalld/services
[[email protected] 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偽裝功能的主機必須同時開啟路由轉發服務,具體操作如下:

# 方法一:
[[email protected] ~]# echo 1 > /proc/sys/net/ipv4/ip_forward

# 方法二:
[[email protected] ~]# echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
[[email protected] ~]# 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手冊頁:
在這裡插入圖片描述