一、名詞解釋
| 專有名詞 | 解釋 |
| target | 目標,這個前面學生也已經給大家介紹過了,可以理解為默認行為,有四個可選值:default、ACCEPT、%%REJECT%%、DROP,如果不設置默認為default |
| service | 表示一個服務 |
| port | 端口,使用port可以不通過service而直接對端口進行設置 |
| interface | 接口,可以理解為網卡 |
| source | 源地址,可以是ip地址也可以是ip地址段 |
| icmp-block | icmp報文阻塞,可以按照icmp類型進行設置 |
| masquerade | ip地址偽裝,也就是按照源網卡地址進行NAT轉發 |
| forward-port | 端口轉發 |
| rule | 自定義規則 |
| 區域 | 默認規則 |
| trusted | 允許所有的數據包 |
| home | 拒絕流入的流量,除非與流出的流量相關,而如果流量與ssh,mdns,ipp-client,amba_client與dhcpv6-client服務相關,則允許流量 |
| internal | 等同於home區域 |
| work | 拒絕流入的流量,除非與流出的流量數相關,而如果流量與ssh,mdns,ipp-client與dhcpv6-client服務相關,則允許流量 |
| public | 拒絕流入的流量,除非與流出的流量相關,而如果流量與ssh,dhcpv6-client服務相關,則允許流量 |
| external | 拒絕流入的流量,除非與流出的流量相關,而如果流量與ssh服務相關,則允許流量 |
| dmz | 拒絕流入的流量,除非與流出的流量相關,而如果流量與ssh服務相關,則允許流量 |
| block | 拒絕流入的流量,除非與流出的流量相關 |
| drop | 拒絕流入的流量,除非與流出的流量相關 |
二、命令
| 命令 | 解釋 |
| firewall-cmd [--permanent] [--zone=zone] --list-sources | 用於列出指定zone的所有綁定的source地址,不指定 zone ,則使用默認 zone |
firewall-cmd [--permanent] [--zone=zone] --query-source=source[/mask] |
用於查詢指定zone是否跟指定source地址進行了綁定,不指定 zone ,則使用默認 zone |
firewall-cmd [--permanent] [--zone=zone] --add-source=source[/mask] |
用於將一個source地址綁定到指定的zone(只可綁定一次,第二次綁定到不同的zone會報錯),不指定 zone ,則使用默認 zone |
firewall-cmd [--zone=zone] --change-source=source[/mask] |
用於改變source地址所綁定的zone,如果原來沒有綁定則進行綁定,這樣就跟--add-source的作用一樣了,不指定 zone ,則使用默認 zone |
firewall-cmd [--permanent] [--zone=zone] --remove-source=source[/mask] |
用於刪除source地址跟zone的綁定,不指定 zone ,則使用默認 zone |
| firewall-cmd [--permanent] [--zone=zone] --list-interfaces | 用於列出指定zone的所有綁定的 interface 網卡,不指定 zone ,則使用默認 zone |
| firewall-cmd [--permanent] [--zone=zone] --add-interface=interface | 用於將一個interface網卡綁定到指定的zone(只可綁定一次,第二次綁定到不同的zone會報錯),不指定 zone ,則使用默認 zone |
| firewall-cmd [--zone=zone] --change-interface=interface | 用於改變interface網卡所綁定的zone,如果原來沒有綁定則進行綁定,這樣就跟--add-interface的作用一樣了,不指定 zone ,則使用默認 zone |
| firewall-cmd [--permanent] [--zone=zone] --query-interface=interface | 用於查詢指定zone是否跟指定interface網卡進行了綁定,不指定 zone ,則使用默認 zone |
| firewall-cmd [--permanent] [--zone=zone] --remove-interface=interface | 用於刪除interface網卡跟zone的綁定,不指定 zone ,則使用默認 zone |
| firewall-cmd --set-default-zone=zone | 設置區域為默認區域 |
| firewall-cmd –get-default-zone | 查詢默認區域 |
| firewall-cmd --list-all-zones | 列出所有區域(其中區域標記為 active ,表示該區域綁定了 source 或 interface) |
| firewall-cmd –list-all | 顯示當前區域的網卡配置參數,資源,端口以及服務等信息 |
| firewall-cmd –get-zones | 顯示可用的區域 |
| firewall-cmd --get-active-zones | 獲取當前正在使用的區域 (即 標記為 active 的區域,也就是列出綁定了 source 和 interface 的區域) |
| firewall-cmd --get-zone-of-interface=interface | 根據指定網卡查詢其綁定的 zone |
firewall-cmd --get-zone-of-source=source[/mask] |
根據指定 source (IP) 查詢其綁定的 zone |
| firewall-cmd --permanent [--zone=zone] --get-target | 用於查詢指定 zone 的 target,不指定 zone ,則使用默認 zone |
firewall-cmd --permanent [--zone=zone] --set-target=target |
用於設定指定 zone 的 target,不指定 zone ,則使用默認 zone |
| firewall-cmd [--permanent] [--zone=zone] --list-services | 用於查詢指定 zone 的 綁定的 service,接不接受 service 中的端口流量 根據 zone 的 target 規則確認。不指定 zone ,則使用默認 zone |
| firewall-cmd –get-services | 顯示預先定義的服務 |
| firewall-cmd [--permanent] [--zone=zone] --add-service=service [--timeout=seconds] | 在指定的 zone 中添加 service , timeout 選項與 permanent 不能並行使用,表示這個service綁定在這個zone 上的失效時間,不指定 zone ,則使用默認 zone |
| firewall-cmd [--permanent] [--zone=zone] --remove-service=service | 在指定的 zone 中刪除指定的 service,不指定 zone ,則使用默認 zone |
| firewall-cmd [--permanent] [--zone=zone] --query-service=service | 在指定的 zone 上查詢是否有綁定指定的 service |
| firewall-cmd [--permanent] [--zone=zone] --list-ports | 用於查詢指定 zone 的 綁定的 port,接不接受 port 流量 根據 zone 的 target 規則確認。不指定 zone ,則使用默認 zone |
firewall-cmd [--permanent] [--zone=zone] --add-port=portid[-portid]/protocol [--timeout=seconds] |
在指定的zone 上綁定指定的 port,timeout 選項與 permanent 不能並行使用,表示這個port 綁定在這個zone 上的失效時間,不指定 zone ,則使用默認 zone |
firewall-cmd [--permanent] [--zone=zone] --remove-port=portid[-portid]/protocol |
在指定的 zone 中刪除指定的 port,不指定 zone ,則使用默認 zone |
firewall-cmd [--permanent] [--zone=zone] --query-port=portid[-portid]/protocol |
在指定的 zone 上查詢是否有綁定指定的 port |
| firewall-cmd [--permanent] [--zone=zone] --list-icmp-blocks | |
| firewall-cmd [--permanent] [--zone=zone] --add-icmp-block=icmptype [--timeout=seconds] | |
| firewall-cmd [--permanent] [--zone=zone] --remove-icmp-block=icmptype | |
| firewall-cmd [--permanent] [--zone=zone] --query-icmp-block=icmptype | |
| firewall-cmd [--permanent] [--zone=zone] --add-masquerade [--timeout=seconds] | |
| firewall-cmd [--permanent] [--zone=zone] --remove-masquerade | |
| firewall-cmd [--permanent] [--zone=zone] --query-masquerade | |
| firewall-cmd [--permanent] [--zone=zone] --list-forward-ports | |
firewall-cmd [--permanent] [--zone=zone] --add-forward-port=port=portid[-portid]:proto=protocol[:toport=portid[-portid]][:toaddr=address[/mask]][--timeout=seconds] |
|
firewall-cmd [--permanent] [--zone=zone] --remove-forward-port=port=portid[-portid]:proto=protocol[:toport=portid[-portid]][:toaddr=address[/mask]] |
|
firewall-cmd [--permanent] [--zone=zone] --query-forward-port=port=portid[-portid]:proto=protocol[:toport=portid[-portid]][:toaddr=address[/mask]] |
|
| firewall-cmd [--permanent] [--zone=zone] --list-rich-rules | |
firewall-cmd [--permanent] [--zone=zone] --add-rich-rule='rule' [--timeout=seconds] |
|
|
|
|
|
|
重新加載防火牆配置 |
|
開啟應急狀態模式 |
|
關閉應急狀態模式 |
三、知識點
1、防火牆中的 zone
哪個zone在起作用
我們知道每個zone就是一套規則集,但是有那么多zone,對於一個具體的請求來說應該使用哪個zone(哪套規則)來處理呢?這個問題至關重要,如果這點不弄明白其他的都是空中樓閣,即使規則設置的再好,不知道怎樣用、在哪里用也不行。
對於一個接受到的請求具體使用哪個zone,firewalld是通過三種方法來判斷的:
1、source,也就是源地址
2、interface,接收請求的網卡
3、firewalld.conf中配置的默認zone
這三個的優先級按順序依次降低,也就是說如果按照source可以找到就不會再按interface去查找,如果前兩個都找不到才會使用第三個,也就是學生在前面給大家講過的在firewalld.conf中配置的默認zone。
好了,我們現在知道其原理了,下面學生就給大家介紹每一種方式所對應的配置方法。
配置source
source是在zone的xml文件中配置的,其格式為
<
zone
>
<
source
address
=
"address[/mask]"
/>
</
zone
>
|
只要我們將source節點放入相應的zone配置文件中就可以了,節點的address屬性就是源地址,不過我們要注意相同的source節點只 可以在一個zone中進行配置,也就是說同一個源地址只能對於一個zone,另外,直接編輯xml文件之后還需要reload才可以起作用,這些學生前面已經給大家講過,這里就不再重述了。
另外,我們當然也可以使用firewall-cmd命令進行配置,這里主要有五個相關命令(參數)
firewall-cmd [--permanent] [--zone=zone] --list-sources
firewall-cmd [--permanent] [--zone=zone] --query-
source
=
source
[
/mask
]
firewall-cmd [--permanent] [--zone=zone] --add-
source
=
source
[
/mask
]
firewall-cmd [--zone=zone] --change-
source
=
source
[
/mask
]
firewall-cmd [--permanent] [--zone=zone] --remove-
source
=
source
[
/mask
]
|
我們分別來介紹一下
-
--list-sources:用於列出指定zone的所有綁定的source地址
-
--query-source:用於查詢指定zone是否跟指定source地址進行了綁定
-
--add-source:用於將一個source地址綁定到指定的zone(只可綁定一次,第二次綁定到不同的zone會報錯)
-
--change-source:用於改變source地址所綁定的zone,如果原來沒有綁定則進行綁定,這樣就跟--add-source的作用一樣了
-
--remove-source:用於刪除source地址跟zone的綁定
另外,大家可以看到上面的命令中有兩個可選參數:--permanent和--zone,--permanent學生在前面已經給大家介紹過了,表 示是否存儲到配置文件中(如果存儲到配置文件中這不會立即生效),--zone用於指定所要設置的zone,如果不指定則使用默認zone。
我們來看個例子
[root@excelib.com ~]
# firewall-cmd --zone=drop --change-source=1.2.3.4
|
這樣就可以將1.2.3.4綁定到drop這個zone中了,如果沒有修改過drop規則的話所有來自1.2.3.4這個ip的連接將會被drop。
至於什么時候使用add什么時候使用change,如果我們就是想將某源地址綁定到指定的zone那么最好使用change,而如果想在源地址沒綁定的時候進行綁定,如果已經綁定過則不綁定那么就使用add。
配置interface
interface有兩個可以配置的位置:1、zone所對應的xml配置文件2、網卡配置文件(也就是ifcfg-*文件)。
第一種配置跟source大同小異,學生這里就不再細述了,interface在zone配置文件中的節點為
<
zone
>
<
interface
name
=
"string"
/>
</
zone
>
|
相關的firewall-cmd命令為
firewall-cmd [--permanent] [--zone=zone] --list-interfaces
firewall-cmd [--permanent] [--zone=zone] --add-interface=interface
firewall-cmd [--zone=zone] --change-interface=interface
firewall-cmd [--permanent] [--zone=zone] --query-interface=interface
firewall-cmd [--permanent] [--zone=zone] --remove-interface=interface
|
另外,我們還可以在網卡配置文件中進行配置,比如可以在ifcfg-em1文件中添加下面的配置
ZONE=public
|
這行配置就相當於下面的命令
[root@excelib.com ~]
# firewall-cmd --zone=public --change-interface=em1
|
這樣配置之后來自em1的連接就會使用public這個zone進行管理(如果source匹配了其他的zone除外)。
配置默認zone
默認zone的配置學生前面已經給大家介紹過了,他是通過firewalld.conf配置文件的DefaultZone配置項來配置的,當然也可以使用firewall-cmd命令來配置
firewall-cmd --
set
-default-zone=zone
|
另外還可以通過--get-default-zone來獲取默認zone的值。
查看當前起作用的zone
我們可以使用下面的命令來查看當前所有起作用的zone
firewall-cmd --get-active-zones
|
這個命令會返回所有綁定了source、interface以及默認的zone,並會說明在什么情況下使用。
反向查詢
firewalld還給我們提供了反向查詢的命令,也就是根據source或者interface查詢所對應的zone,其命令如下
firewall-cmd --get-zone-of-interface=interface
firewall-cmd --get-zone-of-
source
=
source
[
/mask
]
|
有了這兩個命令我們就可以檢查我們的設置是否正確了。
好了,現在大家就明白了一個接收到的請求具體使用哪個zone了,那么zone具體的規則怎么配置呢?下面學生就來給大家詳細介紹。
zone規則配置
target
zone規則中首先最重要的是target的設置,他默認可以取四個值:default、ACCEPT、%%REJECT%%、DROP,其含義很容易理解,這里學生就不介紹了,下面來說怎么配置。
在xml文件中target是zone節點的一個屬性,比如drop.xml中為
<
zone
target
=
"DROP"
>
|
block.xml中為
<
zone
target
=
"%%REJECT%%"
>
|
如果使用firewall-cmd命令來操作,命令如下
firewall-cmd --permanent [--zone=zone] --get-target
firewall-cmd --permanent [--zone=zone] --
set
-target=target
|
我們要特別注意,這里的--permanent不是可選的,也就是說使用firewall-cmd命令也不可以讓他直接生效,也需要reload才可以。
service
service學生在前面也已經給大家介紹過了,他的配置和我們上面所介紹的source基本相同,只不過同一個service可以配置到多個不同的zone中,當然也就不需要--change命令了,他在zone配置文件中的節點為
<
zone
>
<
service
name
=
"string"
/>
</
zone
>
|
相應的配置命令為
firewall-cmd [--permanent] [--zone=zone] --list-services
firewall-cmd [--permanent] [--zone=zone] --add-service=service [--timeout=seconds]
firewall-cmd [--permanent] [--zone=zone] --remove-service=service
firewall-cmd [--permanent] [--zone=zone] --query-service=service
|
具體每個命令的含義大家對照上面的source很容易就理解了,不過這里的--add命令中多了一個--timeout選項,學生這里給大家介紹一下。
--add-service中的--timeout的含義是這樣的:添加一個服務,但是不是一直生效而是生效一段時間,過期之后自動刪除。
這個選項非常有用,比如我們想暫時開放一個端口進行一些特殊的操作(比如遠程調試),等處理完成后再關閉,不過有時候我們處理完之后就忘記關閉了, 而現在的--timeout選項就可以幫我們很好地解決這個問題,我們在打開的時候就可以直接設置一個時間,到時間之后他自動就可以關閉了。另外,這個參 數還有更有用的用法,學生會在下面給大家講到。當然--timeout和--permanent是不可以一起使用的。
另外,這里我們主要講的是怎么在zone中使用service,而service自己的配置學生下節再給大家詳細介紹。
port
port是直接對端口的操作,他和service非常相似,所以這里也不詳細介紹了,port在zone中的配置節點為
<
zone
>
<
port
port
=
"portid[-portid]"
protocol
=
"tcp|udp"
/>
</
zone
>
|
相應命令為
firewall-cmd [--permanent] [--zone=zone] --list-ports
firewall-cmd [--permanent] [--zone=zone] --add-port=portid[-portid]
/protocol
[--timeout=seconds]
firewall-cmd [--permanent] [--zone=zone] --remove-port=portid[-portid]
/protocol
firewall-cmd [--permanent] [--zone=zone] --query-port=portid[-portid]
/protocol
|
icmp-block
icmp-block是按照icmp的類型進行設置阻塞,比如我們不想接受ping報文就可以使用下面的命令來設置
[root@excelib.com ~]
# firewall-cmd --add-icmp-block=echo-request
|
當然,如果需要長久保存就需要加--permanent選項,不過那樣就需要reload才能生效。
icmp-block在zone配置文件中的節點為
<
zone
>
<
icmp-block
name
=
"string"
/>
</
zone
>
|
相應操作命令為
firewall-cmd [--permanent] [--zone=zone] --list-icmp-blocks
firewall-cmd [--permanent] [--zone=zone] --add-icmp-block=icmptype [--timeout=seconds]
firewall-cmd [--permanent] [--zone=zone] --remove-icmp-block=icmptype
firewall-cmd [--permanent] [--zone=zone] --query-icmp-block=icmptype
|
masquerade
masquerade大家應該都比較熟悉,其作用就是ip地址偽裝,也就是NAT轉發中的一種,具體處理方式是將接收到的請求的源地址設置為轉發請 求網卡的地址,這在路由器等相關設備中非常重要,比如大家很多都使用的是路由器連接的局域網,而想上互聯網就得將我們的ip地址給修改一下,要不大家都是 192.168.1.XXX的內網地址,那請求怎么能正確返回呢?所以在路由器中將請求實際發送到互聯網的時候就會將請求的源地址設置為路由器的外網地 址,這樣請求就能正確地返回給路由器了,然后路由器再根據記錄返回給我們發送請求的主機了,這就是masquerade。
其設置非常簡單,在zone中是一個沒有參數(屬性)的節點
<
zone
>
<
masquerade
/>
</
zone
>
|
操作命令為
firewall-cmd [--permanent] [--zone=zone] --add-masquerade [--timeout=seconds]
firewall-cmd [--permanent] [--zone=zone] --remove-masquerade
firewall-cmd [--permanent] [--zone=zone] --query-masquerade
|
forward-port
這項也非常容易理解,他是進行端口轉發的,比如我們要將在80端口接收到tcp請求轉發到8080端口可以使用下面的命令
[root@excelib.com ~]
# firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080
|
forward-port還支持范圍轉發,比如我們還可以將80到85端口的所有請求都轉發到8080端口,這時只需要將上面命令中的port修改為80-85即可。
在zone配置文件中節點如下
<
zone
>
<
forward-port
port
=
"portid[-portid]"
protocol
=
"tcp|udp"
[
to-port
=
"portid[-portid]"
] [
to-addr
=
"ipv4address"
]/>
</
zone
>
|
相關操作命令如下
firewall-cmd [--permanent] [--zone=zone] --list-forward-ports
firewall-cmd [--permanent] [--zone=zone] --add-forward-port=port=portid[-portid]:proto=protocol[:toport=portid[-portid]][:toaddr=address[
/mask
]][--timeout=seconds]
firewall-cmd [--permanent] [--zone=zone] --remove-forward-port=port=portid[-portid]:proto=protocol[:toport=portid[-portid]][:toaddr=address[
/mask
]]
firewall-cmd [--permanent] [--zone=zone] --query-forward-port=port=portid[-portid]:proto=protocol[:toport=portid[-portid]][:toaddr=address[
/mask
]]
|
rule
rule可以用來定義一條復雜的規則,其在zone配置文件中的節點定義如下
<
zone
>
<
rule
[
family
=
"ipv4|ipv6"
]>
[ <
source
address
=
"address[/mask]"
[
invert
=
"bool"
]/> ]
[ <
destination
address
=
"address[/mask]"
[
invert
=
"bool"
]/> ]
[
<
service
name
=
"string"
/> |
<
port
port
=
"portid[-portid]"
protocol
=
"tcp|udp"
/> |
<
protocol
value
=
"protocol"
/> |
<
icmp-block
name
=
"icmptype"
/> |
<
masquerade
/> |
<
forward-port
port
=
"portid[-portid]"
protocol
=
"tcp|udp"
[
to-port
=
"portid[-portid]"
] [
to-addr
=
"address"
]/>
]
[ <
log
[
prefix
=
"prefixtext"
] [
level
=
"emerg|alert|crit|err|warn|notice|info|debug"
]/> [<
limit
value
=
"rate/duration"
/>] </
log
> ]
[ <
audit
> [<
limit
value
=
"rate/duration"
/>] </
audit
> ]
[ <
accept
/> | <
reject
[
type
=
"rejecttype"
]/> | <
drop
/> ]
</
rule
>
</
zone
>
|
可以看到這里一條rule的配置的配置項非常多,比zone本身還多出了destination、log、audit等配置項。其實這里的rule就相當於使用iptables時的一條規則。rule的操作命令如下
firewall-cmd [--permanent] [--zone=zone] --list-rich-rules
firewall-cmd [--permanent] [--zone=zone] --add-rich-rule=
'rule'
[--timeout=seconds]
firewall-cmd [--permanent] [--zone=zone] --remove-rich-rule=
'rule'
firewall-cmd [--permanent] [--zone=zone] --query-rich-rule=
'rule'
|
這里的參數'rule'代表一條規則語句,語句結構就是直接按照上面學生給大家的節點結構去掉尖括號來書寫就可以了,比如要設置地址為 1.2.3.4的source就可以寫成source address="1.2.3.4",也就是直接寫標簽名,然后跟着寫屬性就可以了,我們來看個例子
[root@excelib.com ~]
# firewall-cmd --add-rich-rule='rule family="ipv4" source address="1.2.3.4" drop'
|
這條規則就會將1.2.3.4這個源地址的連接全部給 drop 掉。
使用rule結合--timeout我們可以實現一些非常好玩和有用的功能,比如我們可以寫個自動化腳本,當發現有異常的連接時就可以添加一條rule將其相應的地址drop掉,而且還可以使用--timeout給設置個時間段,過了之后再自動開放!
四、用法總結
1、通過不同的zone中設置規則來進行流量限制
部署圖如下:

