Skip to content

防火墙-firewalld

Firewalld 是 CentOS 7 及更高版本、RHEL、Fedora 等许多现代 Linux 发行版中默认的动态防火墙管理工具。它通过“区域”和“服务”等概念简化了防火墙规则的配置,下面我将为你详细解读。

核心概念

  1. 动态防火墙:Firewalld 的最大特点是支持动态更新规则而无需重启服务或断开现有连接,这对于需要频繁调整规则的服务器环境非常友好。

  2. 区域 (Zone):Firewalld 使用区域来定义网络连接的信任级别,每个区域有一套预定义的规则(允许的服务、端口等)。

  3. 服务 (Service):一个服务是预定义的一组端口和协议的组合(例如 ssh 服务对应 TCP 端口 22)。使用服务名来管理规则比直接记端口更直观,也便于批量管理。这些预定义的服务文件通常存放在 /usr/lib/firewalld/services/ 目录下,用户自定义的服务可以放在 /etc/firewalld/services/ 目录下。

  4. 运行时与永久配置

    • 运行时配置:立即生效,但防火墙服务重启后会丢失。
    • 永久配置:使用 --permanent 选项,配置会写入文件,但需重载防火墙 (firewall-cmd --reload) 或重启服务后才能生效。生产环境中,通常先测试运行时配置,确认无误后使用 --runtime-to-permanent 命令或 --permanent 选项直接保存为永久配置。

Firewalld 与 Iptables 的区别

特性IptablesFirewalld
配置方式基于接口基于区域,更接近硬件防火墙的概念
配置存储/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 会按照以下优先级顺序决定将其划入哪个区域并应用相应规则:

  1. 源地址(Source Address):如果数据包的源IP地址已经通过命令(如 firewall-cmd --add-source=)明确绑定到了某个特定区域,则优先使用该区域。
  2. 入站接口(Incoming Interface):如果源地址未绑定,则检查数据包是从哪个网络接口进来的。如果该接口(如 eth0)通过命令(如 firewall-cmd --add-interface=)绑定到了某个区域,则使用该区域。
  3. 默认区域(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, sshfirewall-cmd --add-service=http --zone=public
--remove-service=<service>移除指定区域允许的服务firewall-cmd --remove-service=http --zone=public
--add-port=<port>/<protocol>为指定区域添加允许的端口(如 80/tcpfirewall-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

核心概念

  1. 区域(Zones): firewalld 使用区域定义网络流量的信任级别,每个区域包含一组预定义的规则。常见区域包括:
    • trusted:允许所有流量。
    • public:默认区域,仅允许 SSH 和 DHCPv6 等必要服务。
    • home:允许 SSH、Samba 等家庭网络服务。
    • internal:类似 home 区域,用于内部网络。
    • block:拒绝所有传入流量(返回错误响应)。
    • drop:丢弃所有传入流量(无响应)。
  2. 服务(Services): 预定义的服务(如 http, ssh, ftp)包含端口、协议和可选规则,简化配置。服务配置文件存储在 /usr/lib/firewalld/services/(系统默认)和 /etc/firewalld/services/(自定义)。
  3. 运行时与永久配置
    • 运行时配置:临时生效,重启后丢失。
    • 永久配置:使用 --permanent 选项保存到配置文件,需通过 --reload 重载或重启服务生效。

经典案例

bash
# 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 # 禁用

注意事项

  1. 与 iptables 的关系: firewalld 使用 iptables 或 nftables 作为后端,但提供更高层次的抽象管理。两者不是替代关系,firewalld 更适用于动态和简化管理,而 iptables 适合高度自定义的低级控制。

  2. 规则优先级: 流量匹配顺序:源地址绑定的区域 > 接口绑定的区域 > 默认区域。确保规则顺序符合预期。

  3. 永久规则生效: 使用 --permanent 选项后必须执行 firewall-cmd --reload 或重启 firewalld 服务才能使规则生效。临时规则无需重载但重启后丢失。

  4. 区域配置: 未绑定特定区域接口或源地址的流量使用默认区域规则。修改默认区域前需确保不会意外阻断管理连接(如 SSH)。

  5. SELinux 集成: firewalld 可与 SELinux 协同工作。若服务使用非标准端口(如 HTTP 使用 8080),需额外配置 SELinux 端口标签:

    sudo semanage port -a -t http_port_t -p tcp 8080
  6. 故障排查

    • 使用 journalctl -xe | grep -i firewall 查看拒绝记录。
    • 通过 firewall-cmd --list-all-zones 检查所有区域配置。
    • 重置规则:firewall-cmd --reset-to-defaults(谨慎使用)。
  7. 备份配置: 自定义配置(如区域、服务)存储在 /etc/firewalld/ 目录,建议定期备份以避免意外丢失。

firewalld 通过简化的区域和服务管理降低了防火墙配置复杂度,适合大多数现代 Linux 环境。对于需要精细控制的高级用户,可结合直接规则(--direct 选项)或自定义 iptables 规则使用。