firewalld的9个zone、firewalld关于zone和service的操作

firewalld的9个zone

centos7 默认的防火墙工具为firewalld

  • 打开firewalld
[root@localhost ~]# systemctl disable iptables
Removed symlink /etc/systemd/system/basic.target.wants/iptables.service.
[root@localhost ~]# systemctl stop iptables
[root@localhost ~]# systemctl enable firewalld
Created symlink from /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service to /usr/lib/systemd/system/firewalld.service.
Created symlink from /etc/systemd/system/basic.target.wants/firewalld.service to /usr/lib/systemd/system/firewalld.service.
[root@localhost ~]# systemctl start firewalld

将之前打开的iptables关掉,启动firewalld。可以用iptables查看表的规则。

  • firewalld的9个zone
[root@localhost ~]# firewall-cmd --get-zones     #查看是所有zone
block dmz drop external home internal public trusted work
[root@localhost ~]# firewall-cmd --get-default-zone      #查看默认zone
public

block dmz drop external home internal public trusted work 是firewalld的9个zone,默认的zone为public。

  • firewall的9个zone的区别
    未分类

firewalld关于zone的操作

  • 修改默认的zone
[root@localhost ~]# firewall-cmd --get-default-zone      #查看默认zone
public
[root@localhost ~]# firewall-cmd --set-default-zone=work     #将默认的zone修改为work
success
[root@localhost ~]# firewall-cmd --get-default-zone      #查看默认的zone
work 
  • 查看指定网卡的zone
[root@localhost ~]# firewall-cmd --get-zone-of-interface=ens33   #查看ens33网卡的zone
work
[root@localhost ~]# firewall-cmd --get-zone-of-interface=ens37   #查看ens37网卡的zone
work
[root@localhost ~]# firewall-cmd --get-zone-of-interface=lo  #查看lo的zone
no zone
  • 给指定网卡增加zone
[root@localhost ~]# firewall-cmd --zone=public --add-interface=lo    #给lo网卡指定zone为public
success
[root@localhost ~]# firewall-cmd --get-zone-of-interface=lo  #查看lo网卡的zone
public
  • 修改指定网卡的zone
[root@localhost ~]# firewall-cmd --zone=block --change-interface=ens37   #将网卡ens37的zone改成block
The interface is under control of NetworkManager, setting zone to 'block'.
success
[root@localhost ~]# firewall-cmd     --get-zone-of-interface=ens37
block
  • 删除指定网卡的zone
[root@localhost ~]# firewall-cmd --zone=block --remove-interface=ens37   #删除ens37网卡的block zone
The interface is under control of NetworkManager, setting zone to default.
success
[root@localhost ~]# firewall-cmd --get-zone-of-interface=ens37
work

删除指定网卡修改的zone之后,它的zone会变回默认的zone

  • 查看系统中所有网卡所在的zone
[root@localhost ~]# firewall-cmd --get-active-zones  #查看系统中所有网卡所在的zone
work
    interfaces: ens33 ens37
public
    interfaces: lo

firewalld关于service的操作

service 就是zone下面的一个子单元,可以理解成指定的一个端口。

  • 查看所有的servie
[root@localhost ~]# firewall-cmd --get-service
RH-Satellite-6 amanda-client amanda-k5-client bacula bacula-client bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc ceph ceph-mon cfengine condor-collector ctdb dhcp dhcpv6 dhcpv6-client dns docker-registry dropbox-lansync elasticsearch freeipa-ldap freeipa-ldaps freeipa-replication freeipa-trust ftp ganglia-client ganglia-master high-availability http https imap imaps ipp ipp-client ipsec iscsi-target kadmin kerberos kibana klogin kpasswd kshell ldap ldaps libvirt libvirt-tls managesieve mdns mosh mountd ms-wbt mssql mysql nfs nrpe ntp openvpn ovirt-imageio ovirt-storageconsole ovirt-vmconsole pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy proxy-dhcp ptp pulseaudio puppetmaster quassel radius rpc-bind rsh rsyncd samba samba-client sane sip sips smtp smtp-submission smtps snmp snmptrap spideroak-lansync squid ssh synergy syslog syslog-tls telnet tftp tftp-client tinc tor-socks transmission-client vdsm vnc-server wbem-https xmpp-bosh xmpp-client xmpp-local xmpp-server
  • 查看当前zone下的service
[root@localhost ~]# firewall-cmd --list-service
ssh dhcpv6-client
  • 查看指定zone下的service
[root@localhost ~]# firewall-cmd --zone=public --list-service    #指定查看zone=public 下的service
dhcpv6-client ssh
  • 把服务增加到public的zone下(临时添加)
[root@localhost ~]# firewall-cmd --zone=public --add-service=http    #把http服务临时添加到public的zone下
success
[root@localhost ~]# firewall-cmd --zone=public --list-service
dhcpv6-client ssh http

临时添加的service是在内存中,配置文件中没有,重启之后

  • 把服务增加到public的zone下(永久添加,即更改配置文件)
    zone的配置文件路径/etc/firewalld/zones/
[root@localhost ~]# firewall-cmd --zone=public --add-service=http     --permanent
success
[root@localhost ~]# firewall-cmd --zone=public --list-service
dhcpv6-client ssh http

–permanent 将配置写到配置文件中

[root@localhost ~]# ls /etc/firewalld/zones
public.xml  public.xml.old

每当永久修改完配置文件之后,系统都会将修改之前的配置文件备份一份,后缀名是old。

  • zone的配置文件模板
zone,service配置文件的模板存放路径:
/usr/lib/firewalld/zones
/usr/lib/firewalld/services
  • 删除zone下的某服务
[root@localhost ~]# firewall-cmd --zone=public --remove-service=http     #临时删除
[root@localhost ~]# firewall-cmd --zone=public --remove-service=http --permanent     #永久删除
  • 需求:ftp服务自定义端口1121,需要在work zone下面放行ftp
第一步:复制ftp的配置文件到/etc/firewalld/services/

[root@localhost ~]# cp /usr/lib/firewalld/services/ftp.xml  /etc/firewalld/services/

第二步:编辑该文件,将port="21"改为port="1121"

[root@localhost ~]# vim /etc/firewalld/services/ftp.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
 <short>FTP</short>
 <description>FTP is a protocol used for remote file transfer. If you plan to make your FTP server publicly available, enable this option. You need the vsftpd package installed for this option to be useful.</description>
 <port protocol="tcp" port="1121"/>
 <module name="nf_conntrack_ftp"/>
</service>

第三步:复制workzone的配置文件到/etc/firewalld/zones/

[root@localhost ~]# cp /usr/lib/firewalld/zones/work.xml /etc/firewalld/zones/

第四步:编辑该文件,增加“<service name="ftp"/>”

[root@localhost ~]# vim /etc/firewalld/zones/work.xml
<?xml version="1.0" encoding="utf-8"?>
<zone>
<short>Work</short>
 <description>For use in work areas. You mostly trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
 <service name="ssh"/>
 <service name="dhcpv6-client"/>
 <service name="ftp"/>
</zone>

第六步:重新加载

[root@localhost ~]# firewall-cmd --reload
success

用活firewalld防火墙中的zone

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。

我们来看个例子

[[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配置文件中的节点为

<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

这行配置就相当于下面的命令

[[email protected] ~]# 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报文就可以使用下面的命令来设置

[[email protected] ~]# 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端口可以使用下面的命令

[[email protected] ~]# 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″,也就是直接写标签名,然后跟着写属性就可以了,我们来看个例子

[[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给设置个时间段,过了之后再自动开放!