要求: 服務器B 信任來源為 10.19.158.112 的數據包
分析:
服務器 B 上的 /etc/firewalld 下文件目錄結構如下:


zones 目錄下存在 2個 zone 文件,分別為 public.xml \ trusted.xml
public.xml 內容如下:

services 目錄下聲明信任的服務文件:

ipsets 目錄下聲明的信任IP文件:

zones/trusted.xml 文件:

在 trusted 區域中使用 source 標簽聲明信任 114 和 110 兩個 IP
在以上的配置中 trusted.xml 中的內容不可更改。
通過以上服務器防火牆配置文件可以看出:
trusted 區域中配置 信任 10.19.158.114、10.19.158.110
public 區域中配置 信任 10.19.158.108、10.19.158.113
結合第三章節中的第一小節點的知識點,可以分析出 服務器B接收數據包之后的處理方式如下:

有 sources\ interface 配置項的 區域才是活躍狀態,服務器B中 活躍的 區域為 trusted.

默認區域為 public zone

所以根據規則服務器B收到包之后被處理的規則如下:

(1) 由於 所有 zones 中只有 trusted 配置了 sources ,所以 先查看 數據包是否符合 trusted zone 中的規則,會發現不符合,trusted zone 僅接收 src 為 114 和 110 的數據包;
(2) 接着會查看是否有 zones 中配置了 interface ,但是未發現存在這樣的 zone (若是存在,則會進行規則比對,看 接收數據包的網卡在 這樣的 zone 中的處理規則);
(3) (1)\(2) 都沒有找到規則處理該數據包的情況下,會使用默認的 zone 進行處理,本示例中默認的zone 為public ,該 public 配置的信任 IP 也不包括該數據包的 src ip,為了解決該問題,只能在 public zone 中的 ipset 的 IP 信任列表中增加該數據包的 src (112 ) 即可;
2、把原本訪問本機 888 端口的流量轉發到 22 端口,當前和長期均有效
流量轉發命令的格式為:firewall-cmd --permanent --zone=<區域> --add-forward-port=port=<源端口號>:proto=<協議>:toport=<目標端口號>:toaddr=<目標IP地址>
| [root@localhost ~]# firewall-cmd --permanent --zone=public --add-forward-port=port=888:proto=tcp:toport=22:toaddr=192.168.157.133 |
然后在客戶端使用 ssh 命令訪問 192.168.157.133 的 888 端口,如下

來源於:
https://www.cnblogs.com/excelib/p/5155951.html
https://blog.csdn.net/aaaaaab_/article/details/80586874
