原文地址:http://www.excelib.com/article/290/show firewalld中zone的含義前面已經給你們介紹過了,說白了一個zone就是一套規則集。但是何時該用哪一個zone、每一個zone中的規則具體是怎麼設置呢?下面學生就來給你們詳細講解。tcp
名詞解釋 在具體介紹zone以前先給你們介紹幾個相關的名詞,由於若是不理解這幾個名詞zone就無從入手。debug
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是經過三種方法來判斷的:excel
一、source,也就是源地址code
二、interface,接收請求的網卡xml
三、firewalld.conf中配置的默認zone接口
這三個的優先級按順序依次下降,也就是說若是按照source能夠找到就不會再按interface去查找,若是前兩個都找不到纔會使用第三個,也就是在前面給你們講過的在firewalld.conf中配置的默認zone。ip
好了,咱們如今知道其原理了,下面就給你們介紹每一種方式所對應的配置方法。路由
配置source source是在zone的xml文件中配置的,其格式爲 <zone> <source address="address[/mask]"/> </zone> 只要咱們將source節點放入相應的zone配置文件中就能夠了,節點的address屬性就是源地址,不過咱們要注意相同的source節點只 能夠在一個zone中進行配置,也就是說同一個源地址只能對於一個zone,另外,直接編輯xml文件以後還須要reload才能夠起做用,這些前面已經給你們講過,這裏就再也不重述了。rem
另外,咱們固然也可使用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有兩個能夠配置的位置:一、zone所對應的xml配置文件二、網卡配置文件(也就是ifcfg-*文件)。 第一種配置跟source大同小異,這裏就再也不細述了,interface在zone配置文件中的節點爲 <zone> <interface name="string"/> </zone>
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報文就可使用下面的命令來設置 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給設置個時間段,過了以後再自動開放!