一、关于
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
可以是 ipv4
或 ipv6
,它将规则分别限制为 IPv4
或 IPv6
。如果没有提供规则系列,则会为 IPv4
和 IPv6
添加该规则。如果在规则中使用源或目标地址,则需要提供规则系列。
- 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
中,规则的优先级通常遵循以下原则:
- 直接与数据包匹配的规则具有更高的优先级。例如,如果有一个明确指定了源 IP 地址、端口和协议的规则,它会比更通用的规则(如仅指定区域或服务)先被匹配。
- 较新添加的规则可能会优先于旧的规则。但这不是绝对的,具体还取决于规则的具体内容和匹配条件。
- 丰富规则(
rich rule
)通常比一般的区域默认规则具有更高的优先级。 - 对于具有相同具体程度和条件的规则,其处理顺序可能是不确定的,具体实现可能因
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 的所有配置,包括您之前自定义的规则和设置。在实际操作前,请确保您真的想要删除所有的配置并且了解这样做可能带来的影响。