防火墙(FireWall)是一种部署在网络或主机边界的组件,用于对进出的数据包依据预设规则进行检测。当数据包匹配特定规则时,系统将执行该规则所定义的操作。通常情况下,防火墙默认拒绝所有非授权的访问请求,仅开放明确允许的服务,并可将需要对外提供服务的主机置于DMZ(非军事化区)网络中以增强安全性。
根据保护范围的不同,防火墙可分为以下两类:
从实现方式来看,防火墙主要分为:
按照工作协议层次划分,主要包括:
此类防火墙运行在OSI模型的第四层,也称为包过滤防火墙。它通过检查每个数据包的源地址、目的地址、端口号及协议状态等信息,结合预先设定的访问控制列表(ACL)来决定是否放行该数据包。
优点:对用户透明,处理效率高,易于维护。
缺点:无法深入分析应用层内容,难以识别病毒或恶意负载。
这类防火墙位于OSI模型第七层,常作为代理网关使用,能够深度解析应用层协议(如HTTP),并实施更精细的安全策略。
优点:具备深度应用层防护能力。
缺点:性能开销较大,处理速度相对较慢。
Netfilter是集成于Linux内核中的核心网络过滤框架,能够在数据包进入用户空间之前对其进行审查和处理。该子系统运行在内核态,支持编程式地修改、丢弃或转发数据包。
用户可通过以下工具向Netfilter提交规则配置:
nftables是继iptables之后的新一代Linux防火墙框架,作为Netfilter的现代化接口,整合了iptables、ip6tables、arptables等多种工具的功能,提供统一的语法结构和更高的性能表现。其设计更加简洁高效,支持复杂的匹配条件与扩展机制,逐渐成为主流发行版的默认选择。
静态防火墙采用固定的规则集,任何规则变更都需要手动重新加载整个配置。其运行机制不依赖于运行时环境的变化,适合规则较少且变动频率低的场景。
动态防火墙支持运行时修改规则而无需重启服务,能实时响应网络状态变化,适用于复杂多变的网络环境。firewalld即属于此类防火墙,具备区域(zone)概念和运行时/永久配置分离机制。
firewalld是Linux系统中一种动态防火墙管理工具,基于D-Bus接口提供运行时配置管理能力。它利用nftables或iptables作为后端引擎,支持区域划分、服务抽象和服务热更新,简化了防火墙规则的维护过程。
firewalld引入“区域”(zone)的概念,用以表示不同的信任级别。每个区域可独立配置允许的服务、端口、协议等规则,便于根据不同网络环境灵活调整安全策略。
常见内置区域包括:public(公共网络)、internal(内部网络)、trusted(完全信任)、dmz(非军事区)、work(工作网络)、home(家庭网络)等,各具不同默认安全等级。
当一个数据包到达时,firewalld会根据其来源接口或源IP地址将其分配到对应的区域。若未指定,则使用默认区域。随后依据该区域的规则进行处理。
规则可以设置为永久生效或仅当前运行时有效。所有更改可通过重载配置实现持久化。
firewalld的配置主要通过XML格式的文件完成,分为系统级配置和用户自定义配置两类。
使用命令可查询指定区域的详细配置信息,包括绑定的接口、源地址、服务和端口等。
可通过查看服务定义文件了解某个服务开放的具体端口和协议类型。
firewall-cmd是firewalld的主要管理命令,支持添加、删除、查询规则等多种操作。
运行时配置:当前生效但重启后失效。
永久配置:写入配置文件,重启后依然有效。
可为不同网络接口指定所属区域,实现差异化安全策略。
将特定源IP地址或网段关联至某一区域,实现基于IP的信任分级管理。
将网络接口加入指定区域,使该接口上的流量遵循相应规则。
允许或禁止预定义服务(如http、ssh)在某区域内通行。
直接开放指定端口和协议,适用于未预定义的服务。
启用IP伪装(NAT),使私有网络主机可通过公网接口访问外部网络。
实现端口转发功能,将到达本地某端口的流量重定向至另一主机或端口。
反转ICMP封锁策略,例如原本阻止ping请求,开启此选项后则允许。
阻止特定类型的ICMP消息(如echo-request),提升隐蔽性。
允许指定三层协议(如GRE、OSPF)通过防火墙。
限制来自特定源端口范围的通信请求。
富规则提供更细粒度的控制能力,支持按源/目的地址、端口、协议、动作(accept/drop/reject)等组合条件创建复杂策略。
可通过添加一条富规则实现:允许http服务通行,但针对源IP为10.1.1.11的请求予以拒绝。示例命令如下:
firewall-cmd --add-rich-rule='rule family="ipv4" source address="10.1.1.11" service name="http" reject'
再确保http服务已在目标区域中启用。
支持直接插入底层iptables/nftables规则,用于高级用户实现firewalld本身不直接支持的特殊策略。
启用panic模式后,firewalld会立即切断所有网络连接,常用于紧急情况下的快速隔离。可通过命令关闭该模式恢复正常通信。
包括日志记录、锁定模式、默认区域设置等辅助功能,可根据实际需求进行调优。
结合多种管理命令与规则类型,构建完整的防火墙策略体系,例如搭建Web服务器时开放80/443端口并屏蔽非法扫描行为,或为企业网关配置SNAT与端口转发等功能。
arptables 不仅可以防范外部主机对本机的 ARP 欺骗攻击,还能有效阻止本机因病毒感染或程序异常而向局域网内其他设备发起 ARP 攻击。若能合理配置与使用,arptables 可作为一款高效的 ARP 防火墙工具。
ebtables 用于在数据链路层对网络数据包进行过滤处理。相较于 iptables,ebtables 工作在网络协议栈更底层的位置,能够接触到更为“原始”的数据帧信息。因此,它常被应用于桥接模式下的网络环境,例如对 VLAN ID 等二层参数进行精细化控制。
service iptables reload
查看系统中可用的 *tables 工具:
[root@centos7 ~]# ls -1 /sbin/*tables
-rwxr-xr-x 1 root root 59872 11月 6 2016 /sbin/arptables
-rwxr-xr-x. 1 root root 7016 4月 11 2018 /sbin/ebtables
lrwxrwxrwx. 1 root root 13 8月 1 15:45 /sbin/ip6tables -> xtables-multi
lrwxrwxrwx. 1 root root 13 8月 1 15:45 /sbin/iptables -> xtables-multi
Nftables 是 netfilter 框架的升级版本,在保留原有架构的基础上进行了功能增强和性能优化。
nftables 的主要优势包括:
在静态防火墙管理模式下,每次用户修改防火墙规则并希望永久保存时,防火墙服务会重新加载全部规则,即使只是更改了一条规则也不例外。这种机制被称为静态模式。由于完整重载过程会导致现有连接中断,可能引发短暂的网络断连现象。
采用此类加载方式的防火墙称为静态防火墙,典型的代表是 iptables。当执行相关命令将变更后的规则写入配置文件后,系统会触发全部规则的重新载入流程。
动态防火墙则采用更为智能的更新策略:当用户修改规则并需持久化时,仅将变动部分同步至正在运行的防火墙引擎(如 iptables),无需重启或重载整个规则集。这种方式即为动态模式,能够在不中断现有连接的前提下完成规则更新。
firewalld 就是一个典型的动态防火墙实现。
Firewalld 是由 Red Hat 开发的一款现代化防火墙管理工具,其默认后端已切换为 nftables。在 CentOS 7 发布之前,系统普遍使用 iptables 命令直接管理防火墙规则;自 CentOS 7 起,firewalld 正式取代 iptables 成为默认的防火墙解决方案。
虽然用户仍可同时启用 iptables 和 firewalld,但由于两者规则体系独立,容易造成混淆和冲突。建议的做法是关闭其中一个防火墙服务,或将其中一个设置为完全放行状态,仅保留一个作为主控防火墙。
此外,firewalld 支持动态加载规则,避免了传统静态模式带来的连接中断问题。
firewalld 实际上提供了一个守护进程(daemon)、服务单元以及配套的命令行和图形化配置工具。它本质上替代的是 iptables 的服务管理部分,底层依然依赖 iptables 的规则管理接口来操作内核中的 netfilter 模块。
无论是 firewalld 还是 iptables,它们本身并不直接执行数据包过滤,真正的过滤工作由内核的 netfilter 完成。两者的作用在于维护和传递规则,区别主要体现在架构设计和使用方式上。
为了简化防火墙策略的管理,firewalld 引入了“区域”概念。每个区域代表一套独立的规则集合,用户可根据网络环境将接口划分到不同区域,从而实现灵活的安全策略控制。
当一个数据包进入系统时,firewalld 会根据以下顺序判断其所属区域:
需要注意的是,firewalld 默认将 public 区域设为默认区域。同时,系统会自动将本地回环接口(lo)映射至 trusted 区域,以确保本地通信不受限制。
对于所有未明确允许的流量——即不匹配任何开放端口、协议或服务的情况——通常会被拒绝或直接丢弃,具体行为取决于所在区域的目标策略。
在每个区域内部,各类规则的执行遵循严格的优先顺序:
此外,可为上述三类规则分别设置相应的记录日志和审计规则,这些规则可以同时生效,用于监控和排查网络行为。
特别地,富规则(rich rules)具有最高优先级,其匹配顺序高于区域内其他所有规则类型。只有当所有规则都无法匹配时,数据包才会被拒绝;但 trusted 区域是一个例外,它默认接受所有流量。
配置 firewalld 可通过以下三种主要途径实现:
firewall-cmd 命令进行动态配置管理。firewall-config 工具进行可视化操作。Firewalld 的配置文件分布在两个核心目录中:
/usr/lib/firewalld/:存放 firewalld 软件包自带的标准配置文件,包括预定义的服务、区域、ICMP 类型等。/etc/firewalld/:结构与上层目录一致,用于保存管理员自定义的配置内容,优先级更高。值得注意的是,尽管可通过编辑 /etc/firewalld/ 下的文件进行配置,但官方不建议直接手动修改此目录中的文件,推荐使用命令行或图形工具完成变更,以避免格式错误或配置冲突。
进入系统区域配置目录:
[root@centos7 ~]# cd /usr/lib/firewalld/
[root@centos7 firewalld]# ls
helpers icmptypes ipsets services zones
列出所有可用区域配置文件:
[root@centos7 firewalld]# ls zones/
block.xml drop.xml home.xml public.xml work.xml
dmz.xml external.xml internal.xml trusted.xml
查看 trusted 区域的具体定义:
[root@centos7 firewalld]# cat zones/trusted.xml
<?xml version="1.0" encoding="utf-8"?>
<zone target="ACCEPT">
<short>Trusted</short>
<description>All network connections are accepted.</description>
</zone>
查看 block 区域的配置内容:
[root@centos7 firewalld]# cat zones/block.xml
<?xml version="1.0" encoding="utf-8"?>
<zone target="%%REJECT%%">
<short>Block</short>
<description>Unsolicited incoming network packets are rejected. Incoming packets that are related to outgoing network connections are accepted. Outgoing network connections are allowed.</description>
</zone>
查看 drop 区域的设定:
[root@centos7 firewalld]# cat zones/drop.xml
<?xml version="1.0" encoding="utf-8"?>
<zone target="DROP">
<short>Drop</short>
<description>Unsolicited incoming network packets are dropped. Incoming packets that are related to outgoing network connections are accepted. Outgoing network connections are allowed.</description>
</zone>
服务配置文件位于 services 目录下,可通过如下命令浏览:
[root@centos7 firewalld]# ls -1 services
amanda-client.xml
......<?xml version="1.0" encoding="utf-8"?> <service> <short>WWW (HTTP)</short> <description>HTTP 是用于提供网页服务的协议。若计划将 Web 服务器对外公开访问,则需要启用此服务。仅在本地浏览或开发网页时,无需开启此项。</description> <port protocol="tcp" port="80"/> </service>
<?xml version="1.0" encoding="utf-8"?> <service> <short>Secure WWW (HTTPS)</short> <description>HTTPS 是 HTTP 的安全版本,适用于对安全性要求较高的网站场景,例如需要登录的电商平台或邮箱系统。本地浏览或开发阶段无需启用。要使用该功能,需先安装 httpd 软件包。</description> <port protocol="tcp" port="443"/> </service>
在进行防火墙配置时,有两个核心概念必须掌握:
--reload
推荐做法是每次配置时同时提交两条指令:
--permanent
--permanent
防火墙规则通常应用于某个特定 zone 内(直接规则除外)。若未通过指定参数明确 zone,
--zone
则系统会自动使用默认区域——通常是 public。
# 列出所有可用的 zone [root@centos7 ~]# firewall-cmd --get-zones block dmz drop external home internal public trusted work
# 查看当前激活的 zone(即已绑定接口或源地址的 zone) [root@centos7 ~]# firewall-cmd --get-active-zones public interfaces: ens32
# 获取当前默认 zone [root@centos7 ~]# firewall-cmd --get-default-zone public
# 设置新的默认 zone,如设为 trusted(此操作同时影响永久配置) [root@centos7 ~]# firewall-cmd --set-default-zone=trusted success [root@centos7 ~]# firewall-cmd --get-default-zone trusted
# 将默认 zone 恢复为 public [root@centos7 ~]# firewall-cmd --set-default-zone=public success
用户可根据实际需求创建自定义 zone,但此类操作必须结合 --permanent 参数使用,否则无法生效。
--complete-reload# 创建一个新的zone,名为myweb [root@centos7 ~]# firewall-cmd --permanent --new-zone=myweb # 查看所有已存在的zone(永久配置) [root@centos7 ~]# firewall-cmd --permanent --get-zones block dmz drop external home internal myweb public trusted work # 当前运行时的zone列表尚未包含新创建的myweb [root@centos7 ~]# firewall-cmd --get-zones block dmz drop external home internal public trusted work # 通过--reload重新加载防火墙规则,使永久配置生效 [root@centos7 ~]# firewall-cmd --reload # 再次查看运行时zone列表,此时myweb已生效 [root@centos7 ~]# firewall-cmd --get-zones block dmz drop external home internal myweb public trusted work # 检查新建zone的target策略 [root@centos7 ~]# firewall-cmd --permanent --zone=myweb --get-target default # 设置该zone的目标行为为REJECT,表示拒绝进入的数据包并返回拒绝响应 [root@centos7 ~]# firewall-cmd --permanent --zone=myweb --set-target=REJECT # 验证target是否已成功更改为REJECT [root@centos7 ~]# firewall-cmd --permanent --zone=myweb --get-target REJECT # 若后续不再需要此自定义zone,可将其删除(需使用--permanent选项) [root@centos7 ~]# firewall-cmd --permanent --delete-zone=myweb # 删除后查看永久zone列表,确认myweb已被移除 [root@centos7 ~]# firewall-cmd --permanent --get-zones block dmz drop external home internal public trusted work # 重新加载以应用删除操作 [root@centos7 ~]# firewall-cmd --reload # 查看当前生效的zone,确认myweb已不存在 [root@centos7 ~]# firewall-cmd --get-zones block dmz drop external home internal public trusted work # 显示所有zone的详细规则信息 [root@centos7 ~]# firewall-cmd --list-all-zones block target: %%REJECT%% icmp-block-inversion: no interfaces: sources: services: ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules: dmz target: default ...... drop target: DROP ...... external target: default ...... home target: default ...... internal target: default ...... public (active) target: default ...... trusted target: ACCEPT ...... work target: default ...... # 查看默认zone(通常是public)的完整配置 [root@centos7 ~]# firewall-cmd --list-all public (active) target: default icmp-block-inversion: no interfaces: ens32 sources: services: cockpit dhcpv6-client ssh ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules: # 查看指定zone(如home)的具体规则设置 [root@centos7 ~]# firewall-cmd --list-all --zone=home home target: default icmp-block-inversion: no interfaces: sources:
services: dhcpv6-client mdns samba-client ssh ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules: service 管理 首先配置并启动 httpd 服务: yum install -y httpd systemctl start httpd 可以使用以下命令查看系统预定义的服务列表: [root@centos7 ~]# firewall-cmd --get-services 若需放行某个服务,例如 HTTP 服务,执行如下命令: [root@centos7 ~]# firewall-cmd --add-service=http success 查看当前已放行的服务有哪些: [root@centos7 ~]# firewall-cmd --list-services dhcpv6-client http ssh 验证某项服务是否已被成功放行: [root@centos7 ~]# firewall-cmd --query-service=http yes 如需移除已放行的服务,可运行: [root@centos7 ~]# firewall-cmd --remove-service=http success 此外,firewall-cmd 支持自定义服务的创建与管理,常用操作包括: --permanent --new-service=service 用于添加一个新的永久性空服务。 --permanent --delete-service=service 删除一个已存在的永久性服务。 --permanent --service=service --set-description=description 为指定服务设置描述信息。 --permanent --service=service --get-description 显示该服务当前的描述内容。source 管理 通过 source 规则,可将来自特定网段的数据包交由指定 zone 处理。 将来源地址 192.168.1.0/24 分配至 home 区域: [root@centos7 ~]# firewall-cmd --add-source=192.168.1.0/24 --zone=home success 查询 home 区域中绑定的所有 source 地址: [root@centos7 ~]# firewall-cmd --list-sources --zone=home 192.168.1.0/24 确认某一 source 所属的区域: [root@centos7 ~]# firewall-cmd --get-zone-of-source=192.168.1.0/24 home 检查 source 是否已在指定 zone 中存在: [root@centos7 ~]# firewall-cmd --query-source=192.168.1.0/24 --zone=home yes 如需更改 source 的归属区域,例如迁移到 public 区域: [root@centos7 ~]# firewall-cmd --change-source=192.168.1.0/24 --zone=public success 从某个 zone 中删除指定的 source: [root@centos7 ~]# firewall-cmd --remove-source=192.168.1.0/24 --zone=public success interface 管理 网络接口(interface)也可以绑定到特定的安全区域进行管理。 列出当前 zone 中包含的接口: [root@centos7 ~]# firewall-cmd --list-interfaces ens32 查看某个接口当前所属的 zone: [root@centos7 ~]# firewall-cmd --get-zone-of-interface=ens32 public 确认接口是否已添加到当前 zone: [root@centos7 ~]# firewall-cmd --query-interface=ens32 yes 将接口移动至另一个 zone,例如切换到 home: [root@centos7 ~]# firewall-cmd --change-interface=ens32 --zone=home success 若需要从当前 zone 移除接口: [root@centos7 ~]# firewall-cmd --remove-interface=ens32 --zone=home success 当接口尚未归属于任何 zone 时,可通过以下命令将其绑定至指定区域,例如 public: [root@centos7 ~]# firewall-cmd --add-interface=ens32 --zone=public success
以下为针对永久服务(--permanent)的常用操作命令,可用于管理服务相关的端口、协议及源端口设置:
通过 firewalld 命令可动态管理网络端口的放行状态:
# 允许特定端口通信 [root@centos7 ~]# firewall-cmd --add-port=5900/tcp success # 查看当前已开放的端口列表 [root@centos7 ~]# firewall-cmd --list-ports 5900/tcp # 查询某端口是否已放行 [root@centos7 ~]# firewall-cmd --query-port=5900/tcp yes # 移除端口放行规则 [root@centos7 ~]# firewall-cmd --remove-port=5900/tcp success
地址伪装功能常用于实现网络转发或NAT场景:
# 检查 masquerade 是否已启用 [root@centos7 ~]# firewall-cmd --query-masquerade no # 启用地址伪装 [root@centos7 ~]# firewall-cmd --add-masquerade [root@centos7 ~]# firewall-cmd --query-masquerade yes # 关闭地址伪装功能 [root@centos7 ~]# firewall-cmd --remove-masquerade
本方案涉及如下网络设备布局:
在使用端口转发功能前,必须确保对应区域(zone)已开启 masquerade 功能。
# 开启地址伪装支持 [root@centos7 ~]# firewall-cmd --add-masquerade
端口转发命令语法格式如下:
--add-forward-port=port=portid[-portid]:proto=protocol[:toport=portid[-portid]][:toaddr=address[/mask]]
示例:将本地 8000 端口的访问请求转发至本机的 80 端口。
# 配置端口转发规则 [root@centos7 ~]# firewall-cmd --add-forward-port=port=8000:proto=tcp:toport=80 # 检查指定的端口转发规则是否存在 [root@centos7 ~]# firewall-cmd --query-forward-port=port=8000:proto=tcp:toport=80 yes # 设置将本机的1022端口流量转发至目标地址10.1.1.11的22端口 [root@centos7 ~]# firewall-cmd --add-forward-port=port=1022:proto=tcp:toport=22:toaddr=10.1.1.11 # 查看当前所有已配置的端口转发规则 [root@centos7 ~]# firewall-cmd --list-forward-ports port=8000:proto=tcp:toport=80:toaddr= port=1022:proto=tcp:toport=22:toaddr=10.1.1.11# 删除指定的端口转发规则 [root@centos7 ~]# firewall-cmd --remove-forward-port=port=1022:proto=tcp:toport=22:toaddr=10.1.8.80 # ICMP反向阻断管理(icmp-block-inversion) # 默认情况下,icmp-block-inversion 为 no,表示允许所有 ICMP 类型报文通过。 # 此时可通过富规则禁止特定主机对本机进行 ping 操作。 # 当 icmp-block-inversion 设置为 yes 时,系统会默认阻止所有 ICMP 报文类型, # 可通过富规则显式放行某些主机的 ping 请求。 # 查询当前 icmp-block-inversion 状态 [root@centos7 ~]# firewall-cmd --query-icmp-block-inversion no # 启用 icmp-block-inversion 功能 [root@centos7 ~]# firewall-cmd --add-icmp-block-inversion [root@centos7 ~]# firewall-cmd --add-icmp-block-inversion --permanent # 再次确认是否已成功启用 [root@centos7 ~]# firewall-cmd --query-icmp-block-inversion yes # 客户端执行 ping 测试 [c:\~]$ ping -n 1 10.1.8.88 正在 Ping 10.1.8.88 具有 32 字节的数据: 来自 10.1.8.88 的回复: 无法访问目标主机。 10.1.8.88 的 Ping 统计信息: 数据包: 已发送 = 1,已接收 = 1,丢失 = 0 (0% 丢失), # 注意:firewalld 会保留现有连接状态。若修改后仍可 ping 通, # 建议重启 firewalld 或使用 --complete-reload 完全重载防火墙规则 [root@centos7 ~]# firewall-cmd --complete-reload # 恢复 icmp-block-inversion 为默认状态 [root@centos7 ~]# firewall-cmd --remove-icmp-block-inversion [root@centos7 ~]# firewall-cmd --remove-icmp-block-inversion --permanent # ICMP 类型阻断管理(icmp-blocks) # 查看系统支持的所有预定义 ICMP 类型 [root@centos7 ~]# firewall-cmd --get-icmptypes # 常见的 ICMP 类型包括: # echo-request:表示 ICMP 请求报文(即 ping 请求) # echo-reply:表示 ICMP 响应报文(即 ping 回复) # 添加阻止的 ICMP 类型,如下例中阻止 echo-request 实现禁 ping [root@centos7 ~]# firewall-cmd --add-icmp-block echo-request [root@centos7 ~]# firewall-cmd --add-icmp-block echo-request --permanent # 查看当前被阻止的 ICMP 类型列表 [root@centos7 ~]# firewall-cmd --list-icmp-blocks echo-request # 验证 echo-request 是否已被成功添加至阻止列表 [root@centos7 ~]# firewall-cmd --query-icmp-block echo-request yes # 客户端再次进行 ping 连通性测试 [c:\~]$ ping -n 1 10.1.8.88 正在 Ping 10.1.8.88 具有 32 字节的数据:
来自 10.1.8.88 的回复:无法到达目标主机。
对 10.1.8.88 进行 Ping 测试的统计结果如下:
数据包发送数量:1,接收数量:1,丢失数量:0(丢包率 0%)。
由于 firewalld 具备保持已有连接状态的功能,若此时仍可成功 ping 通,
建议重启 firewalld 服务或执行 --complete-reload 命令以彻底重载防火墙规则。
[root@centos7 ~]# firewall-cmd --complete-reload
将 ICMP 请求的阻断设置恢复为默认状态:
[root@centos7 ~]# firewall-cmd --remove-icmp-block echo-request
[root@centos7 ~]# firewall-cmd --remove-icmp-block echo-request --permanent
添加允许通过的协议:
[root@centos7 ~]# firewall-cmd --add-protocol=icmp
查看当前已放行的协议列表:
[root@centos7 ~]# firewall-cmd --list-protocol
输出示例:
icmp
查询指定协议是否已被放行:
[root@centos7 ~]# firewall-cmd --query-protocol=icmp
返回结果:
yes
移除已放行的协议配置:
[root@centos7 ~]# firewall-cmd --remove-protocol=icmp
用于限制客户端的源端口,实际使用较少,其配置方式与其它规则类似,详见
source管理
富规则提供了高度灵活的自定义能力,可用于实现多种复杂策略,例如:
详细语法参考手册 firewalld.richlanguage(5)。
富规则基本语法结构:
rule [source] [destination] service|port|protocol|icmp-block|icmp-type|masquerade|forward-port|source-port [log] [audit] [accept|reject|drop|mark]
添加一条富规则,阻止所有 ICMP 请求:
[root@centos7 ~]# firewall-cmd --add-rich-rule='rule protocol value=icmp drop'
更精确地拒绝并指定拒绝类型(IPv4 环境下):
[root@centos7 ~]# firewall-cmd --add-rich-rule='rule family=ipv4 protocol value=icmp reject type=net-prohib'
支持的拒绝类型包括:
icmp-host-prohibited, host-prohib, icmp-net-unreachable, net-unreach,
icmp-host-unreachable, host-unreach, icmp-port-unreachable, port-unreach,
icmp-proto-unreachable, proto-unreach, icmp-net-prohibited, net-prohib,
tcp-reset, tcp-rst, icmp-admin-prohibited, admin-prohib
查看当前已配置的富规则列表:
[root@centos7 ~]# firewall-cmd --list-rich-rules
输出示例:
rule protocol value="icmp" drop
验证某条富规则是否存在:
[root@centos7 ~]# firewall-cmd --query-rich-rule='rule protocol value=icmp drop'
返回结果:
yes
删除已添加的富规则:
[root@centos7 ~]# firewall-cmd --remove-rich-rule='rule protocol value="icmp" drop'
针对 IPv4 环境,允许来自 10.1.8.10 的主机向本机发送 ICMP 请求(即允许其 ping 本机):
[root@centos7 ~]# firewall-cmd --add-rich-rule='rule family=ipv4 source address="10.1.8.10" icmp-type name="echo-request" accept'
在 IPv4 环境中,对来自 10.1.8.0/24 网段的主机进行如下限制:
[root@server ~ 16:40:23]# firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.0.0/24" service name="tftp" log prefix="tftp" level="info" limit value="1/m" accept'# 添加富规则:拒绝来自 10.1.1.11 的 HTTP 访问 [root@server ~ 16:44:32]# firewall-cmd --add-rich-rule='rule family="ipv4" source address="10.1.1.11/32" service name="http" reject' # 删除已添加的富规则 [root@server ~ 16:45:17]# firewall-cmd --remove-rich-rule='rule family="ipv4" source address="10.1.1.11/32" service name="http" reject' # 阻止指定主机的 ping 请求(ICMP 流量) [root@server ~ 16:46:02]# firewall-cmd --add-rich-rule='rule family="ipv4" source address="10.1.1.11/32" protocol value="icmp" reject'
Direct Rule 管理说明 Firewalld 支持直接规则(Direct Rules)功能,其优先级高于标准 firewalld 规则。防火墙在处理时会首先解析直接规则,之后才应用常规的 firewalld 配置。此外,用户也可以将这些直接规则显式地绑定到特定区域中。 直接规则主要用于对 firewalld 功能进行补充。对于可以通过 firewalld 原生规则实现的需求,建议优先使用 firewalld 自身机制完成配置。 其语法规则与 iptables 类似,因此使用者需具备基本的 iptables 概念知识,包括:
[--permanent] --direct --get-all-chains
查看所有表中的 chain 列表
[--permanent] --direct --get-chains { ipv4 | ipv6 | eb } table
列出指定表中的所有 chain
[--permanent] --direct --add-chain { ipv4 | ipv6 | eb } table chain
在指定表中创建新的 chain
[--permanent] --direct --remove-chain { ipv4 | ipv6 | eb } table chain
删除指定表中的某个 chain
[--permanent] --direct --get-all-rules
显示所有表和 chain 中的规则
[--permanent] --direct --get-rules { ipv4 | ipv6 | eb } table chain
查看特定表和 chain 中的所有规则
[--permanent] --direct --add-rule { ipv4 | ipv6 | eb } table chain priority args
向指定表和 chain 添加一条规则(priority 为优先级数值)
[--permanent] --direct --remove-rule { ipv4 | ipv6 | eb } table chain priority args
从指定表和 chain 中删除某条规则
[--permanent] --direct --remove-rules { ipv4 | ipv6 | eb } table chain
清除指定表和 chain 中的所有规则
应用示例:
将网段 192.168.0.0/24 设为限制对象,要求每个单一 IP 地址每分钟最多建立一次连接,超出并发限制的请求将被丢弃。
[root@centos7 ~]# firewall-cmd --direct --permanent --add-chain ipv4 raw blacklist
[root@centos7 ~]# firewall-cmd --direct --permanent --add-rule ipv4 raw PREROUTING 0 -s 192.168.0.0/24 -j blacklist在上述配置中,首先创建了一个名为 `blacklist` 的自定义链,位于 IPv4 的 `raw` 表中。随后添加了一条规则,将来自 `192.168.0.0/24` 网段的数据包导向该链进行进一步处理。
[root@centos7 ~]# firewall-cmd --direct --permanent --add-rule ipv4 raw blacklist 0 -m limit --limit 1/min -j LOG --log-prefix "blacklisted "此步骤设置了日志记录功能,对进入 `blacklist` 链且匹配条件的数据包,以每分钟最多一条的频率进行记录,日志前缀为 "blacklisted ",便于后续追踪与分析。
[root@centos7 ~]# firewall-cmd --direct --permanent --add-rule ipv4 raw blacklist 1 -j DROP接下来配置了实际的阻断动作:所有经过 `blacklist` 链并被前面规则匹配到的数据包将被直接丢弃,实现屏蔽效果。
[root@centos7 ~]# firewall-cmd --reload执行重载命令,使上述永久规则立即生效。
[root@centos7 ~]# firewall-cmd --direct --get-all-rules ipv4 raw PREROUTING 0 -s 192.168.0.0/24 -j blacklist ipv4 raw blacklist 0 -m limit --limit 1/min -j LOG --log-prefix 'blacklisted ' ipv4 raw blacklist 1 -j DROP通过查看当前所有 direct 规则,可以确认以上配置已正确加载至防火墙策略中。
[root@centos7 ~]# firewall-cmd --permanent --direct --remove-rules ipv4 raw blacklist [root@centos7 ~]# firewall-cmd --permanent --direct --remove-rules ipv4 raw PREROUTING先从持久化配置中删除指定规则。
[root@centos7 ~]# firewall-cmd --direct --remove-rules ipv4 raw blacklist [root@centos7 ~]# firewall-cmd --direct --remove-rules ipv4 raw PREROUTING再从运行时配置中移除相同规则,确保即时生效。
[root@centos7 ~]# firewall-cmd --direct --remove-chain ipv4 raw blacklist最后删除自定义的 `blacklist` 链。
[root@centos7 ~]# firewall-cmd --reload重新加载防火墙配置,完成清理流程。
[root@centos7 ~]# firewall-cmd --panic-on- 查询当前是否处于 panic 模式:
[root@centos7 ~]# firewall-cmd --query-panic- 关闭 panic 模式:
[root@centos7 ~]# firewall-cmd --panic-off
[root@centos7 ~]# firewall-cmd --runtime-to-permanent设置临时规则的有效时间(单位为秒),适用于测试或调试阶段:
[root@centos7 ~]# firewall-cmd --add-service=http --timeout=10该规则将在10秒后自动失效,无需手动清理。
[root@centos7 ~]# firewall-cmd --list-all | grep inversion icmp-block-inversion: no若输出显示 `icmp-block-inversion` 为 `yes`,需将其关闭:
[root@centos7 ~]# firewall-cmd --permanent --remove-icmp-block-inversion然后确认 `echo-request` 未被列入 ICMP 屏蔽列表:
[root@centos7 ~]# firewall-cmd --list-icmp-blocks如果返回结果包含 `echo-request`,则应将其移除:
[root@centos7 ~]# firewall-cmd --permanent --remove-icmp-block=echo-request最后,禁止来自 `10.1.8.10` 的 ICMP 请求:
[root@centos7 ~]# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.1.8.10" icmp-block name="echo-request"'
完成配置后建议重载防火墙以确保变更生效:
[root@centos7 ~]# firewall-cmd --reload
**案例2:**仅允许来自10.1.8.10的主机对本机执行ping操作。
首先,阻止所有外部主机对本机发起ICMP请求:
[root@centos7 ~]# firewall-cmd --permanent --add-icmp-block-inversion
随后,添加一条富规则,明确放行IP地址为10.1.8.10的主机进行ping通信:
[root@centos7 ~]# firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address="10.1.8.10" icmp-type name="echo-request" accept'
最后,为确保新规则生效,需彻底重新加载防火墙配置:
[root@centos7 ~]# firewall-cmd --complete-reload
**案例3:**利用富规则实现精细化访问控制
只允许10.1.8.10主机ping本机
**案例1(调整顺序后):**拒绝特定主机(10.1.8.10)对本机的ping请求。
可通过以下命令设置永久性富规则,拦截来自指定IPv4地址的ICMP回显请求:
[root@centos7 ~]# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.1.8.10" icmp-type name="echo-request" reject'
配置完成后,执行完全重载以应用变更:
[root@centos7 ~]# firewall-cmd --complete-reload
扫码加好友,拉您进群



收藏
