用户通过定义一组防火墙规则,对来自外部的网络流量进行匹配和分类,并根据规则决定是允许还是拒绝流量通过防火墙。firewalld是CentOS 7及以后版本默认使用的防火墙。
在本任务中将介绍
firewalld是一种支持动态更新的防火墙实现机制。firewalld的动态性是指可以在不重启防火墙的情况下创建、修改和删除。
firewalld使用区域和服务来简化防火墙的规则配置。
区域包括一组预定义的规则。可以把网络接口(即网卡)和流量源指定到某个区域中,允许哪些流量通过防火墙取决于主机所连接的网络及用户为网络定义的安全级别。
一个网络连接只能属于一个区域,但是一个区域可以包含多个网络连接。在区域中定义规则后,firewalld会把这些规则应用到进入该区域的网络流量上。可以把区域理解为firewalld提供的防火墙策略集合(或策略模板),用户可以根据实际的使用场景选择合适的策略集合。
服务是端口和协议的组合,表示允许外部流量访问某种服务需要配置的所有规则的集合。在firewalld中放行一个服务,就相当于打开与该服务相关的端口和协议、启用数据包转发等功能,可以将多步操作集成到一条简单的规则中。
firewalld在CentOS 7中默认是安装的。CentOS 7还支持以图形界面的方式配置防火墙,即firewall-config工具,默认也是安装的。
//安装firewalld和firewall-config工具
[root@localhost ~]# yum install firewalld -y //默认已安装
[root@localhost ~]# yum install firewall-config -y //默认已安装
firewalld启动和停止的相关命令 | 功能 |
systemctl start firewalld.service | 启动firewalld服务。firewalld.service可简写为firewalld,下同 |
systemctl restart firewalld.service | 重启firewalld服务 |
systemctl stop firewalld.service | 停止firewalld服务 |
systemctl reload firewalld.service | 重新加载firewalld服务 |
systemctl status firewalld.service | 查看firewalld服务的状态 |
systemctl enable firewalld.service | 设置firewalld服务为开机自动启动 |
systemctl-unit-files|grep firewalld.service | 查看firewalld服务是否开机自动启动 |
配置firewalld可以使用firewall-config工具、firewall-cmd命令和firewall-offline-cmd命令。
在终端窗口输入firewall-config命令,或者选择【应用程序】—>【杂项】—>【防火墙】选项。
除了使用systemctl status firewalld命令查看firewalld的具体状态信息外,还可以使用firewall-cmd命令快速查看firewalld运行状态。
//查看firewalld的运行状态
[root@localhost ~]# firewall-cmd --state
//查看默认区域的完整配置
[root@localhost ~]# firewall-cmd --list-all
如果想查看特定区域的信息,则可以使用--zone选项指定域名
//查看区域某一方面的配置
[root@localhost ~]# firewall-cmd --list-all --zone=work //指定区域名
[root@localhost ~]# firewall-cmd --list-services //只查看服务信息
[root@localhost ~]# firewall-cmd --list-services --zone=public //组合使用(适用于CentOS 7.6)
ssh dhcpv6-client http
firewalld的配置有运行时配置和永久配置(持久配置)之分。
运行时配置:指在firewalld处于运行状态时生效的配置
永久配置:是firewalld重载或重启时应用的配置。
//修改运行时配置
[root@localhost ~]# firewall-cmd --add-service=http //只修改运行时配置
当firewalld重启时,其会恢复为永久配置。如果想让更改在firewalld下次启动时仍然生效,则需要使用--permanent选项。但即使使用了--permanent选项,这些修改也只会在firewalld重新启动后生效。使用--reload选项重载永久配置,可以使永久配置立即生效并覆盖当前的运行时配置。
//修改永久配置
[root@localhost ~]# firewall-cmd --permanent --add-service=http //修改永久配置
[root@localhost ~]# firewall-cmd --reload //重载永久配置
一种常见的做法是先修改运行时配置,验证修改正确后,再把这些修改提交到永久配置中。可以借助--runtime-to-permanent选项来实现这种需求。
//先修改运行时配置,再提交到永久配置中
[root@localhost ~]# firewall-cmd --add-service=http //只修改运行时配置
[root@localhost ~]# firewall-cmd --runtime-to-permanent //提交到永久配置中
使用服务管理网络流量的最直接的办法就是把预定义服务添加到firewalld的允许服务列表中,或者从允许服务列表中移除预定义服务。
//添加或移除预定义服务
[root@localhost ~]# firewall-cmd --list-services //查看当前的允许服务列表
[root@localhost ~]# firewall-cmd --permanent --add-service=http //添加预定义服务
[root@localhost ~]# firewall-cmd --reload //重载防火墙的永久配置
[root@localhost ~]# firewall-cmd --list-services
dhcpv6-client http ssh
注意:从列表中移除某个预定义服务,使用--remove-service选项,但需要重载防火墙永久配置。
每个预定义服务都有一个独立的配置文件,配置文件的内容决定了添加/移除服务时要打开或关闭那些端口和协议。服务配置文件的文件名格式一般是service-name.xml,如ssh.xml、ftp.xml、http.xml。
//HTTP服务的配置文件http.xml的内容
[root@localhost ~]# cat /usr/lib/firewalld/services/http.xml
除了firewalld预定义的服务外,用户还可以使用--new-service选项创建一个服务,此时会在/etc/firewalld/services/目录中自动生成相应的服务配置文件,但文件中没有任何有效的配置;使用--delete-service选项可以删除自定义服务。这两个选项必须在永久配置模式下使用。
//创建和删除自定义服务
[root@localhost ~]# firewall-cmd --permanent --new-service=myservice
[root@localhost ~]# ls /etc/firewalld/services/
[root@localhost ~]# cat /etc/firewalld/services/myservice.xml
firewalld会从/etc/firewalld/services/目录中加载服务配置文件,如果这个目录中没有服务配置文件,则到/usr/lib/firewalld/services/目录中加载。
创建服务的另一种方法是从/usr/lib/firewalld/services/目录中复制一个服务配置模板文件到/etc/firewalld/services/目录中。
//使用服务配置模板文件创建自定义服务
[root@localhost ~]# cd /etc/firewalld/services/
[root@localhost services]# cp /usr/lib/firewalld/services/http.xml mynewservice.xml
[root@localhost services]# firewall-cmd --permanent --new-service-from-file=mynewservice.xml --name=anotherservice
每种预定义服务都有相应的监听端口,如HTTP服务的监听端口是80,操作系统根据端口号决定把网络流量交给哪个服务处理。
//开放或关闭端口
[root@localhost ~]# firewall-cmd --list-ports
<==当前没有配置
[root@localhost ~]# firewall-cmd --add-port=80/tcp
[root@localhost ~]# firewall-cmd --list-ports
80/tcp
[root@localhost ~]# firewall-cmd --remove-port=80/tcp
[root@localhost ~]# firewall-cmd --list-ports
区域关联了一组网络接口和源IP地址,可以在区域中配置复杂的规则以管理来自这些网络接口和源IP地址的网络流量。
//查看区域信息
[root@localhost ~]# firewall-cmd --get-zones //查看系统当前可用的区域
block dmz drop external home internal public trusted work
[root@localhost ~]# firewall-cmd --list-all-zones //查看所有区域的详细信息
[root@localhost ~]# firewall-cmd --list-all --zone=home //查看指定区域的详细信息
如果没有特别说明,firewall-cmd默认将规则修改应用在当前活动区域中。要想修改其他区域的规则,则可以通过--zone选项指定区域名。
//修改指定区域的规则
[root@localhost ~]# firewall-cmd --add-service=ssh --zone=work //在work区域中放行SSH服务
如果没有明确地把网络接口和某个区域关联起来,则firewalld会自动将其和默认区域关联起来。firewalld启动时会加载默认区域的配置并激活默认区域,firewalld默认区域是public。
//修改默认区域
[root@localhost ~]# firewall-cmd --get-default-zone //查看当前默认区域
public
[root@localhost ~]# firewall-cmd --set-default-zone work //修改默认区域
[root@localhost ~]# firewall-cmd --get-default-zone
work
网络接口关联到那个区域,进入该网络接口的流量就适用于那个区域的规则。因此,可以为不同区域制定不同的规则,并根据实际需要把网络接口关联到适合的区域中。
//关联区域和网络接口
[root@localhost ~]# firewall-cmd --get-active-zones //查看活动区域的网络接口
public
interfaces: ens33
[root@localhost ~]# firewall-cmd --zone=work --change-interface=ens33 //为接口划分区域
[root@localhost ~]# firewall-cmd --get-active-zones
work
interfaces: ens33
也可以直接修改网络接口配置文件,在文件中设置ZONE参数,将网络接口关联到指定区域中。
//修改网络接口配置文件,将网络接口关联到指定区域中
[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33 //注:适用于CentOS 7.6
......
ZONE=work
......
除了firewalld预定义的9个区域外,还可以创建新的区域,并像预定义区域一样使用。
//创建新区域
[root@localhost ~]# firewall-cmd --get-zones
block dmz drop external home internal public trusted work
[root@localhost ~]# firewall-cmd --permanent --new-zone=RJ
[root@localhost ~]# firewall-cmd --reload
[root@localhost ~]# firewall-cmd --get-zones
RJ block dmz drop external home internal public trusted work
创建新区域的另一种办法是使用区域配置文件。和服务一样,每个区域都有一个独立的配置文件,文件名格式为zone-name.xml,保存在/usr/lib/firewalld/zones/和、etc/firewalld/zones/目录中。
当数据包与区域的所有规则都不匹配时,可以使用区域默认规则处理数据包,包括【接受(ACCEPT)、拒绝(REJECT)、丢弃(DROP)】3种处理方式。
ACCEPT表示默认接受所有数据包,除非数据包被某些规则明确拒绝
REJECT和DROP默认拒绝所有的、数据包,除非数据包被某些规则明确接受
REJECT会向源主机返回响应信息
DROP直接丢弃数据包,没有任何响应信息
使用--set-target选项配置区域的默认规则
//配置区域的默认规则
[root@localhost zones]# firewall-cmd --permanent --zone=work --set-target=ACCEPT
[root@localhost zones]# firewall-cmd --reload
[root@localhost zones]# firewall-cmd --zone=work --list-all
流量源是指某一特定的IP地址或子网。可以使用--add-source选项把来自某一流量源的网络流量添加到某个区域中,这样即可将该区域的规则应用在这些网路流量上。
//添加和删除流量源
例如:在工作区域中允许所有来自192.168.100.0/24子网的网络流量通过,删除流量源时只要用--remove-source选项替换-add-source即可
[root@localhost ~]# firewall-cmd --zone=work --add-source=192.168.100.0/24
[root@localhost ~]# firewall-cmd --runtime-to-permanent
[root@localhost ~]# firewall-cmd --zone=work --remove-source=192.168.100.0/24
//添加和删除源端口
以允许或拒绝来自某些端口的网络流量通过
[root@localhost ~]# firewall-cmd --zone=work --add-source-port=3721/tcp
[root@localhost ~]# firewall-cmd --zone=work --remove-source-port=3721/tcp
也可以根据协议来决定是接受还是拒绝使用某种协议的网络流量。常见的协议有TCP、UDP、ICMP等。
//添加和删除协议
在内部区域中添加ICMP即可接受对方主机的ping测试
[root@localhost ~]# firewall-cmd --zone=internal --add-protocol=icmp
[root@localhost ~]# firewall-cmd --zone=internal --remove-protocol=icmp
对于接收到的网络流量具体使用哪个区域的规则,firewalld会按下面的顺序进行处理。