Bootstrap

Firewalld 防火墙详解


1. firewalld 是什么

firewalld 提供了支持 网络 / 防火墙区域(zone)定义网络链接以及接口安全等级的动态防火墙管理工具。

2. 什么是动态防火墙

  我们首先需要弄明白的第一个问题是到底什么是动态防火墙,为了解答这个问题,我们先来回忆一下 iptables service 管理防火墙规则的模式。用户使用命令添加防火墙的规则,如果想让规则永久保存,还需要再执行命令 service iptables reload 使变更的规则保存到配置文件里。在这整个过程的背后, iptables service 会对防火墙的规则列表全部重读一次,加载到内核。
  如果我们把这种哪怕只修改一条规则也要进行所有规则的重新载入的模式称为静态防火墙的话,那么 firewalld 所提供的模式就可以叫做动态防火墙,它的出现就是为了解决这一问题,任何规则的变更都不需要对整个防火墙规则列表进行重新加载,只需要将变更部分保存并更新到运行中的 iptables 即可。

3. firewalld 和 iptables 之间的关系

  firewalld 提供了一个 daemon 和 service,还有命令行和图形界面配置工具,它仅仅是替代了 iptables service 部分,其底层还是使用 iptables 作为防火墙规则管理入口,firewalld 自身并不具备防火墙的功能,而是和 iptables 一样需要通过内核的 netfilter 来实现,也就是说 firewalld 和 iptables 一样,他们的作用都是用于维护规则,而真正使用规则干活的是内核的 netfilter,只不过 firewalld 和 iptables 的结构以及使用方法不一样罢了。
在这里插入图片描述

区别项firewalldiptables
配置文件/usr/lib/firewalld、/etc/firewalld/etc/sysconfig/iptables
对规则的修改不需要全部刷新策略,不丢失现行连接需要全部刷新策略,丢失连接
防火墙类型动态防火墙静态防火墙
  • iptables 主要是基于接口来设置规则,从而判断网络的安全性;firewalld 是基于区域,根据不同的区域来设置不同的规则,从而保证网络的安全,与硬件防火墙的设置相类似
  • iptables在 /etc/sysconfig/iptables 中储存配置;firewalld 将配置储存在 /etc/firewalld/(优先加载)和 /usr/lib/firewalld/(默认的配置文件)中的各种 XML 文件里
  • 使用 iptables 每一个单独更改意味着清除所有旧有的规则和从 /etc/sysconfig/iptables 里读取所有新的规则;使用 firewalld 却不会再创建任何新的规则,仅仅运行规则中的不同之处。因此 firewalld 可以在运行时间内,改变设置而不丢失现行连接

4. firewalld 区域

4.1 firewalld 区域的概念

过滤规则的集合:zone

  • 一个 zone 就是一套过滤规则,数据包必须要经过某个 zone 才能入站或出站。不同 zone 中规则粒度粗细、安全强度都不尽相同。可以把 zone 看作是一个个出站或入站必须经过的安检门,有的严格、有的宽松、有的检查细致、有的检查粗略
  • 每个 zone 单独对应一个 xml 配置文件,在目录 /usr/lib/firewalld/services/ 下,文件名为 <zone名称>.xml。自定义 zone 只需要添加一个 <zone名称>.xml 文件,然后在其中添加过滤规则即可
  • 每个 zone 都有一个默认的处理行为,包括:default(省缺)、ACCEPT、REJECT、DROP

4.2 区域(zone)类型

  firewalld 将网卡对应到不同的区域(zone),zone 默认共有 9 个区域:block,dmz,drop,external,home,internal,public,trusted,work。

区域说明
trusted(信任区域)允许所有网络流量连接,即使没有开放任何服务,那么使用此 zone 的流量照样通过
public(公共区域)默认的 zone,部分公开,不信任网络中其他计算机,只放行特定服务
external(外部区域)允许与 ssh 预定义的服务传入流量,其余均拒绝。默认将通过此区域转发的 IPv4 传出流量进行地址伪装,可用于为路由器启用了伪装功能的外部网络
home(家庭区域)允许与 ssh、ipp-client、mdns、samba-client 或 dhcpv6-client 预定义的服务传入流量,其余均拒绝
internal(内部区域)默认值时与 home 区域相同
work(工作区域)允许与 ssh、ipp-client、dhcpv6-client 预定义的服务传入流量,其余均拒绝
dmz(隔离区域也称为非军事区域)允许与 ssh 预定义的服务传入流量,其余均拒绝
block(限制区域)任何流入的包都被拒绝,返回 icmp-host-prohibited 报文(ipv4)或 icmp6-adm-prohibited 报文(ipv6)。只允许由该系统初始化的网络连接
drop(丢弃区域)任何流入的包都被丢弃,不做任何响应,只允许流出的数据包
  • 最终一个区域的安全程度是取决于管理员在此区域中设置的规则
  • 区域如同进入主机的安全门,每个区域都具有不同限制程度的规则,只会允许符合规则的流量传入
  • 可以根据网络规模,使用一个或多个区域,但是任何一个活跃区域至少需要关联源地址或接口
  • 不同的区域之间的差异是其对待数据包的默认行为不同,根据区域名字我们可以很直观的知道该区域的特征,在 CentOS7 系统中,默认区域为 public

