一、关于

firewalld 是 Linux 系统中一款强大且灵活的动态防火墙管理工具。

它提供了一种更现代化、动态和易于管理的方式来配置防火墙规则。与传统的静态防火墙配置方式相比,firewalld 允许在系统运行时动态地修改和调整规则,而无需重新启动服务或系统。

firewalld 基于区域(zone)的概念来管理网络连接和访问控制。不同的区域具有不同的默认安全级别和规则,例如 public(公共区域,适用于不信任的网络)、internal(内部区域,适用于相对信任的网络)等。用户可以根据网络连接的场景将接口分配到不同的区域。

firewalld 还支持丰富的服务定义和端口配置。用户可以轻松地添加、删除或修改允许的服务和端口。并且,它能够处理复杂的规则,例如基于源地址、目标地址、协议类型等条件的访问控制。

二、区域

在 Linux 的 firewalld 中,“zone”(区域)是一个重要的概念,用于对不同网络环境进行分类和配置不同的防火墙规则。

常见的区域类型包括:

  • public(公共区域):适用于公共网络,例如在咖啡店、机场等公共场所连接的网络。默认规则相对严格,只允许经过授权的服务和连接。
  • trusted(信任区域):此区域中的网络被认为是完全可信的,几乎没有任何限制。
  • home(家庭区域):适用于家庭网络环境,规则较为宽松,但仍有一定的安全限制。
  • internal(内部区域):用于内部网络,比如公司的局域网。
  • dmz(非军事区):用于面向公共网络的服务器,规则介于公共区域和信任区域之间。

每个区域都有其默认的防火墙规则,例如允许或拒绝某些服务、端口和网络连接。您可以根据网络接口连接的网络类型,将其分配到相应的区域。

例如,如果您的服务器有一个连接到公共互联网的接口,通常会将其分配到 public 区域;而如果有一个连接到公司内部网络的接口,可能会将其分配到 internal 区域。

通过配置不同区域的规则,您可以灵活地控制网络访问,确保系统的安全性。比如,在 public 区域中,您可能只允许 ssh 服务和 http 服务,而在 trusted 区域中,则可以允许更多的服务和端口访问。

总之,“zone” 的概念使得 firewalld 能够更好地适应各种复杂的网络环境,并提供了便捷且有效的网络安全管理方式。

三、常用命令

  • 启用和禁用防火墙
systemctl start firewalld
systemctl stop firewalld
  • 查看防火墙状态
systemctl status firewalld
  • 设置默认区域
firewall-cmd --set-default-zone=<zone_name>
  • 查看当前区域
firewall-cmd --get-default-zone
  • 添加服务
firewall-cmd --permanent --add-service=<service_name>
  • 移除服务
firewall-cmd --permanent --remove-service=<service_name>
  • 添加端口
firewall-cmd --permanent --add-port=<port_number>/<protocol>
  • 移除端口
firewall-cmd --permanent --remove-port=<port_number>/<protocol>
  • 允许特定的 IP 访问
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="<IP_address>" accept'
  • 重新加载防火墙配置
firewall-cmd --reload

四、自定义服务

创建服务配置文件

vim /usr/lib/firewalld/services/rabb-test.service

编辑配置如下

<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>rabb-test</short>
  <description>测试防火墙服务</description>
  <port protocol="tcp" port="12345"/>
  <port protocol="tcp" port="54321"/>
</service>

添加自定义服务并重新加载防火墙配置

firewall-cmd --permanent --add-service=rabb-test
firewall-cmd --reload

查看当前防火墙配置信息

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

查看已加载的服务

firewall-cmd --list-services

需要移除的话执行下面的命令

firewall-cmd --remove-service=rabb-test --permanent
firewall-cmd --reload

五、规则配置

5.1 语法规则

rule [family="rule family"]
    [ source [NOT] [address="address"] [mac="mac-address"] [ipset="ipset"] ]
    [ destination [NOT] address="address" ]
    [ element ]
    [ log [prefix="prefix text"] [level="log level"] [limit value="rate/duration"] ]
    [ audit ]
    [ action ]
  • family

