一、CentOS 7的防火墙
1.1、firewalld
在CentOS 7默认是使用firewalld为防火墙。不过CentOS 7里有几种防火墙共存:firewalld、iptables、ebtables。虽然CentOS 7默认是使用firewalld来管理netfilter子系统,不过底层调用的命令仍然是iptables等。firewalld跟iptables比起来,不好的地方是每个服务都需要去设置才能放行,因为默认是拒绝。而iptables里默认是每个服务是允许,需要拒绝的才去限制。
1.2、firewalld与iptables的关系
firewalld跟iptables比起来至少有两大好处:
- 1)firewalld可以动态修改单条规则,而不需要像iptables那样,在修改了规则后必须得全部刷新才可以生效;
- 2)firewalld在使用上要比iptables人性化很多,即使不明白“五张表五条链”而且对TCP/IP协议也不理解也可以实现大部分功能。
注:firewalld自身并不具备防火墙的功能,而是和iptables一样需要通过内核的netfilter来实现,
也就是说firewalld和 iptables一样,他们的作用都是用于维护规则,而真正使用规则干活的是内核的netfilter,只不过firewalld和iptables的结构以及使用方法不一样罢了。
二、一个重要的概念:区域管理
2.1 firewalld将网卡对应到不同的区域(zone)
区域zone 默认共有9个:
block dmz drop external home internal public trusted work
不同的区域之间的差异是其对待数据包的默认行为不同,根据区域名字我们可以很直观的知道该区域的特征,在CentOS7系统中,默认区域被设置为public.
在最新版本的fedora(fedora21)当中随着 server 版和 workstation 版的分化则添加了两个不同的自定义 zone FedoraServer 和 FedoraWorkstation 分别对应两个版本。
通过将网络划分成不同的区域,制定出不同区域之间的访问控制策略来控制不同程序区域间传送的数据流。
例如,互联网是不可信任的区域,而内部网络是高度信任的区域。网络安全模型可以在安装,初次启动和首次建立网络连接时选择初始化。
2.2 网络环境的可信级别
该模型描述了主机所连接的整个网络环境的可信级别,并定义了新连接的处理方式。有如下几种不同的初始化区域:
- 阻塞区域(block):任何传入的网络数据包都将被阻止。
- 工作区域(work):相信网络上的其他计算机,不会损害你的计算机。
- 家庭区域(home):相信网络上的其他计算机,不会损害你的计算机。
- 公共区域(public):不相信网络上的任何计算机,只有选择接受传入的网络连接。
- 隔离区域(DMZ):隔离区域也称为非军事区域,内外网络之间增加的一层网络,起到缓冲作用。对于隔离区域,只有选择接受传入的网络连接。
- 信任区域(trusted):所有的网络连接都可以接受。
- 丢弃区域(drop):任何传入的网络连接都被拒绝。
- 内部区域(internal):信任网络上的其他计算机,不会损害你的计算机。只有选择接受传入的网络连接。
- 外部区域(external):不相信网络上的其他计算机,不会损害你的计算机。只有选择接受传入的网络连接。
注:FirewallD的默认区域是public。
2.3 firewalld默认提供了九个zone配置文件
他们都保存在“/usr/lib/firewalld/zones/”目录下:
- block.xml
- dmz.xml
- drop.xml
- external.xml
- home.xml
- internal.xml
- public.xml
- trusted.xml
- work.xml
默认情况下,在/etc/firewalld/zones下面只有一个public.xml。如果给另外一个zone做一些改动,并永久保存,那么会自动生成对应的配置文件。比如给work zone增加一个端口:
firewall-cmd --permanent --zone=work --add-port=1000/tcp
此时就会生成一个work.xml的配置文件
2.4 查看XX区域的永久配置文件
[root@localhost ~]# cat /etc/firewalld/zones/XX.xml
注意:(1)XX为2.3节中具体的配置文件名;(2)防火墙配置文件也可以手动修改,修改后记得reload防火墙:firewall-cmd --reload
2.5 防火墙配置方法
firewalld的配置方法主要有三种:firewall-config、firewall-cmd和直接编辑xml文件,其中 firewall-config是图形化工具,firewall-cmd是命令行工具。
而对于linux来说大家应该更习惯使用命令行方式的操作,所以 firewall-config我们就不给大家介绍了。firewalld默认配置文件有如下两个:
- /usr/lib/firewalld/ (系统配置,尽量不要修改)
- /etc/firewalld/ (用户配置地址)
三、什么是服务
3.1、服务配置
在 /usr/lib/firewalld/services/ 目录中,还保存了另外一类配置文件,每个文件对应一项具体的网络服务,如 ssh 服务等。与之对应的配置文件中记录了各项服务所使用的 tcp/udp 端口,在最新版本的 firewalld 中默认已经定义了 70+ 种服务供我们使用。当默认提供的服务不够用或者需要自定义某项服务的端口时,我们需要将 service 配置文件放置在 /etc/firewalld/services/ 目录中。而使用service 配置的好处显而易见:
- 第一,通过服务名字来管理规则更加人性化,
- 第二,通过服务来组织端口分组的模式更加高效,如果一个服务使用了若干个网络端口,则服务的配置文件就相当于提供了到这些端口的规则管理的批量操作快捷方式。
3.2 特殊情况
假如你服务器的ftp不使用默认端口,默认ftp的端口21改为1121,但想通过服务的方式操作防火墙。
代码如下:
复制模版到/etc,以便修改和调用
[root@localhost~]# cp /usr/lib/firewalld/services/ftp.xml /etc/firewalld/services/
修改模版配置/etc/firewalld/services/ftp.xml把21改为1121
接下来修改配置/etc/firewalld/zones/public.xml,由于public为默认zone,所以要编辑这个,增加一行,以下内容
<service name="ftp"/>
最后还有记得重新加载防火墙配置
firewall-cmd --reload
四、安装、启用、关闭firewalld
4.1 安装firewalld
yum install firewalld firewall-config
4.2 启动服务
systemctl start firewalld
4.3 开机自动启动服务
systemctl enable firewalld
4.4 查看状态
systemctl status firewalld
firewall-cmd --state
4.5 关闭服务
systemctl stop firewalld
4.6 取消开机启动
systemctl disable firewalld
4.7 弃用FirewallD改用iptables
yum install iptables-services
systemctl start iptables
systemctl enable iptables
4.8 查看版本
firewall-cmd --version
4.9 查看帮助
firewall-cmd --help
4.10 显示状态
firewall-cmd --state
4.11 查看活动区域信息
firewall-cmd --get-active-zones
4.12 查看XX接口所属区域
firewall-cmd --get-zone-of-interface=XX
4.13 拒绝所有包
firewall-cmd --panic-on
4.14 取消拒绝状态
firewall-cmd --panic-off
4.15 查看是否拒绝
firewall-cmd --query-panic
4.16 查看firewalld是否开启
systemctl is-enabled firewalld
4.17 重启加载防火墙
(以 root 身份输入以下命令,重新加载防火墙,并不中断用户连接,即不丢失状态信息:)
firewall-cmd --reload
4.18 完全重启防火墙
(以 root 身份输入以下命令,重新加载防火墙并中断用户连接,即丢弃状态信息:)
firewall-cmd --complete-reload
注意:
(1)通常在防火墙出现严重问题时,这个命令才会被使用。比如,防火墙规则是正确的,但却出现状态信息问题和无法建立连接。
(2)firewall-cmd --reload与firewall-cmd --complete-reload两者的区别就是:第一个无需断开连接,就是firewalld特性之一动态添加规则,第二个需要断开连接,类似重启服务
4.19 显示默认区域
firewall-cmd --get-default-zone
4.20 添加接口到区域
(将接口添加到XX区域,如果不指定区域,则添加到默认区域)
firewall-cmd --zone=XX --add-interface=eth0
永久生效再加上--permanent 然后reload防火墙
4.21 设置默认区域,立即生效无需重启
firewall-cmd --set-default-zone=XX
4.22 查看XX区域打开的端口
firewall-cmd --zone=XX --list-ports
4.23 查看XX区域加载的服务
firewall-cmd --zone=XX --list-services
4.24 临时加一个端口到XX区域
firewall-cmd --zone=XX --add-port=8080/tcp
若要永久生效方法加参数--permanent
4.25 打开一个服务
打开一个服务,类似于将端口可视化,服务需要在配置文件中添加,/etc/firewalld 目录下有services文件夹,查看其它的xml文件以及参考前面说方法
firewall-cmd --zone=work --add-service=smtp
4.26 移除服务
firewall-cmd --zone=work --remove-service=smtp
4.27 显示支持的区域列表
firewall-cmd --get-zones
4.28 列出全部区域启用的特性
firewall-cmd --list-all-zones
4.29 显示XX区域详情
firewall-cmd --zone=XX --list-all
4.30 查看当前活跃区域
firewall-cmd --get-active-zones
4.31 设置XX接口所属区域
firewall-cmd --get-zone-of-interface=XX
4.32 查询YY区域中是否包含XX接口
firewall-cmd --zone=YY --query-interface=XX
4.33 删除指定XX网卡所在的zone(以YY为例)
firewall-cmd --zone=YY --remove-interface=XX
4.34 临时修改XX接口为YY区域(永久修改加参数--permanent)
firewall-cmd --zone=YY --change-interface=XX
4.35 控制端口 / 服务
可以通过两种方式控制端口的开放:
- 1)一种是指定端口号,另一种是指定服务名。
虽然开放 http 服务就是开放了 80 端口,但是还是不能通过端口号来关闭,也就是说通过指定服务名开放的就要通过指定服务名关闭;
- 2)通过指定端口号开放的就要通过指定端口号关闭。
- 3)还有一个要注意的就是指定端口的时候一定要指定是什么协议,tcp 还是 udp。