默认情况下,Centos7将原始防火墙iptables升级到防火墙d。 与iptables相比,防火墙d至少有两大优势。
1、防火墙d可以动态修改一个规则,像iptables一样,修改规则后,不一定都要更新才能生效;
2、防火墙d比iptables更人性化,即使不了解“五表五链”,也不用了解TCP/IP协议,几乎都能实现所有功能。
知道得更多
iptables实际上包含五个表
大多数iptables资料都介绍了iptables包含四个表和五个链。 但实际上,iptables还有第五个表——安全表。 但是,该表必须与selinux结合使用。 selinux已经发布了10多年,但至今对他的了解还不够,还有很多人要关闭。
事实上,selinux的设计理念在安全方面非常优秀,而且在了解其设计理念后再使用也不是很复杂。 只是,其内置规则非常复杂。 有机会学生介绍selinux,现在回到iptables的5张表。 他们分别是过滤器、nat、mangle、raw和secuus
过滤器表是我们最常用的过滤器表; nat表主要用于数据包传输。 例如,局域网的电脑想连接互联网时,请使用nat传输mangle表的规则,可以对数据包进行更改,例如更改ttl值。 raw表主要用于提高效率。 raw本身的意思是“本机”、“未加工”。 符合raw表对应规则的数据包将跳过一些检查。 这样可以提高效率。 当然,raw表的优先级也最高。 安全是与selinux相关的MAC模式的安全过滤。
当然,这些内容大家都知道就可以了,即使不理解也可以很好地使用防火墙d。
防火墙d和iptables的关系
防火墙d本身不具备防火墙功能,与iptables一样,需要通过内核netfilter来实现。 也就是说,正如firewalld和iptables一样,他们的作用是维护规则,实际使用规则工作的只是内核的netfilter,而只是防火墙d和iptables的作用
防火墙d的工作原理
这里的结构是配置文件的结构,而不是防火墙d软件的结构。
在具体介绍防火墙d的配置文件结构之前,学生首先介绍防火墙d的配置模式。 防火墙d的布局模式设计得非常巧妙,其设计思路也非常值得借鉴和学习。
防火墙d的配置模式
firewalld配置文件以xml格式为主,主要配置文件firewalld.conf例外,有两个存储位置
1,/etc/firewalld/
2,/usr/lib/firewalld/
如果需要文件,firewalld将移动到第一个目录,如果找到,则使用它;如果找不到,则移动到第二个目录。
这种firewalld配置文件结构的主要作用是:第二个目录包含firewalld提供的通用配置文件,如果要更改配置,可以将其复制到第一个目录,然后进行更改。 这有两个优点。 首先,您可以非常清楚地看到哪些文件是自己创建或修改的。 然后,要恢复firewalld提供的默认配置,只需删除第一个目录中的配置文件就很容易了。 像许多其他软件一样,在更改之前必须进行备份,时间一长,也可能会忘记以前备份的版本。
当然,这种配置模式不是firewalld的第一种,在很多其他地方也有使用。 例如,用于在java中记录日志的logback也是这种模式。 他在查找配置文件时,首先在根目录下查找logback-test.xml文件,如果找不到就直接使用,如果找不到就查找logback.xml文件,如果找不到,就放入自己的包中这非常方便。 例如,创建logback-test.xml和logback.xml文件,然后在开发人员中使用logback-test.xml文件,在部署到服务时直接删除即可。 当然,很多产品也使用了这种配置模式。 spring的许多子框架也使用了这种模式。 例如,spring MVC的组件配置也是如此。 如果没有配置,则使用默认配置。 当然,这里不是在谈论spring MVC,所以不展开。 想详细了解,请参阅学生写的《看透Spring MVC:源代码分析与实践》本书。
轮廓结构
firewalld的配置文件结构非常简单,主要有两个文件和三个目录。
文件: firewalld.conf,lockdown-whitelist.xml
目录: zones、services、icmptypes
另外,如果使用到dire
ct,还会有一个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所使用标记的最小值了,比如我们需要给dmddn条件的数据包标记为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类型相关的配置文件
在firewalld的使用中最基础也是最重要的就是对zone的理解,不过现在还普遍理解的不是很透彻,下面学生就来给大家详细介绍一下zone到底是什么。
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>描述信息</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学生就不给大家介绍了。具体的配置方法学生在下一节给大家进行介绍。