Firewalld 概述与 iptables 对比

Firewalld 概述

Firewalld 是 CentOS 7 及更高版本中默认的防火墙管理工具,它取代了传统的 iptables 防火墙。Firewalld 旨在提供一种更加动态和易于管理的防火墙解决方案,特别是在处理网络区域和接口安全等级方面。它工作在网络层,利用 Linux 内核的 netfilter 子系统来实现包过滤功能。
主要特点

  • 基于区域的管理:Firewalld 引入了网络区域的概念,允许管理员根据网络连接的信任程度来定义不同的安全策略。例如,家庭网络、工作网络和公共网络可以分别配置不同的防火墙规则。
  • 支持 IPv4 和 IPv6:Firewalld 同时支持 IPv4 和 IPv6 协议的防火墙设置。
  • 动态防火墙:Firewalld 允许在不中断现有连接的情况下更改防火墙规则,这对于需要高可用性的生产环境尤为重要。
  • 运行时与永久配置:Firewalld 支持两种配置模式:运行时配置(即时生效,重启后失效)和永久配置(需要重载或重启 firewalld 服务后生效)。
  • 丰富的配置接口:除了命令行工具,Firewalld 还提供了图形界面(如 firewall-config)和 D-Bus 接口,便于用户和管理员进行配置。

Firewalld 与 iptables 的区别

  1. 管理策略

    • iptables:基于接口和规则链来管理防火墙,需要手动定义每一条规则,并决定其处理逻辑(如接受、拒绝或丢弃)。
    • firewalld:基于区域的概念来管理防火墙,通过定义不同区域的安全策略来简化配置过程。
  2. 配置存储

    • iptables:配置通常存储在 /etc/sysconfig/iptables 文件中(尽管这取决于发行版和配置方式),修改后需要重新加载或重启 iptables 服务。
    • firewalld:配置存储在 /etc/firewalld/(用户自定义配置)和 /usr/lib/firewalld/(默认配置)目录下的 XML 文件中,支持运行时和永久配置。
  3. 规则更新

    • iptables:每次修改规则时,都需要重新加载所有规则,这可能会导致短暂的连接中断。
    • firewalld:支持在不中断现有连接的情况下更新规则,因为它只应用更改的部分,而不是重新加载所有规则。
  4. 防火墙类型

    • iptables:通常被视为静态防火墙,因为规则一旦设置,除非手动更改,否则不会改变。
    • firewalld:动态防火墙,支持在运行时更改配置,同时保持现有连接的稳定性。
  5. 易用性和灵活性

    • iptables:虽然功能强大,但配置相对复杂,需要管理员具备较高的网络和安全知识。
    • firewalld:提供了更直观和易于管理的界面,降低了配置难度,同时保持了高度的灵活性。

Firewalld 区域的概念与数据处理流程

Firewalld 区域的概念

Firewalld 防火墙为了简化管理和提高灵活性,引入了区域(zone)的概念。区域是一组预定义的防火墙规则集,用于决定如何处理通过特定网络接口或源自特定IP地址的数据包。Firewalld 防火墙将所有网络流量分配到不同的区域中,每个区域根据其安全级别和应用场景,定义了允许或拒绝的服务和端口列表。
Firewalld 防火墙预定义了九个区域,每个区域都有其特定的用途和默认规则:

  1. trusted(信任区域):允许所有的传入流量,不进行任何限制。
  2. public(公共区域):默认用于新添加的网络接口,允许SSH和DHCPv6客户端的流量,其余均拒绝。
  3. external(外部区域):类似于公共区域,但增加了对传出流量的地址伪装功能,适用于路由器外部网络。
  4. home(家庭区域):允许SSH、mDNS、Samba客户端和DHCPv6客户端的流量,其余均拒绝。
  5. internal(内部区域):默认规则与家庭区域相同,适用于受信任的内部网络。
  6. work(工作区域):允许SSH和DHCPv6客户端的流量,其余均拒绝,适用于工作环境。
  7. dmz(隔离区域/非军事区域):仅允许SSH流量,适用于需要较高安全隔离的环境。
  8. block(限制区域):拒绝所有传入流量,但会发送ICMP错误响应。
  9. drop(丢弃区域):丢弃所有传入流量,不发送任何响应,适用于需要极高隐蔽性的场景。

