用活firewalld防火墙中的zone

原文地址:http://www.excelib.com/article/290/showhtml

firewalld中zone的含义学生前面已经给你们介绍过了,说白了一个zone就是一套规则集。但是何时该用哪一个zone、每一个zone中的规则具体是怎么设置呢?下面学生就来给你们详细讲解。tcp

名词解释

在具体介绍zone以前学生先给你们介绍几个相关的名词,由于若是不理解这几个名词zone就无从入手。ide

  • target:目标,这个前面学生也已经给你们介绍过了,能够理解为默认行为,有四个可选值:default、ACCEPT、%%REJECT%%、DROP,若是不设置默认为defaultui

  • service:这个在前面学生已经给你们解释过了,他表示一个服务spa

  • port:端口,使用port能够不经过service而直接对端口进行设置debug

  • interface:接口,能够理解为网卡调试

  • source:源地址,能够是ip地址也能够是ip地址段excel

  • icmp-block:icmp报文阻塞,能够按照icmp类型进行设置code

  • masquerade:ip地址假装,也就是按照源网卡地址进行NAT转发xml

  • forward-port:端口转发

  • rule:自定义规则

哪一个zone在起做用

咱们知道每一个zone就是一套规则集,可是有那么多zone,对于一个具体的请求来讲应该使用哪一个zone(哪套规则)来处理呢?这个问题相当重要,若是这点不弄明白其余的都是空中楼阁,即便规则设置的再好,不知道怎样用、在哪里用也不行。

对于一个接受到的请求具体使用哪一个zone,firewalld是经过三种方法来判断的:

一、source,也就是源地址

二、interface,接收请求的网卡

三、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有两个能够配置的位置:一、zone所对应的xml配置文件二、网卡配置文件(也就是ifcfg-*文件)。

第一种配置跟source大同小异,学生这里就再也不细述了,interface在zone配置文件中的节点为

<zone>
    <interface name="string"/>
</zone>

相关的firewall-cmd命令为

1 firewall-cmd [--permanent] [--zone=zone] --list-interfaces
2 firewall-cmd [--permanent] [--zone=zone] --add-interface=interface
3 firewall-cmd [--zone=zone] --change-interface=interface
4 firewall-cmd [--permanent] [--zone=zone] --query-interface=interface
5 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>

相应的配置命令为

1 firewall-cmd [--permanent] [--zone=zone] --list-services
2 firewall-cmd [--permanent] [--zone=zone] --add-service=service [--timeout=seconds]
3 firewall-cmd [--permanent] [--zone=zone] --remove-service=service
4 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>

相应命令为

1 firewall-cmd [--permanent] [--zone=zone] --list-ports
2 firewall-cmd [--permanent] [--zone=zone] --add-port=portid[-portid]/protocol [--timeout=seconds]
3 firewall-cmd [--permanent] [--zone=zone] --remove-port=portid[-portid]/protocol
4 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>

相应操做命令为

1 firewall-cmd [--permanent] [--zone=zone] --list-icmp-blocks
2 firewall-cmd [--permanent] [--zone=zone] --add-icmp-block=icmptype [--timeout=seconds]
3 firewall-cmd [--permanent] [--zone=zone] --remove-icmp-block=icmptype
4 firewall-cmd [--permanent] [--zone=zone] --query-icmp-block=icmptype

masquerade

masquerade你们应该都比较熟悉,其做用就是ip地址假装,也就是NAT转发中的一种,具体处理方式是将接收到的请求的源地址设置为转发请求网卡的地址,这在路由器等相关设备中很是重要,好比你们不少都使用的是路由器链接的局域网,而想上互联网就得将咱们的ip地址给修改一下,要不你们都是192.168.1.XXX的内网地址,那请求怎么能正确返回呢?因此在路由器中将请求实际发送到互联网的时候就会将请求的源地址设置为路由器的外网地址,这样请求就能正确地返回给路由器了,而后路由器再根据记录返回给咱们发送请求的主机了,这就是masquerade。

其设置很是简单,在zone中是一个没有参数(属性)的节点

<zone>
    <masquerade/>
</zone>

操做命令为

1 firewall-cmd [--permanent] [--zone=zone] --add-masquerade [--timeout=seconds]
2 firewall-cmd [--permanent] [--zone=zone] --remove-masquerade
3 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>

相关操做命令以下

1 firewall-cmd [--permanent] [--zone=zone] --list-forward-ports
2 firewall-cmd [--permanent] [--zone=zone] --add-forward-port=port=portid[-portid]:proto=protocol[:toport=portid[-portid]][:toaddr=address[/mask]][--timeout=seconds]
3 firewall-cmd [--permanent] [--zone=zone] --remove-forward-port=port=portid[-portid]:proto=protocol[:toport=portid[-portid]][:toaddr=address[/mask]]
4 firewall-cmd [--permanent] [--zone=zone] --query-forward-port=port=portid[-portid]:proto=protocol[:toport=portid[-portid]][:toaddr=address[/mask]]

rule

rule能够用来定义一条复杂的规则,其在zone配置文件中的节点定义以下

 1 <zone>
 2     <rule [family="ipv4|ipv6"]>
 3                [ <source address="address[/mask]" [invert="bool"]/> ]
 4                [ <destination address="address[/mask]" [invert="bool"]/> ]
 5                [
 6                  <service name="string"/> |
 7                  <port port="portid[-portid]" protocol="tcp|udp"/> |
 8                  <protocol value="protocol"/> |
 9                  <icmp-block name="icmptype"/> |
10                  <masquerade/> |
11                  <forward-port port="portid[-portid]" protocol="tcp|udp" [to-port="portid[-portid]"] [to-addr="address"]/>
12                ]
13                [ <log [prefix="prefixtext"] [level="emerg|alert|crit|err|warn|notice|info|debug"]/> [<limit value="rate/duration"/>] </log> ]
14                [ <audit> [<limit value="rate/duration"/>] </audit> ]
15                [ <accept/> | <reject [type="rejecttype"]/> | <drop/> ]
16      </rule>
17 </zone>

能够看到这里一条rule的配置的配置项很是多,比zone自己还多出了destination、log、audit等配置项。其实这里的rule就至关于使用iptables时的一条规则。rule的操做命令以下

1 firewall-cmd [--permanent] [--zone=zone] --list-rich-rules
2 firewall-cmd [--permanent] [--zone=zone] --add-rich-rule='rule' [--timeout=seconds]
3 firewall-cmd [--permanent] [--zone=zone] --remove-rich-rule='rule'
4 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给设置个时间段,过了以后再自动开放!

参考文献

一、https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Security_Guide/sec-Using_Firewalls.html
相关文章
相关标签/搜索