原文地址:http://www.excelib.com/article/287/show Centos7中默认将原来的防火墙iptables升级为了firewalld,firewalld跟iptables比起来至少有两大好处: 一、firewalld能够动态修改单条规则,而不须要像iptables那样,在修改了规则后必须得所有刷新才能够生效; 二、firewalld在使用上要比iptables人性化不少,即便不明白“五张表五条链”并且对TCP/IP协议也不理解也能够实现大部分功能。java
iptables实际包含五张表linux
大部分iptables的资料都介绍说iptables包含四张表、五条链,不过实际上iptables还有第五张表——security表,但 是这张表须要和selinux结合使用,而selinux虽然已经发布了十多年了可是直到如今还有不少人对他的理解不够透彻,甚至有不少人会将其关闭!spring
其实selinux的设计理念在安全上来讲是很是优秀的,并且理解了其设计理念以后再去使用也没那么复杂,只不过其内置的规则是很是复杂的,如今还回到iptables的五张表,他们分别是filter、nat、mangle、raw和 security。安全
filter表就是咱们最常使用的过滤表;nat表主要用于数据包转发,好比局域网的电脑若是想链接互联网,那么就可使用nat给转发一 下;mangle表的规则能够对数据包进行修改,好比修改ttl值等;raw表主要是为了提升效率使用的,raw自己的含义是指“原生的”、“未通过加工 的”,符合raw表所对应规则的数据包将会跳过一些检查,这样就能够提升效率,固然,raw表的优先级也是最高的;security是跟selinux相 关的MAC模式的安全过滤。服务器
firewalld && iptables firewalld自身并不具有防火墙的功能,而是和iptables同样须要经过内核的netfilter来实现,也就是说firewalld和 iptables同样,他们的做用都是用于维护规则,而真正使用规则干活的是内核的netfilter,只不过firewalld和iptables的结 构以及使用方法不同罢了。框架
firewalld结构 咱们这里所说的结构并非firewalld软件的结构,而是配置文件的结构。 在具体介绍firewalld配置文件结构以前先来给你们介绍一下firewalld的配置模式,firewalld的配置模式设计的很是巧妙,并且这种设计思路也很是值得咱们借鉴和学习。ssh
firewalld配置模式 firewalld的配置文件以xml格式为主(主配置文件firewalld.conf例外),他们有两个存储位置tcp
一、/etc/firewalld/ide
二、/usr/lib/firewalld/工具
使用时的规则是这样的:当须要一个文件时firewalld会首先到第一个目录中去查找,若是能够找到,那么就直接使用,不然会继续到第二个目录中查找。
firewalld的这种配置文件结构的主要做用是这样的:在第二个目录中存放的是firewalld给提供的通用配置文件,若是咱们想修改配置, 那么能够copy一份到第一个目录中,而后再进行修改。这么作有两个好处:首先咱们往后能够很是清晰地看到都有哪些文件是咱们本身建立或者修改过的,其 次,若是想恢复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
另外,若是使用到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>
trust.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(这种方案)只有其中配置过的服务才能够通 过。
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咱们就不给你们介绍了。