最终一个区域的安全程度是取决于管理员在此区域中设置的规则。
区域如同进入主机的安全门,每个区域都具有不同限制程度的规则,只会允许符合规则的流量传入。
可以根据网络规模,使用一个或多个区域,但是任何一个 活跃区域 至少需要关联 源地址或接口。
默认情况下,public区域是默认区域,包含所有接口(网卡)。

Firewalld 数据处理流程

对于进入系统的数据包,Firewalld 会根据以下步骤进行处理:

  1. 检查源地址:首先,Firewalld 会检查数据包的源IP地址。如果源地址已经关联到特定的区域(即源地址或接口已明确绑定到某个区域),则直接应用该区域的规则。

  2. 检查网络接口:如果源地址未关联到特定的区域,Firewalld 会接着检查数据包传入的网络接口。如果网络接口已绑定到某个区域,则应用该区域的规则。

  3. 使用默认区域:如果源地址和网络接口都未关联到特定的区域,Firewalld 将使用默认区域(默认情况下为public区域)的规则来处理数据包。

这一流程确保了无论数据包来自何处,Firewalld 都能根据相应的规则集进行处理,从而提供灵活且强大的网络保护。管理员可以根据实际需求和网络环境,配置和调整区域及其规则,以实现最佳的安全策略。

Firewalld 防火墙配置方法

一、配置方式

  1. 使用 firewall-cmd 命令行工具
    • 通过命令行接口直接管理和配置 firewalld。
  2. 使用 firewall-config 图形工具
    • 通过图形用户界面(GUI)进行配置,适合不熟悉命令行的用户。
  3. 编写 /etc/firewalld/ 中的配置文件
    • 直接编辑 firewalld 的配置文件,这种方式适合需要批量配置或自动化配置的场景。

二、启动 firewalld 服务

systemctl start firewalld.service

三、常用的 firewall-cmd 命令选项

1. 查询与设置默认区域

  • 查询当前默认区域:

    firewall-cmd --get-default-zone
    
  • 设置默认区域:

    firewall-cmd --set-default-zone=<zone>
    

2. 查看区域信息

  • 查看当前正在使用的区域及其对应的网卡接口:

    firewall-cmd --get-active-zones
    
  • 显示所有可用的区域:

    firewall-cmd --get-zones
    
  • 查看指定接口绑定的区域:

    firewall-cmd --get-zone-of-interface=<interface>
    

3. 管理接口与区域绑定

  • 为指定接口绑定区域:

    firewall-cmd --zone=<zone> --add-interface=<interface>
    
  • 更改指定区域绑定的网络接口:

    firewall-cmd --zone=<zone> --change-interface=<interface>
    
  • 删除指定区域绑定的网络接口:

    firewall-cmd --zone=<zone> --remove-interface=<interface>
    

4. 管理源地址与区域绑定

  • 为指定源地址绑定区域:

    firewall-cmd --zone=<zone> --add-source=<source>[/<mask>]
    
  • 更改指定的区域绑定的源地址:

    firewall-cmd --zone=<zone> --change-source=<source>[/<mask>]
    
  • 删除指定的区域绑定的源地址:

    firewall-cmd --zone=<zone> --remove-source=<source>[/<mask>]
    

