centos7防火墙firewalld

作者: 江江的大猪 | 来源:发表于2018-04-01 00:42 被阅读95次

    版权声明:本文为原创内容,转载请声明出处。
    原文地址:http://www.excelib.com/article/288/show

    firewalld简介

    1. Centos7中默认将原来的防火墙iptables升级为了firewalld
    2. firewalld可以动态修改单条规则,而不需要像iptables那样,在修改了规则后必须得全部刷新才可以生效

    firewalld和iptables的关系

    • firewalld自身并不具备防火墙的功能,而是和iptables一样需要通过内核的netfilter来实现,也就是说firewalld和iptables一样,他们的作用都是用于维护规则,而真正使用规则干活的是内核的netfilter,只不过firewalld和iptables的结构以及使用方法不一样罢了。

    firewalld的配置模式

    • firewalld的配置文件以xml格式为主(主配置文件firewalld.conf例外),他们有两个存储位置
      1. /etc/firewalld/
      2. /usr/lib/firewalld/
    • 使用时的规则是这样的:当需要一个文件时firewalld会首先到第一个目录中去查找,如果可以找到,那么就直接使用,否则会继续到第二个目录中查找。
      firewalld的这种配置文件结构的主要作用是这样的:在第二个目录中存放的是firewalld给提供的通用配置文件,如果我们想修改配置,那么可以copy一份到第一个目录中,然后再进行修改。这么做有两个好处:首先我们日后可以非常清晰地看到都有哪些文件是我们自己创建或者修改过的,其次,如果想恢复firewalld给提供的默认配置,只需要将自己在第一个目录中的配置文件删除即可,非常简单,而不需要像其他很多软件那样在修改之前还得先备份一下,而且时间长了还有可能忘掉之前备份的是什么版本。

    配置文件结构

    • firewalld的配置文件结构非常简单,主要有两个文件和三个目录:
      • 文件:firewalld.conf、lockdown-whitelist.xml
      • 目录:zones、services、icmptypes
    • 另外,如果使用到direct,还会有一个direct.xml文件。我们要注意,在保存默认配置的目录“/usr/lib/firewalld/”中只有我们这里所说的目录,而没有firewalld.conf、lockdown-whitelist.xml和direct.xml这三个文件,也就是说这三个文件只存在于“/etc/firewalld/”目录中。
    • firewalld.conf:firewalld的主配置文件,是键值对的格式,不过非常简单,只有五个配置项
      • DefaultZone:默认使用的zone,关于zone学生稍后给大家详细介绍,默认值为public;
      • MinimalMark: 标记的最小值,linux内核会对每个进入的数据包都进行标记,目的当然是为了对他们进行区分,比如学生在前面给大家补充iptables五张表相关的内容时候介绍说符合raw表规则的数据包可以跳过一些检查,那么是怎么跳过的呢?这里其实就是使用的标记,当然对数据包的标记还有很多作用。这里所设置的 MinimalMark值就是标记的最小值,默认值为100,一般情况下我们不需要对其进行修改,但是如果我们有特殊需要的时候就可以通过对其进行修改来告诉linux所使用标记的最小值了,比如我们需要给符合某条件的数据包标记为123,这时候为了防止混淆就需要将MinimalMark设置为一个大于123的值了;
      • CleanupOnExit:这个配置项非常容易理解,他表示当退出firewalld后是否清除防火墙规则,默认值为yes;
      • Lockdown: 这个选项跟D-BUS接口操作firewalld有关,firewalld可以让别的程序通过D-BUS接口直接操作,当Lockdown设置为yes的 时候就可以通过lockdown-whitelist.xml文件来限制都有哪些程序可以对其进行操作,而当设置为no的时候就没有限制了,默认值为 no;
      • IPv6_rpfilter:其功能类似于rp_filter,只不过是针对ipv6版的,其作用是判断所接受到的包是否是伪造的,检查方式主要是通过路由表中的路由条目实现的,更多详细的信息大家可以搜索uRPF相关的资料,这里的默认值为yes。
    • lockdown-whitelist.xml:当Lockdown为yes的时候用来限制可以通过D-BUS接口操作firewalld的程序
    • direct.xml:通过这个文件可以直接使用防火墙的过滤规则,这对于熟悉iptables的用户来说会非常顺手,另外也对从原来的iptables到firewalld的迁移提供了一条绿色通道
    • zones:保存zone配置文件
    • services:保存service配置文件
    • icmptypes:保存和icmp类型相关的配置文件

    zone

    • firewalld默认提供了九个zone配置文件:block.xml、dmz.xml、drop.xml、external.xml、home.xml、internal.xml、public.xml、trusted.xml、work.xml,他们都保存在“/usr/lib/firewalld/zones/”目录下。这些zone之间是什么关系?他们分别适用用哪些场景呢?
    • 为了弄明白这些问题大家需要先明白zone的本质含义。学生在上一节给大家介绍防火墙时说过防火墙就相当于一个门卫,门卫对具体某个来访的人判断是否应该放行是依靠规则来判断的,而我们这里的zone其实就是一套规则集,或者说是一套判断的方案。
    • 理解了这层含义firewalld就容易了,比如上面的九个zone其实就是九种方案,而且起决定作用的其实是每个xml文件所包含的内容,而不是文件名,所以大家不需要对每种zone(每个文件名)的含义花费过多的精力,比如trusted这个zone会信任所有的数据包,也就是说所有数据包都会放行,但是public这个zone只会放行其中所配置的服务,其他的一律不予放行,其实我们如果将这两个文件中的内容互换一下他们的规则就换过来了,也就是public这个zone会放行所有的数据包,下面我们来看一下这两个文件的内容
    • public.xml
    <?xml version="1.0" encoding="utf-8"?>
    <zone>
      <short>Public</short>
      <description>For use in public areas. You do not 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"/>
    </zone>
    
    • trusted.xml
    <?xml version="1.0" encoding="utf-8"?>
    <zone target="ACCEPT">
      <short>Trusted</short>
      <description>All network connections are accepted.</description>
    </zone>
    
    • 我们要特别注意trusted.xml中zone的target,就是因为他设置为了ACCEPT,所以才会放行所有的数据包,而public.xml中的zone没有target属性,这样就会默认拒绝通过,所以public这个zone(这种方案)只有其中配置过的服务才可以通过。
    • 其他的zone大家可以自己打开xml文件来看一下,这里学生就不一一介绍了,关于zone配置文件的详细结构及含义后面学生再给大家进行讲解,下面学生再给大家介绍一下firewalld中的service。

    service

    • service是firewalld中另外一个非常重要的概念,不过其含义是非常简单的。学生还是拿门卫的例子来给大家做解释,在iptables的时代我们给门卫下达规则时需要告诉他“所有到22号楼的人全部予以放行”、“所有到80号楼的人全部予以放行”等等,不过到了firewalld的时代就不需要这样了,而是可以直接下达像“到销售部的全部予以放行”这样的命令,然后门卫再一查发现销售部在80号楼,那么所有到80号楼的人门卫就都会放行了。我们这里的楼牌号和端口号相对应,部门名和服务名相对应,这样大家应该就可以理解service的作用了。
    • 从端口号改为服务名主要有两个好处:首先是使用服务名配置的语义清晰,不容易出错;其次在对某个服务的端口号进行修改的时候只需要修改相应的service文件就可以了,而不需要再修改防火墙方案——zone。这其实跟DNS将ip地址和域名关联了起来是一样的道理。下面学生再来给大家介绍一下service的配置文件。
    • service配置文件的命名规则是<服务名>.xml,比如ssh的配置文件是ssh.xml,http的配置文件是http.xml等,他们默认保存在“/usr/lib/firewalld/services/”目录下,常见的服务其中都可以找到,如果我们想修改某个服务的配置,那么可以复制一份到“/etc/firewalld/services/”目录下然后进行修改就可以了,要想恢复默认配置直接将我们自己的配置文件删除就可以了。我们来看一下ssh服务的ssh.xml文件
    <?xml version="1.0" encoding="utf-8"?>
    <service>
      <short>SSH</short>
      <description>Secure Shell (SSH) is a protocol for logging into and executing commands on remote machines. It provides secure encrypted communications. If you plan on accessing your machine remotely via SSH over a firewalled interface, enable this option. You need the openssh-server package installed for this option to be useful.</description>
      <port protocol="tcp" port="22"/>
    </service>
    
    • 可以看到这里配置了tcp的22号端口,所以将ssh服务配置到所使用的zone(默认public)中后tcp的22号端口就开放了。如果我们想将ssh的端口修改为222,那么只需要将ssh.xml复制一份到“/firewalld/services/”中,然后将端口号修改为222就可以了。当然直接修改“/usr/lib/firewalld/services/”中的配置文件也可以实现,但是强烈建议不要那么做,原因相信大家都明白。
    • 明白原理之后使用起来就可以非常灵活了,比如我们将“/etc/firewalld/services/ssh.xml”文件复制一份到“/etc/firewalld/services/”中,然后将名字改为abc.xml,并且将abc这个服务配置到所使用的zone中,这时22端口就会开放。也就是说在zone中所配置的服务其实跟实际的服务并不存在直接联系,而是和相应配置文件中配置的内容有关系。

    配置方法

    • firewalld的配置方法主要有三种:firewall-config、firewall-cmd和直接编辑xml文件,其中firewall-config是图形化工具,firewall-cmd是命令行工具,而对于linux来说大家应该更习惯使用命令行方式的操作,所以firewall-config我们就不给大家介绍了。

    启动停止和查询状态

    • 在Centos7中默认将原来的服务管理工具service升级为了systemctl,其实原来的service只是一个脚本执行工具,而systemctl的功能非常强大,关于systemctl的详细用法大家可以阅读linux中国的一篇文章,地址是:https://linux.cn/article-5926-1.html
    # 启动
    [root@excelib.com ~]# systemctl start firewalld
    # 停止
    [root@excelib.com ~]# systemctl stop firewalld
    # 重启
    [root@excelib.com ~]# systemctl restart firewalld
    # 查询状态
    [root@excelib.com ~]$ systemctl status firewalld
    # 另外,对于firewalld来说还可以使用自身的firewall-cmd工具来查询运行状态
    [root@excelib.com ~]$ firewall-cmd --state
    # 启用开机自动启动
    [root@excelib.com ~]$ systemctl enable firewalld
    # 禁用开机自动启动
    [root@excelib.com ~]$ systemctl disable firewalld
    # 查看自动启动状态
    [root@excelib.com ~]$ systemctl is-enabled firewalld
    

    更新规则

    • 直接使用firewall-cmd修改的规则是不需要更新就可以直接生效的,但是如果加了--permanent参数,或者直接编辑xml文件之后就需要我们手动reload了,firewall-cmd提供了两个更新规则的参数:--reload和--complete-reload,前者只是更新需要更新规则,而且更新的过程中不会影响现有的连接,而后者在更新时会将所有的规则清除掉然后重建,而且为了安全考虑,在更新之前首先会将策略设置为DROP,等更新完成之后再恢复为ACCEPT,这样就会对现有连接造成影响,所以如果没有特殊需求我们应该尽量使用前者。具体命令如下
    [root@excelib.com ~]# firewall-cmd --reload
    [root@excelib.com ~]# firewall-cmd --complete-reload
    

    策略操作

    • 对于firewalld来说最重要的就是策略操作了,策略操作主要有三种方法:使用firewall-config操作、使用firewall-cmd操作和直接编辑xml文件,学生在上节已经给大家介绍过了,firewall-config是图形化工具,firewall-cmd是命令行工具,我们这里主要以命令行工具为主来给大家介绍。
    • firewall-cmd中关于规则的命令非常多,如果在这里全部列出来再给大家解释一遍应该效果也不会太好,所以学生在后面讲到具体相关内容时再给大家讲相应的命令,比如讲到zone的时候给大家介绍跟zone相关的命令,这样大家更容易理解和记忆。
    • firewall-cmd中的命令虽然非常多,但是有四大类使用频率非常高的命令:--add-xxx、--remove-xxx、--query-xxx、--get-xxx以及--list-xxx,这里前两个非常容易理解,一个是添加一个是删除,而后三个从名字上就不太容易区分了,下面学生给大家解释一下。
    # --query-xxx主要用于布尔值的查询,比如
    [root@excelib.com ~]$ firewall-cmd --zone=public --query-service=ssh
    这个命令用于查询在public这个zone中是否包含ssh这个服务。
    # --get-xxx主要用于获取特定的内容,比如
    [root@excelib.com ~]$ firewall-cmd --get-zones
    # 这样就可以获取到预设的zones,默认情况下返回结果为
    block dmz drop external home internal public trusted work
    # --list-xxx主要用于按一定条件进行查询(不过有的list命名也不需要条件),比如
    [root@excelib.com ~]$ firewall-cmd --zone=public --list-services
    
    • query还是比较容易理解的,但是get和list从字面上并不容易区分,刚开始学生以为get命令用于获取单个结果,list用于获取多个结果,但后来发现并不是这样。当然,我们在使用的时候按照文档中的说明来使用就可以了。
    • 另外,在firewall-cmd中有一个比较特殊的参数:--permanent,他表示是否将修改后的规则保存下来,如果不加这个参数,那么所做的修改当时会立即生效,但是在firewalld重启之后就会丢失,而加上这个参数后所做的修改就会永久保存下来,不过这时的修改不会立即生效而是需要reload后才可以生效。其实这个也非常容易理解,当不加--permanent修改规则时firewalld会实际修改运行时的规则,而如果加了这个参数firewalld其实是去修改的xml配置文件,和我们直接编辑xml文件一样,所以就需要reload才可以生效。

    相关文章

      网友评论

        本文标题:centos7防火墙firewalld

        本文链接:https://www.haomeiwen.com/subject/mkxocftx.html