任务陈述

        用户通过定义一组防火墙规则,对来自外部的网络流量进行匹配和分类,并根据规则决定是允许还是拒绝流量通过防火墙。firewalld是CentOS 7及以后版本默认使用的防火墙。

在本任务中将介绍

  • firewalld的基本概念
  • firewalld的安装和启停
  • firewalld的基本配置与管理

一、firewalld的基本概念

        firewalld是一种支持动态更新的防火墙实现机制。firewalld的动态性是指可以在不重启防火墙的情况下创建、修改和删除。

        firewalld使用区域服务来简化防火墙的规则配置。

区域

        区域包括一组预定义的规则。可以把网络接口(即网卡)流量源指定到某个区域中,允许哪些流量通过防火墙取决于主机所连接的网络及用户为网络定义的安全级别。

        一个网络连接只能属于一个区域,但是一个区域可以包含多个网络连接。在区域中定义规则后,firewalld会把这些规则应用到进入该区域的网络流量上。可以把区域理解为firewalld提供的防火墙策略集合(策略模板),用户可以根据实际的使用场景选择合适的策略集合。

        firewalld预定义了9个区域

  1. 丢弃区域:任何进入网络的数据包都被丢弃,并且不给出任何响应,只允许从本网络发出的                    数据包通过。
  2. 阻塞区域:任何进入的网络连接都被拒绝,并返回IPv4的icmp-host-prohibited报文IPv6的                    icmp6-adm-prohibited报文作为响应,只允许由该系统发起的网络连接接入。
  3. 公共区域:在公共区域中使用,仅接受选定的网络连接接入。这是firewalld的默认区域。
  4. 外部区域:主要应用在启用伪装功能的外部网络中,仅接受选定的网络连接接入。
  5. 隔离区域:隔离区(DMZ)网络中计算机可以被外部网络有限地访问,仅接受选定的网络连                    接接入。
  6. 工作区域:在工作网络中使用,仅接受选定的网络连接接入。
  7. 家庭区域:在家庭网络中使用,仅接受选定的网络连接接入。
  8. 内部区域:应用在内部网络中,对网络中的其他计算机的信任度较高,仅接受选定的网络连                    接接入。
  9. 信任区域:对网络中的计算机具有最高的信任级别,接受所有网络连接接入。

服务

        服务是端口协议的组合,表示允许外部流量访问某种服务需要配置的所有规则的集合。在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启动和停止的相关命令及其功能
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的基本配置与管理

配置firewalld可以使用firewall-config工具firewall-cmd命令firewall-offline-cmd命令

在终端窗口输入firewall-config命令,或者选择【应用程序】—>【杂项】—>【防火墙】选项。

1. 查看firewalld的当前状态和当前配置

  • 查看firewalld的当前状态

除了使用systemctl status firewalld命令查看firewalld的具体状态信息外,还可以使用firewall-cmd命令快速查看firewalld运行状态。

//查看firewalld的运行状态

[root@localhost ~]# firewall-cmd --state
  • 查看firewalld的当前配置

//查看默认区域的完整配置

[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

2. firewalld的两种配置模式

        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 //提交到永久配置中


3. 基于服务的流量管理

  • 使用预定义服务

        使用服务管理网络流量的最直接的办法就是把预定义服务添加到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

4. 基于区域的流量管理

        区域关联了一组网络接口和源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表示默认接受所有数据包,除非数据包被某些规则明确拒绝

        REJECTDROP默认拒绝所有的、数据包,除非数据包被某些规则明确接受

        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
  • 添加和删除ICMP

        也可以根据协议来决定是接受还是拒绝使用某种协议的网络流量。常见的协议有TCP、UDP、ICMP等。

//添加和删除协议
在内部区域中添加ICMP即可接受对方主机的ping测试

[root@localhost ~]# firewall-cmd --zone=internal --add-protocol=icmp

[root@localhost ~]# firewall-cmd --zone=internal --remove-protocol=icmp

          对于接收到的网络流量具体使用哪个区域的规则,firewalld会按下面的顺序进行处理。

  1. 网络流量的源地址
  2. 接受网络流量的网络接口
  3. firewalld的默认区域
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