centos7 firewall-cmd 用活firewalld防火牆中的zone

原文:http://www.excelib.com/article/290/show/

firewalld中zone的含義學生前面已經給大家介紹過了,說白了一個zone就是一套規則集。可是什麼時候該用哪個zone、每個zone中的規則具體是怎麼設置呢?下面學生就來給大家詳細講解。

名詞解釋

在具體介紹zone之前學生先給大家介紹幾個相關的名詞,因爲如果不理解這幾個名詞zone就無從入手。

  • target:目標,這個前面學生也已經給大家介紹過了,可以理解爲默認行爲,有四個可選值:default、ACCEPT、%%REJECT%%、DROP,如果不設置默認爲default

  • service:這個在前面學生已經給大家解釋過了,他表示一個服務

  • port:端口,使用port可以不通過service而直接對端口進行設置

  • interface:接口,可以理解爲網卡

  • source:源地址,可以是ip地址也可以是ip地址段

  • icmp-block:icmp報文阻塞,可以按照icmp類型進行設置

  • masquerade:ip地址僞裝,也就是按照源網卡地址進行NAT轉發

  • forward-port:端口轉發

  • rule:自定義規則

哪個zone在起作用

我們知道每個zone就是一套規則集,但是有那麼多zone,對於一個具體的請求來說應該使用哪個zone(哪套規則)來處理呢?這個問題至關重要,如果這點不弄明白其他的都是空中樓閣,即使規則設置的再好,不知道怎樣用、在哪裏用也不行。

對於一個接受到的請求具體使用哪個zone,firewalld是通過三種方法來判斷的:

1、source,也就是源地址

2、interface,接收請求的網卡

3、firewalld.conf中配置的默認zone

這三個的優先級按順序依次降低,也就是說如果按照source可以找到就不會再按interface去查找,如果前兩個都找不到纔會使用第三個,也就是學生在前面給大家講過的在firewalld.conf中配置的默認zone

好了,我們現在知道其原理了,下面學生就給大家介紹每一種方式所對應的配置方法。

配置source

source是在zone的xml文件中配置的,其格式爲

1

2

3

<zone>

    <source address="address[/mask]"/>

</zone>

只要我們將source節點放入相應的zone配置文件中就可以了,節點的address屬性就是源地址,不過我們要注意相同的source節點只可以在一個zone中進行配置,也就是說同一個源地址只能對於一個zone,另外,直接編輯xml文件之後還需要reload纔可以起作用,這些學生前面已經給大家講過,這裏就不再重述了。

另外,我們當然也可以使用firewall-cmd命令進行配置,這裏主要有五個相關命令(參數)

1

2

3

4

5

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。

我們來看個例子

1

[[email protected] ~]# 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配置文件中的節點爲

1

2

3

<zone>

    <interface name="string"/>

</zone>

相關的firewall-cmd命令爲

1

2

3

4

5

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文件中添加下面的配置

1

ZONE=public

這行配置就相當於下面的命令

1

[[email protected] ~]# firewall-cmd --zone=public --change-interface=em1

這樣配置之後來自em1的連接就會使用public這個zone進行管理(如果source匹配了其他的zone除外)。

配置默認zone

默認zone的配置學生前面已經給大家介紹過了,他是通過firewalld.conf配置文件的DefaultZone配置項來配置的,當然也可以使用firewall-cmd命令來配置

1

firewall-cmd --set-default-zone=zone

另外還可以通過--get-default-zone來獲取默認zone的值。

查看當前起作用的zone

我們可以使用下面的命令來查看當前所有起作用的zone

1

firewall-cmd --get-active-zones

這個命令會返回所有綁定了source、interface以及默認的zone,並會說明在什麼情況下使用。

反向查詢

firewalld還給我們提供了反向查詢的命令,也就是根據source或者interface查詢所對應的zone,其命令如下

1

2

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中爲

1

<zone target="DROP">

block.xml中爲

1

<zone target="%%REJECT%%">

如果使用firewall-cmd命令來操作,命令如下

1

2

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配置文件中的節點爲

1

2

3

<zone>

    <service name="string"/>

</zone>

相應的配置命令爲

1

2

3

4

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中的配置節點爲

1

2

3

<zone>

    <port port="portid[-portid]" protocol="tcp|udp"/>

</zone>

相應命令爲

1

2

3

4

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報文就可以使用下面的命令來設置

1

[[email protected] ~]# firewall-cmd --add-icmp-block=echo-request

當然,如果需要長久保存就需要加--permanent選項,不過那樣就需要reload才能生效。

icmp-block在zone配置文件中的節點爲

1

2

3

<zone>

    <icmp-block name="string"/>

</zone>

相應操作命令爲

1

2

3

4

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中是一個沒有參數(屬性)的節點

1

2

3

<zone>

    <masquerade/>

</zone>

操作命令爲

1

2

3

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端口可以使用下面的命令

1

[[email protected] ~]# firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080

forward-port還支持範圍轉發,比如我們還可以將80到85端口的所有請求都轉發到8080端口,這時只需要將上面命令中的port修改爲80-85即可。

在zone配置文件中節點如下

1

2

3

<zone>

    <forward-port port="portid[-portid]" protocol="tcp|udp" [to-port="portid[-portid]"] [to-addr="ipv4address"]/>

</zone>

相關操作命令如下

1

2

3

4

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配置文件中的節點定義如下

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

<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的操作命令如下

1

2

3

4

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",也就是直接寫標籤名,然後跟着寫屬性就可以了,我們來看個例子

1

[[email protected] ~]# 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給設置個時間段,過了之後再自動開放!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章