简述
Firewalld 提供动态管理的防火墙,支持定义网络连接或接口的信任级别的网络/防火墙区域。它支持 IPv4、IPv6 防火墙设置、以太网桥和 IP 集。运行时和永久配置选项是分开的。它还为服务或应用程序提供直接添加防火墙规则的接口。
-
RHEL 7 和CentOS 7默认防火墙管理工具,替代了6版本的iptables
-
使用更加方便、功能也更加强大一些
-
可以在运行时环境中立即进行更改。不需要重新启动服务或守护程序。借助 firewalld D-Bus 接口,服务、应用程序和用户都可以轻松调整防火墙设置。接口完整,用于防火墙配置工具firewall-cmd、firewall-config和firewall-applet。
-
firewalld 提供了支持 网络 / 防火墙区域(zone)定义网络链接以及接口安全等级的动态防火墙管理工具
-
firewalld 提供了一个 daemon 和 service,还有命令行和图形界面配置工具,它仅仅是替代了 iptables service 部分,其底层还是使用 iptables 作为防火墙规
则管理入口,firewalld 自身并不具备防火墙的功能,而是和 iptables 一样需要通过内核的 netfilter 来实现,也就是说 firewalld 和 iptables 一样,他们的作
用都是用于维护规则,而真正使用规则干活的是内核的 netfilter,只不过 firewalld 和 iptables 的结构以及使用方法不一样罢了。
设计
-
两层设计:核心层和顶层的D-Bus
核心层:负责处理配置和后端,
D-Bus层:更改和创建防火墙配置的主要方式
-
firewalld 提供的在线工具:firewall-cmd、firewall-config、firewall-applet、firewall-offline-cmd
-
在线工具通过D-Bus接口来更改和创建防火墙配置
概念
firewalld区域zone
-
一个 zone 就是一套过滤规则,数据包必须要经过某个 zone 才能入站或出站。不同 zone 中规则粒度粗细、安全强度都不尽相同。可以把 zone 看作是一个个
出站或入站必须经过的安检门,有的严格、有的宽松、有的检查细致、有的检查粗略
-
每个 zone 单独对应一个 xml 配置文件,在目录 /usr/lib/firewalld/services/ 下,文件名为 <zone名称>.xml。自定义 zone 只需要添加一个 <zone名称>.xml
文件,然后在其中添加过滤规则即可
-
每个 zone 都有一个默认的处理行为,包括:default(省缺)、ACCEPT、REJECT、DROP
-
默认zone:public
zone类型
zone类型 | 默认规则说明 |
---|---|
trusted/信任区域 | 允许所有的数据包 |
home/家庭区域 | 拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh、mdns、ipp-client、amba-client与dhcpv6-client服务相关,则允许流量 |
internal/内部区域 | 等同于home区域 |
work/工作区域 | 拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh、ipp-client与dhcpv6-client服务相关,则允许流量 |
public/公共区域 | 拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh、dhcpv6-client服务相关,则允许流量 |
external/外部区域 | 拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh服务相关,则允许流量 |
dmz/隔离区域 | 拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh服务相关,则允许流量 |
block/限制区域 | 拒绝流入的流量,除非与流出的流量相关 |
drop/丢弃区域 | 拒绝流入的流量,除非与流出的流量相关 |
管理
# 查看状态
systemctl status firewalld
# 关闭
systemctl stop firewalld
# 开启
systemctl start firewalld
# 重启
systemctl restart firewalld
# 查看是否开机自启
systemctl is-enabled firewalld
# 开机时自启
systemctl enable firewalld
# 关闭自启
systemctl disable firewalld
# 重新加载
firewall-cmd --reload
# 查看状态
firewall-cmd --state
使用
firewall-cmd是firewalld防火墙配置管理工具的CLI(命令行界面)版本,它的参数一般都是以“长格式”来提供的。与Linux系统中其他的防火墙策略配置工具一样,使用firewalld配置的防火墙策略默认为运行时(Runtime)模式,又称为当前生效模式,而且会随着系统的重启而失效。如果想让配置策略一直存在,就需要使用永久(Permanent)模式了,方法就是在用firewall-cmd命令正常设置防火墙策略时添加**–permanent参数,这样配置的防火墙策略就可以永久生效了。但是,永久生效模式有一个“不近人情”的特点,就是使用它设置的策略只有在系统重启之后才能自动生效。如果想让配置的策略立即生效,需要手动执行firewall-cmd --reload**命令。
firewall-cmd对端口的操作,如开放端口等信息,都放在在"/etc/firewall/zones/public.xml"中记录。
参数 | 作用 |
---|---|
–get-default-zone | 查询默认的区域名称 |
–set-default-zone=<区域名称> | 设置默认的区域,使其永久生效 |
–get-zones | 显示可用的区域 |
–get-services | 显示预先定义的服务 |
–get-active-zones | 显示当前正在使用的区域与网卡名称 |
–add-source= | 将源自此IP或子网的流量导向指定的区域 |
–remove-source= | 不再将源自此IP或子网的流量导向某个指定区域 |
–add-interface=<网卡名称> | 将源自该网卡的所有流量都导向某个指定区域 |
–change-interface=<网卡名称> | 将某个网卡与区域进行关联 |
–list-all | 显示当前区域的网卡配置参数、资源、端口以及服务等信息 |
–list-all-zones | 显示所有区域的网卡配置参数、资源、端口以及服务等信息 |
–add-service=<服务名> | 设置默认区域允许该服务的流量 |
–add-port=<端口号/协议> | 设置默认区域允许该端口的流量 |
–remove-service=<服务名> | 设置默认区域不再允许该服务的流量 |
–remove-port=<端口号/协议> | 设置默认区域不再允许该端口的流量 |
–reload | 让“永久生效”的配置规则立即生效,并覆盖当前的配置规则 |
–panic-on | 开启应急状况模式 |
–panic-off | 关闭应急状况模式 |
# 查看默认区域
firewall-cmd --get-default-zone
# 设置默认区域为dmz
firewall-cmd -set-default-zone=dmz
# 查看已经打开的所有端口
firewall-cmd --zone=public --list-ports
# 开启指定端口:--permanent 永久生效,没有此参数重启后失效;firewall-cmd --reload重新加载区域规则,使之生效
firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --reload
# 开启应急状况模式,断开一切连接
firewall-cmd --panic-on
# 关闭应急状况模式
firewall-cmd --panic-off
# 查看相关协议是否放行
firewall-cmd --zone=public --query-service=ssh
firewall-cmd --zone=public --query-service=https
firewall-cmd --zone=public --query-service=http
# 永久放行相关协议,立即生效
firewall-cmd --permanent --zone=public --add-service=https
firewall-cmd --reload
# 拒绝相关协议,立即生效
firewall-cmd --permanent --zone=public --remove-service=http
firewall-cmd --reload
# 端口流量转发:把访问本机的8080端口流量转发到22端口
# 转发格式:firewall-cmd --permanent --zone=<区域> --add-forward-port=port=<源端口号>:proto=<协议>:toport=<目标端口号>:toaddr=<目标IP地址>
firewall-cmd --permanent --zone=public --add-forward-port=port=8080:proto=tcp:toport=22:toaddr=192.168.137.2
firewall-cmd --reload
# 拒绝来自相关网段的所有用户访问相关端口
firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="192.168.10.0/24" service name="ssh" reject"