Firewalld 概述
firewalld
是 CentOS 7 系统中默认的防火墙管理工具,取代了之前的 iptables
,也工作在网络层,属于包过滤防火墙。
firewalld
和 iptables
都是用户态的防火墙管理工具,内部结构都指向内核态的 netfilter
网络过滤子系统,用来实现包过滤防火墙的功能。
firewalld
提供了一种动态防火墙管理工具,支持网络区域的定义、网络连接的安全等级管理。它支持 IPv4、IPv6 防火墙设置以及以太网桥(一些高级服务会用到,比如云计算)。它拥有两种配置模式:运行时配置和永久配置。
Firewalld 与 Iptables 的区别
-
基于接口 vs. 基于区域
iptables
是基于接口来设置规则,以判断网络的安全性;firewalld
是基于区域,根据不同的区域设置不同的规则,类似于硬件防火墙的设置。 -
配置文件位置
iptables
的配置储存在/etc/sysconfig/iptables
中;firewalld
的配置储存在/etc/firewalld/
(优先加载)和/usr/lib/firewalld/
(默认配置文件)中的各种 XML 文件里。 -
规则应用方式
使用
iptables
时,每一次单独更改都需要清除所有旧有规则并从/etc/sysconfig/iptables
重新读取新的规则(规则修改后立即生效);(需全部刷新策略,丢失连接)而使用
firewalld
不会创建任何新的规则,仅会运行规则中的不同之处。因此,firewalld
可以在运行时动态改变设置而不丢失现行连接。(不需全部刷新策略) -
防火墙类型
iptables
是静态防火墙,所有规则都是配置在指定的表链之中,只能通过修改规则配置来更改防护策略;firewalld
是动态防火墙,可在不同的区域配置不同的规则,通过更换区域来更改防护策略。
Firewalld 区域的概念
firewalld
为了简化管理,将所有网络流量分为多个区域(zone)。
- 根据数据包的源 IP 地址或传入的网络接口等条件,流量会传入相应的区域。
- 每个区域都定义了自己打开或关闭的端口和服务列表。
- 要激活一个区域的规则,区域必须要关联绑定一个网卡或源地址。
- 默认情况下,public区域是默认区域,包含所有接口(网卡)。
- 源地址优先级更高。
区域安全级别的决定因素
每个区域的安全程度取决于管理员在该区域中设置的规则。区域就像主机的安全门,每个区域具有不同限制程度的规则,只允许符合规则的流量传入。
管理员可以根据网络规模使用一个或多个区域,但是任何一个活跃区域至少需要关联源地址或接口。默认情况下,public
区域是默认区域,包含所有接口(网卡)。
Firewalld 防火墙预定义的 9 个区域
- trusted(信任区域):允许所有的传入流量。
- public(公共区域):允许与
ssh
或dhcpv6-client
预定义服务匹配的传入流量,其余均拒绝。是新添加网络接口的默认区域。 - external(外部区域):允许与
ssh
预定义服务匹配的传入流量,其余均拒绝。默认将通过此区域转发的 IPv4 传出流量进行地址伪装,可用于为路由器启用了伪装功能的外部网络。 - home(家庭区域):允许与
ssh
、mdns
、samba-client
或dhcpv6-client
预定义服务匹配的传入流量,其余均拒绝。 - internal(内部区域):默认情况下与
home
区域相同。 - work(工作区域):允许与
ssh
、dhcpv6-client
预定义服务匹配的传入流量,其余均拒绝。 - dmz(隔离区域,也称为非军事区域):允许与
ssh
预定义服务匹配的传入流量,其余均拒绝。 - block(限制区域):拒绝所有传入流量。
- drop(丢弃区域):丢弃所有传入流量,并且不产生包含 ICMP 的错误响应。
Firewalld 数据处理流程
firewalld
对于进入系统的数据包,会根据数据包的源 IP 地址或传入的网络接口等条件,将数据流量转入相应区域的防火墙规则。对于进入系统的数据包,首先检查的就是其源地址。
Firewalld 检查数据包源地址的规则:
- 源地址关联到特定的区域:如果源地址或接口绑定的区域有冲突,执行该区域的规则。
- 源地址未关联到特定的区域:如果源地址或接口绑定的区域没有冲突,使用传入网络接口的区域并执行该区域的规则。
- 网络接口也未关联到特定的区域:如果源地址和接口都没有绑定特定区域,使用默认区域并执行该区域的规则。
Firewalld 防火墙的配置方法
- 使用
firewall-cmd
命令行工具。 - 使用
firewall-config
图形工具。 - 编辑
/etc/firewalld/
目录下的配置文件。
Firewalld 服务的启动命令
启动 firewalld
服务:
systemctl start firewalld.service
常用的 firewall-cmd
命令选项
--
的命令可前后互换。
显示和设置默认区域(查增)
--get-default-zone
:显示当前默认区域。--set-default-zone=<zone>
:设置默认区域。
显示当前使用的区域和所有可用区域(查)
--get-active-zones
:显示当前正在使用的区域及其对应的网卡接口。--get-zones
:显示所有可用的区域。
接口与区域绑定管理(查增删改)
--get-zone-of-interface=<interface>
:显示指定接口绑定的区域。--zone=<zone> --add-interface=<interface>
:为指定接口绑定区域。--zone=<zone> --change-interface=<interface>
:为指定区域更改绑定的网络接口。--zone=<zone> --remove-interface=<interface>
:为指定区域删除绑定的网络接口。
源地址与区域绑定管理(查改删)
--zone=<zone> --add-source=<source>[/<mask>]
:为指定源地址绑定区域。--zone=<zone> --change-source=<source>[/<mask>]
:为指定区域更改绑定的源地址。--zone=<zone> --remove-source=<source>[/<mask>]
:为指定区域删除绑定的源地址。
显示所有区域及其规则(查)
--list-all-zones
:显示所有区域及其规则。[--zone=<zone>] --list-all
:显示指定区域的所有规则,省略--zone=<zone>
时表示仅对默认区域操作。
服务管理(查增删)
[--zone=<zone>] --list-services
:显示指定区域内允许访问的所有服务。[--zone=<zone>] --add-service=<service>
:为指定区域设置允许访问的某项服务。(多个服务可使用{}
)[--zone=<zone>] --remove-service=<service>
:删除指定区域已设置的允许访问的某项服务。
端口管理(查增删)
[--zone=<zone>] --list-ports
:显示指定区域内允许访问的所有端口号。[--zone=<zone>] --add-port=<portid>[-<portid>]/<protocol>
:为指定区域设置允许访问的某个/某段端口号(包括协议名)。(多端口也可使用{}
)[--zone=<zone>] --remove-port=<portid>[-<portid>]/<protocol>
:删除指定区域已设置的允许访问的端口号(包括协议名)。
ICMP 类型管理(查增删)
[--zone=<zone>] --list-icmp-blocks
:显示指定区域内拒绝访问的所有 ICMP 类型。[--zone=<zone>] --add-icmp-block=<icmptype>
:为指定区域设置拒绝访问的某项 ICMP 类型。[--zone=<zone>] --remove-icmp-block=<icmptype>
:删除指定区域已设置的拒绝访问的某项 ICMP 类型。--get-icmptypes
:显示所有 ICMP 类型。
区域管理
显示和设置默认区域
-
显示当前系统中的默认区域:
firewall-cmd --get-default-zone
-
显示默认区域的所有规则:
firewall-cmd --list-all
-
显示当前正在使用的区域及其对应的网卡接口:
firewall-cmd --get-active-zones
-
设置默认区域:
firewall-cmd --set-default-zone=home firewall-cmd --get-default-zone
服务管理
-
查看默认区域内允许访问的所有服务:
firewall-cmd --list-service
-
添加 HTTP 服务到 public 区域:
firewall-cmd --add-service=http --zone=public
-
查看 public 区域已配置的规则:
firewall-cmd --list-all --zone=public
-
删除 public 区域的 HTTP 服务:
firewall-cmd --remove-service=http --zone=public
-
同时添加 HTTP 和 HTTPS 服务到默认区域,设置成永久生效:
firewall-cmd --add-service=http --add-service=https --permanent firewall-cmd --add-service={http,https,ftp} --zone=internal firewall-cmd --reload # 重新加载防火墙规则 firewall-cmd --list-all # 查看所有规则
说明:使用 --permanent 选项表示设置成永久生效,需要重新启动 firewalld 服务或执行 firewall-cmd --reload 命令重新加载防火墙规则时才会生效。若不带有此选项,表示用于设置运行时规则,这些规则在系统或 firewalld 服务重启、停止时配置将失效。
-
将当前的运行时配置写入规则配置文件中,使之成为永久性配置:
firewall-cmd --runtime-to-permanent
端口管理
-
允许 TCP 的 443 端口到 internal 区域:
firewall-cmd --zone=internal --add-port=443/tcp firewall-cmd --list-all --zone=internal
-
从 internal 区域将 TCP 的 443 端口移除:
firewall-cmd --zone=internal --remove-port=443/tcp
-
允许 UDP 的 2048~2050 端口到默认区域:
firewall-cmd --add-port=2048-2050/udp firewall-cmd --list-all
设置地址转换
-
设置 SNAT:
firewall-cmd --zone=public --direct --passthrough ipv4 -t nat -A POSTROUTING -s 192.168.80.0/24 -j SNAT --to-source 12.0.0.1
-
设置 DNAT:
firewall-cmd --zone=public --direct --passthrough ipv4 -t nat -A PREROUTING -d 12.0.0.1 -p tcp --dport 80 -j DNAT --to-destination 192.168.80.11
配置生效方式(临时和永久)
永久配置后,配置会写入/etc/firewalld/zones/xxx.xml
配置文件中,若没有配置过,会自动生成区域配置文件。
-
运行时配置(会立即生效,但
firewalld
服务重启或重载配置后会失效):firewall-cmd ...
-
将运行时配置转换成永久配置:
firewall-cmd --runtime-to-permanent
-
永久配置(不会立即生效,需要重新加载配置或重启
firewalld
服务):firewall-cmd ... --permanent
-
重新加载防火墙配置:
firewall-cmd --reload # 或 systemctl reload firewalld
富规则
firewalld
支持更加复杂的富规则,可以指定源地址、目标地址、服务名称及操作类型(如接受、拒绝等)进行更精细的控制。
例如:
firewall-cmd --add-rich-rule="rule family='ipv4|ipv6' source address='<源地址>' destination address='<目的地址>' service name='<服务名>' action=<reject|drop|accept...>"
可以定义 IP 协议类型(IPv4 或 IPv6)、来源和目标地址、服务名称以及操作类型(如 reject
、drop
、accept
等)来灵活控制网络流量。