可以是 ipv4ipv6,它将规则分别限制为 IPv4IPv6。如果没有提供规则系列,则会为 IPv4IPv6 添加该规则。如果在规则中使用源或目标地址,则需要提供规则系列。

  • source

source address=”address[/mask]”

  • element

只能是以下元素类型之一: service,port,protocol,masquerade,icmp-block,forward-port, 和 source-port

service name=service_name
port port=number_or_range protocol=protocol

  • action

accept|reject|drop|mark

5.1 添加规则

  • 允许特定源 IP 和端口的 TCP 连接
# 这条规则允许来自 192.168.1.10 这个 IP 地址对 8080 端口的 TCP 连接。
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.10" port port="8080" protocol="tcp" accept'
firewall-cmd --reload
  • 拒绝特定源 IP 范围和端口的 UDP 流量
# 此规则拒绝来自 192.168.2.0/24 网段对 53 端口的 UDP 流量此规则拒绝来自 192.168.2.0/24 网段对 53 端口的 UDP 流量。
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.2.0/24" port port="53" protocol="udp" reject'
firewall-cmd --reload
  • 允许特定 MAC 地址的所有流量
# 这条规则允许来自具有 00:11:22:33:44:55 MAC 地址的设备的所有流量。
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source mac="00:11:22:33:44:55" accept'
firewall-cmd --reload
  • 基于接口允许流量
# 该规则允许通过 eth0 接口的流量。
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" interface="eth0" accept'
firewall-cmd --reload
  • 允许特定时间段的访问
# 此规则允许 192.168.1.20 这个 IP 地址在每天的 10:00 到 18:00 之间的访问。
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.20" time start="10:00" end="18:00" accept'
firewall-cmd --reload

5.2 删除规则

要删除之前添加的规则,可以使用 --remove-rich-rule 选项,并指定与添加规则时相同的条件。例如,如果要删除上述第一个允许特定源 IP 和端口的规则,可以使用以下命令:

firewall-cmd --permanent --remove-rich-rule='rule family="ipv4" source address="192.168.1.10" port port="8080" protocol="tcp" accept'
firewall-cmd --reload

5.3 优先级

firewalld 中,规则的优先级通常遵循以下原则:

  1. 直接与数据包匹配的规则具有更高的优先级。例如,如果有一个明确指定了源 IP 地址、端口和协议的规则,它会比更通用的规则(如仅指定区域或服务)先被匹配。
  2. 较新添加的规则可能会优先于旧的规则。但这不是绝对的,具体还取决于规则的具体内容和匹配条件。
  3. 丰富规则(rich rule)通常比一般的区域默认规则具有更高的优先级。
  4. 对于具有相同具体程度和条件的规则,其处理顺序可能是不确定的,具体实现可能因 firewalld 的版本和配置而有所不同。

需要注意的是,确保规则的清晰和准确配置对于实现预期的防火墙行为非常重要。如果存在相互冲突或不明确的规则,可能会导致意外的网络访问结果。

例如,如果您先配置了一个允许所有 IP 访问某个端口的规则,然后又添加了一个拒绝特定 IP 访问该端口的规则,那么拒绝特定 IP 的规则将优先生效。

再比如,您在一个区域中默认允许了 http 服务,然后又添加了一个丰富规则拒绝特定源 IP 对 http 服务的访问,那么针对该特定源 IP 的拒绝规则将优先起作用。

六、其他

6.1 删除防火墙所有配置

要删除 Linux 中 firewalld 的所有配置规则,可以按照以下步骤进行操作:

首先,停止 firewalld 服务:

systemctl stop firewalld

然后,删除 firewalld 的配置文件:

rm -rf /etc/firewalld/

最后,重新启动 firewalld 服务:

systemctl start firewalld

请注意,执行上述操作会完全清除 firewalld 的所有配置,包括您之前自定义的规则和设置。在实际操作前,请确保您真的想要删除所有的配置并且了解这样做可能带来的影响。