用活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文件中配置的,其格式為

< 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、https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux /7/html/Security_Guide/sec-Using_Firewalls.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM