防火墙-firewalld
Firewalld 是 CentOS 7 及更高版本、RHEL、Fedora 等许多现代 Linux 发行版中默认的动态防火墙管理工具。它通过“区域”和“服务”等概念简化了防火墙规则的配置,下面我将为你详细解读。
核心概念
动态防火墙:Firewalld 的最大特点是支持动态更新规则而无需重启服务或断开现有连接,这对于需要频繁调整规则的服务器环境非常友好。
区域 (Zone):Firewalld 使用区域来定义网络连接的信任级别,每个区域有一套预定义的规则(允许的服务、端口等)。
服务 (Service):一个服务是预定义的一组端口和协议的组合(例如
ssh服务对应 TCP 端口 22)。使用服务名来管理规则比直接记端口更直观,也便于批量管理。这些预定义的服务文件通常存放在/usr/lib/firewalld/services/目录下,用户自定义的服务可以放在/etc/firewalld/services/目录下。运行时与永久配置:
- 运行时配置:立即生效,但防火墙服务重启后会丢失。
- 永久配置:使用
--permanent选项,配置会写入文件,但需重载防火墙 (firewall-cmd --reload) 或重启服务后才能生效。生产环境中,通常先测试运行时配置,确认无误后使用--runtime-to-permanent命令或--permanent选项直接保存为永久配置。
Firewalld 与 Iptables 的区别
| 特性 | Iptables | Firewalld |
|---|---|---|
| 配置方式 | 基于接口 | 基于区域,更接近硬件防火墙的概念 |
| 配置存储 | /etc/sysconfig/iptables | /etc/firewalld/ 和 /usr/lib/firewalld/ 的 XML 文件 |
| 规则更新 | 每次修改需完全重载所有规则 | 动态更新,仅应用变更,不断开现有连接 |
| 防火墙类型 | 静态防火墙 | 动态防火墙 |
firewalld - 区域
firewalld防火墙为了简化管理,将所有网络流量分为多个区域(zone)。然后根据数据包的源IP地址或传入的网络接口等条件将流量传入相应区域。每个区域都定义了自己打开或者关闭的端口和服务列表。
| 区域名称 | 信任级别 | 核心规则说明 | 典型适用场景 |
|---|---|---|---|
| 信任区域 (trusted) | 最高 | 允许所有传入和传出的流量,无任何限制。 | 封闭的测试环境、绝对安全的内部网络。 |
| 家庭区域 (home) | 高 | 拒绝传入流量,除非与传出流量相关;允许 SSH、文件共享(samba-client)等家庭常用服务。 | 家庭网络,信任局域网内的其他设备(如PC、打印机)。 |
| 内部区域 (internal) | 高 | 默认规则与home区域相同。信任内部网络。 | 企业内部局域网。 |
| 工作区域 (work) | 高 | 拒绝传入流量,除非与传出流量相关;允许 SSH、IPP打印服务(ipp-client)等办公服务。 | 办公网络,信任同事的设备。 |
| 公共区域 (public) | 低 (默认) | 默认区域。拒绝传入流量,除非与传出流量相关;仅允许 SSH 和 DHCPv6-client。 | 公共Wi-Fi(咖啡馆、机场)、不信任的网络环境。 |
| 外部区域 (external) | 低 | 拒绝传入流量,除非与传出流量相关;允许 SSH。默认会启用IPv4伪装(Masquerade),常用于NAT。 | 网关服务器、路由器,为内部网络提供NAT转发。 |
| 隔离区域 (dmz) | 中 | 拒绝传入流量,除非与传出流量相关;允许 SSH。 | 托管面向公众的服务(如Web、邮件服务器),与内网隔离。 |
| 阻塞区域 (block) | 极低 | 拒绝所有传入流量,但会以icmp-host-prohibited消息回应。 | 需要严格隔离的敏感设备。 |
| 丢弃区域 (drop) | 最低 | 丢弃所有传入流量,不进行任何回应。 | 防止任何探测和响应的服务器,最大化安全但可能影响正常连接。 |
区域优先级与数据处理流程
当数据包到达时,firewalld 会按照以下优先级顺序决定将其划入哪个区域并应用相应规则:
- 源地址(Source Address):如果数据包的源IP地址已经通过命令(如
firewall-cmd --add-source=)明确绑定到了某个特定区域,则优先使用该区域。 - 入站接口(Incoming Interface):如果源地址未绑定,则检查数据包是从哪个网络接口进来的。如果该接口(如
eth0)通过命令(如firewall-cmd --add-interface=)绑定到了某个区域,则使用该区域。 - 默认区域(Default Zone):如果上述两者都未绑定,则最终应用默认区域(通常是
public)的规则。
常用区域管理命令
掌握以下命令可以帮助你有效管理区域:
- 查看当前默认区域:
firewall-cmd --get-default-zone - 设置默认区域(如设置为 work):
firewall-cmd --set-default-zone=work(此命令通常会自动永久生效) - 查看所有活跃区域及绑定的接口:
firewall-cmd --get-active-zones - 将源IP(如192.168.1.10)绑定到特定区域(如 trusted):
firewall-cmd --zone=trusted --add-source=192.168.1.10 - 将网络接口(如ens33)绑定到特定区域(如 work):
firewall-cmd --zone=work --add-interface=ens33 - 查看指定区域(如public)的所有配置:
firewall-cmd --zone=public --list-all
firewalld - 命令
firewalld 是 Linux 系统中一种基于区域的动态防火墙管理工具,旨在简化防火墙配置和管理。它通过预定义的服务和区域概念,提供更直观的规则管理方式,支持动态更新规则而无需重启服务,广泛应用于 RHEL、CentOS、Fedora 等现代 Linux 发行版。
语法格式
firewall-cmd [--zone=<zone>] [--permanent] <command> [<options>]选项
| 选项 | 描述 | 示例 |
|---|---|---|
--zone=<zone> | 指定要操作的区域(如 public, home, internal),默认为默认区域 | firewall-cmd --zone=public --list-all |
--permanent | 设置永久规则(需重启或重载后生效) | firewall-cmd --add-service=http --permanent |
--get-default-zone | 显示当前默认区域 | firewall-cmd --get-default-zone |
--set-default-zone=<zone> | 设置默认区域 | firewall-cmd --set-default-zone=home |
--get-active-zones | 显示当前活跃的区域及其绑定的接口或源地址 | firewall-cmd --get-active-zones |
--list-all [--zone=<zone>] | 显示指定区域的所有规则(包括服务、端口等) | firewall-cmd --list-all --zone=public |
--add-service=<service> | 为指定区域添加允许的服务(如 http, ssh) | firewall-cmd --add-service=http --zone=public |
--remove-service=<service> | 移除指定区域允许的服务 | firewall-cmd --remove-service=http --zone=public |
--add-port=<port>/<protocol> | 为指定区域添加允许的端口(如 80/tcp) | firewall-cmd --add-port=8080/tcp --zone=public |
--remove-port=<port>/<protocol> | 移除指定区域允许的端口 | firewall-cmd --remove-port=8080/tcp --zone=public |
--add-source=<source[/mask]> | 为指定区域绑定源 IP 地址或网段 | firewall-cmd --add-source=192.168.1.0/24 --zone=trusted |
--remove-source=<source[/mask]> | 移除指定区域绑定的源地址 | firewall-cmd --remove-source=192.168.1.0/24 --zone=trusted |
--add-rich-rule=<rule> | 添加富规则(支持复杂条件,如源 IP、端口组合) | firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.1.10" port port="80" protocol="tcp" accept' |
--remove-rich-rule=<rule> | 移除富规则 | firewall-cmd --remove-rich-rule='rule family="ipv4" source address="192.168.1.10" port port="80" protocol="tcp" accept' |
--reload | 重载配置(使永久规则立即生效) | firewall-cmd --reload |
--panic-on | 启用应急模式(拒绝所有流量) | firewall-cmd --panic-on |
--panic-off | 关闭应急模式 | firewall-cmd --panic-off |
核心概念
- 区域(Zones): firewalld 使用区域定义网络流量的信任级别,每个区域包含一组预定义的规则。常见区域包括:
trusted:允许所有流量。public:默认区域,仅允许 SSH 和 DHCPv6 等必要服务。home:允许 SSH、Samba 等家庭网络服务。internal:类似 home 区域,用于内部网络。block:拒绝所有传入流量(返回错误响应)。drop:丢弃所有传入流量(无响应)。
- 服务(Services): 预定义的服务(如
http,ssh,ftp)包含端口、协议和可选规则,简化配置。服务配置文件存储在/usr/lib/firewalld/services/(系统默认)和/etc/firewalld/services/(自定义)。 - 运行时与永久配置:
- 运行时配置:临时生效,重启后丢失。
- 永久配置:使用
--permanent选项保存到配置文件,需通过--reload重载或重启服务生效。
经典案例
# 1. 启动并启用 firewalld
sudo systemctl start firewalld
sudo systemctl enable firewalld
# 2. 查看当前默认区域和规则
firewall-cmd --get-default-zone
firewall-cmd --list-all
# 3. 允许 HTTP 服务(临时规则)
firewall-cmd --add-service=http
# 4. 永久开放 HTTPS 服务并重载
firewall-cmd --add-service=https --permanent
firewall-cmd --reload
# 5. 开放 TCP 端口 8080(永久)
firewall-cmd --add-port=8080/tcp --permanent
firewall-cmd --reload
# 6. 限制 SSH 访问仅允许特定网段(192.168.1.0/24)
firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" service name="ssh" accept' --permanent
firewall-cmd --reload
# 7. 端口转发(将 80 端口流量转发到 8080 端口)
firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080 --permanent
firewall-cmd --reload
# 8. 启用 IP 伪装(NAT)
firewall-cmd --zone=external --add-masquerade --permanent
firewall-cmd --reload
# 9. 添加自定义区域并绑定接口
firewall-cmd --permanent --new-zone=myzone
firewall-cmd --zone=myzone --add-interface=eth0 --permanent
firewall-cmd --reload
# 10. 应急模式操作(拒绝所有流量)
firewall-cmd --panic-on # 启用
firewall-cmd --panic-off # 禁用注意事项
与 iptables 的关系: firewalld 使用 iptables 或 nftables 作为后端,但提供更高层次的抽象管理。两者不是替代关系,firewalld 更适用于动态和简化管理,而 iptables 适合高度自定义的低级控制。
规则优先级: 流量匹配顺序:源地址绑定的区域 > 接口绑定的区域 > 默认区域。确保规则顺序符合预期。
永久规则生效: 使用
--permanent选项后必须执行firewall-cmd --reload或重启 firewalld 服务才能使规则生效。临时规则无需重载但重启后丢失。区域配置: 未绑定特定区域接口或源地址的流量使用默认区域规则。修改默认区域前需确保不会意外阻断管理连接(如 SSH)。
SELinux 集成: firewalld 可与 SELinux 协同工作。若服务使用非标准端口(如 HTTP 使用 8080),需额外配置 SELinux 端口标签:
sudo semanage port -a -t http_port_t -p tcp 8080故障排查:
- 使用
journalctl -xe | grep -i firewall查看拒绝记录。 - 通过
firewall-cmd --list-all-zones检查所有区域配置。 - 重置规则:
firewall-cmd --reset-to-defaults(谨慎使用)。
- 使用
备份配置: 自定义配置(如区域、服务)存储在
/etc/firewalld/目录,建议定期备份以避免意外丢失。
firewalld 通过简化的区域和服务管理降低了防火墙配置复杂度,适合大多数现代 Linux 环境。对于需要精细控制的高级用户,可结合直接规则(
--direct选项)或自定义 iptables 规则使用。