firewalld 详解
Linux 中的防火墙

5. firewalld 服务

  • 在 /usr/lib/firewalld/services/ 目录中,还保存了另外一类配置文件,每个文件对应一项具体的网络服务,如 ssh 服务等
  • 与之对应的配置文件中记录了各项服务所使用的 tcp/udp 端口,在最新版本的 firewalld 中默认已经定义了 70 多种服务供我们使用
  • 当默认提供的服务不够用或者需要自定义某项服务的端口时,我们需要将 service 配置文件放置在 /etc/firewalld/services/ 目录中
/etc/firewalld/		中存放修改过的配置(优先查找,找不到再找默认的配置)
/usr/lib/firewalld/	默认的配置信息

修改配置的话只需要将 /usr/lib/firewalld 中的配置文件复制到 /etc/firewalld 中修改。恢复配置的话直接删除 /etc/firewalld 中的配置文件即可。

示例:
ssh 服务默认运行在 22 端口,但是你想要让 ssh 服务运行在 220 端口,此时需要放行 220 端口。把 /usr/lib/firewalld/ssh.xml 文件拷贝到 /etc/firewalld/services/ 目录下,修改文件端口为 220[root@c7-1 /usr/lib/firewalld/services]#cat 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>

service 配置的好处显而易见:

  • 通过服务名来管理规则更加人性化
  • 通过服务来组织端口分组的模式更加高效,如果一个服务使用了若干个网络端口,则服务的配置文件就相当于提供了到这些端口的规则管理的批量操作快捷方式

每加载一项 service 配置就意味着开放了对应的端口访问,使用下面的命令分别列出所有支持的 service 和查看当前 zone 中加载的 service:

firewall-cmd --get-services		#列出所有支持的 service
firewall-cmd --list-services	#查看当前 zone 中加载的 service

6. firewalld 命令管理

常用的 firewall-cmd 命令选项说明
firewall-config使用图形界面
--reload重新加载配置,修改 firewalld 配置后需执行此命令
--get-default-zone显示当前默认区域
--set-default-zone=设置默认区域,= 后面跟区域
--get-active-zones显示当前正在使用的区域及其对应的网卡接口
--get-zones显示所有可用的区域
--get-zone-of-interface=显示指定接口绑定的区域,= 后面跟网口
--zone= --add-interface=为指定接口绑定区域
--zone= --change-interface=为指定的区域更改绑定的网络接口
--zone= --remove-interface=为指定的区域删除绑定的网络接口
--get-zone-of-source=[/]显示指定源地址绑定的区域
--zone= --add-source=[/]为指定源地址绑定区域
--zone= --change-source=[/]为指定的区域更改绑定的源地址
--zone= --remove-source=[/]为指定的区域删除绑定的源地址
--list-all-zones显示所有区域及其规则
--zone= --list-all显示所有指定区域的所有规则,省略 --zone= 时表示仅对默认区域操作
--zone= --list-services显示指定区域内允许访问的所有服务
--zone= --add-service=为指定区域设置允许访问的某项服务
--zone= --remove-service=删除指定区域已设置的允许访问的某项服务
--zone= --list-ports显示指定区域内允许访问的所有端口号
--zone= --add-port=[端口号]/[协议名]为指定区域设置允许访问的某个或某段端口号(包括协议名)
--zone= --remove-port=[端口号]/[协议名]删除指定区域已设置的允许访问的端口号(包括协议名)
--zone= --list-icmp-blocks显示指定区域内拒绝访问的所有 ICMP 类型
--zone= --add-icmp-block=为指定区域设置拒绝访问的某项 ICMP 类型
--zone= --remove-icmp-block=删除指定区域已设置的拒绝访问的某项 ICMP 类型
firewall-cmd --get-icmptypes显示所有 ICMP 类型

参考文献:
Linux 防火墙
firewalld 详解
Linux 防火墙 firewalld 与 iptables
Linux 防火墙基础(Firewalld命令的使用)
CentOS7 防火墙配置 firewall-cmd

;