5. 查看与设置区域规则

  • 显示所有区域及其规则:

    firewall-cmd --list-all-zones
    
  • 显示指定区域的所有规则:

    firewall-cmd --zone=<zone> --list-all
    
  • 显示指定区域内允许访问的所有服务:

    firewall-cmd --zone=<zone> --list-services
    
  • 为指定区域设置允许访问的某项服务:

    firewall-cmd --zone=<zone> --add-service=<service>
    
  • 删除指定区域已设置的允许访问的某项服务:

    firewall-cmd --zone=<zone> --remove-service=<service>
    
  • 显示指定区域内允许访问的所有端口号:

    firewall-cmd --zone=<zone> --list-ports
    
  • 为指定区域设置允许访问的某个/某段端口号(包括协议名):

    firewall-cmd --zone=<zone> --add-port=<portid>[-<portid>]/<protocol>
    
  • 删除指定区域已设置的允许访问的端口号(包括协议名):

    firewall-cmd --zone=<zone> --remove-port=<portid>[-<portid>]/<protocol>
    
  • 显示指定区域内拒绝访问的所有 ICMP 类型:

    firewall-cmd --zone=<zone> --list-icmp-blocks
    
  • 为指定区域设置拒绝访问的某项 ICMP 类型:

    firewall-cmd --zone=<zone> --add-icmp-block=<icmptype>
    
  • 删除指定区域已设置的拒绝访问的某项 ICMP 类型:

    firewall-cmd --zone=<zone> --remove-icmp-block=<icmptype>
    
  • 显示所有 ICMP 类型:

    firewall-cmd --get-icmptypes
    

以上命令中的 <zone>, <interface>, <source>, <mask>, <service>, <portid>, <protocol>, 和 <icmptype> 均为占位符,实际使用时需替换为具体值。

Firewalld 管理

Firewalld 区域管理

1. 显示当前系统中的默认区域

firewall-cmd --get-default-zone

2. 显示默认区域的所有规则**

firewall-cmd --list-all

注意:这里未指定 --zone 参数,因此默认显示默认区域的规则。

3. 显示当前正在使用的区域及其对应的网卡接口

firewall-cmd --get-active-zones

4. 设置默认区域

firewall-cmd --set-default-zone=home
firewall-cmd --get-default-zone  # 验证设置是否成功

Firewalld 服务管理

1. 查看默认区域内允许访问的所有服务

firewall-cmd --list-services

注意:同样未指定 --zone,默认为默认区域。

2. 添加 httpd 服务到 public 区域

firewall-cmd --add-service=http --zone=public
firewall-cmd --reload  # 使更改生效

3. 查看 public 区域已配置规则

firewall-cmd --list-all --zone=public

4. 删除 public 区域的 httpd 服务

firewall-cmd --remove-service=http --zone=public
firewall-cmd --reload  # 使更改生效

5. 同时添加 httpd、https 服务到默认区域,并设置成永久生效

firewall-cmd --permanent --add-service=http --add-service=https
firewall-cmd --zone=internal --permanent --add-service={http,https,ftp}  # 假设你想在internal区域也添加
firewall-cmd --reload  # 使更改生效
firewall-cmd --list-all  # 查看默认区域配置
firewall-cmd --list-all --zone=internal  # 查看internal区域配置

Firewalld 端口管理

1. 允许 TCP 的 443 端口到 internal 区域

firewall-cmd --zone=internal --add-port=443/tcp
firewall-cmd --reload  # 使更改生效
firewall-cmd --list-all --zone=internal

2. 从 internal 区域将 TCP 的 443 端口移除

firewall-cmd --zone=internal --remove-port=443/tcp
firewall-cmd --reload  # 使更改生效

3. 允许 UDP 的 2048~2050 端口到默认区域

firewall-cmd --add-port=2048-2050/udp
firewall-cmd --reload  # 使更改生效
firewall-cmd --list-all

补充:设置地址转换

注意:以下命令使用 --direct --passthrough 绕过 Firewalld 的规则处理,直接操作 iptables 规则。这通常用于高级配置。

1. 设置 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
firewall-cmd --reload  # 更改可能需要重新加载

2. 设置 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
firewall-cmd --reload  # 更改需要重新加载

注意

  • --permanent 选项用于设置永久规则,但更改不会立即生效,需要执行 firewall-cmd --reload 或重启 Firewalld 服务。
  • --runtime-to-permanent 命令通常不单独使用,因为它旨在将当前运行时配置写入永久配置,但在实际操作中,你通常会直接通过 --permanent 选项设置永久规则。
  • 地址转换(NAT)的设置可能需要额外的防火墙规则来确保流量能够正确通过,这取决于你的具体网络配置和安全需求。
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