Rich Rules

LinuxBeginner
立即练习

简介

在之前的实验中,你为所有人打开或关闭了「门」(端口)。但如果你只想为朋友打开这扇门,或者专门把它锁上以阻止一个已知的捣乱者,该怎么办?

这正是 Rich Rules 发挥作用的地方。Rich Rules 不仅可以粗略地打开或关闭服务,还能表达更详细的策略,例如匹配源地址、记录日志,或拒绝特定流量。

Rich Rules 很重要,因为真实的防火墙策略通常带有条件。安全决策很少只是简单的「端口开放」或「端口关闭」。

实验环境说明: 为避免你意外断开 Web 终端连接,本实验默认使用 trusted 区域。这意味着除非明确阻止,否则所有流量都会被允许。在真实生产环境中,你会使用限制性更强的区域,例如 public 或 drop。

在本实验中,你将学习如何:

  1. 阻止特定对象: 拒绝来自特定 IP 地址的连接。
  2. 保留记录: 记录连接尝试,以便查看谁曾尝试访问。
  3. 限制访问: 配置规则,只允许来自特定网络的远程控制(SSH)连接。
  4. 审计: 将规则保存到文件中以供检查。

阻止特定 IP

在此步骤中,首先学习如何阻止一个特定的恶意来源。假设你发现地址为 192.168.1.100 的计算机正在尝试入侵你的系统。你希望彻底阻止它。

我们将使用「Rich Rule」完成此操作。虽然默认区域是 trusted(允许所有流量),但针对该 IP 的特定 Reject 规则会优先生效。

Rich Rules 很重要,因为真实的防火墙策略通常带有条件。你可能需要根据源地址、服务、日志记录需求或其他条件采取不同操作,而简单的开放或关闭命令无法很好地表达这些要求。

其语法类似于组织一句话:

rule family="ipv4" source address="192.168.1.100" reject

运行以下命令,永久添加这条规则。

sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.100" reject'

下面拆解这句「话」:

  • rule family="ipv4":表示使用标准 IP 地址。
  • source address="...":表示恶意来源的地址。
  • reject:表示要执行的操作。

Reject 与 Drop 的区别:

  • Reject 更加礼貌:它会告诉发送方「离开,你无权访问」。
  • Drop 更加彻底:它会完全忽略发送方,就像你的计算机不存在一样。

两者的选择不只是风格问题。reject 会向合法客户端更快地反馈结果,也更便于排查问题;drop 向攻击者暴露的信息更少,但可能导致更长的超时时间。

由于使用了 --permanent,这条规则已经保存,但尚未激活。重新加载防火墙以应用它。

sudo firewall-cmd --reload

现在,确认规则已经存在。

sudo firewall-cmd --list-rich-rules

你应该会看到刚刚添加的规则。

记录被丢弃的数据包

在此步骤中,阻止某个对象固然有用,但有时你还希望留下证据。你可以在规则中添加「日志记录」,这就像安装一台安全摄像机,在每次规则被触发时记录事件。

这种将流量过滤与日志记录结合起来的方式,在安全运营中很常见。阻止流量可以保护系统,而日志则会留下证据,便于之后调查。

这次阻止另一个 IP:10.0.0.5。不过,这次我们会在拒绝连接之前先记录这次尝试。

运行以下命令:

sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.0.0.5" log prefix="BLOCKED_IP: " level="info" reject'

这里新增了什么?

  • log:开启日志记录,就像打开摄像机。
  • prefix="BLOCKED_IP: ":写入系统日志时,以这段文本作为行首。之后使用搜索工具查找这些特定事件会非常方便。

应用更改。

sudo firewall-cmd --reload

检查结果。

sudo firewall-cmd --list-rich-rules

现在应该能看到两条规则:第一条是简单的拒绝规则,第二条会记录日志并拒绝连接。

限制服务访问

在此步骤中,考虑经过加固的环境:你会阻止来自所有位置的 SSH 连接,只允许来自受信任网络(例如 VPN)的连接。

教学说明: 为了保持你的连接不中断,本实验使用 trusted 区域,因此这一步只是演示配置。由于当前默认允许所有流量,添加「Allow」规则不会改变实际行为。不过,当你使用 public 或 drop 等限制性区域时,这种语法非常重要。

我们的目标是创建一条规则,表达以下策略:「仅当源地址属于 192.168.0.0/24 时,才允许 SSH。」

这是网络策略中最小权限原则的一个示例。不要向整个互联网公开管理访问权限,而是将其限制在应当合法管理服务器的网络范围内。

首先,移除通用的 SSH 服务。

sudo firewall-cmd --permanent --remove-service=ssh

注意: 你可能会看到类似 Warning: NOT_ENABLED: ssh 的警告。这是正常且预期的。由于默认区域是 trusted(默认允许所有流量,但没有明确启用任何服务),尝试移除未被明确列出的服务时,就会触发这个无害的警告。

然后,为该子网添加特定的 Rich Rule。

sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.0.0/24" service name="ssh" accept'

重新加载防火墙,使这些更改生效。

sudo firewall-cmd --reload

现在进行验证。首先,检查服务列表。

sudo firewall-cmd --list-services

这里不应该再看到 ssh(它已经从通用服务列表中移除)。

接下来,检查 Rich Rules。

sudo firewall-cmd --list-rich-rules

你应该会看到一条规则,允许来自指定源地址的 service name="ssh"。

审计规则

在此步骤中,考虑生产环境中的最佳实践:结束会话前,对防火墙规则进行最终审计并备份。这可以确保规则按正确顺序应用,同时保留一个可用于恢复的文件。

在这一步中,你将把 Rich Rules 导出到文本文件中,以便审计。

首先,列出所有 Rich Rules,并将输出重定向到项目目录下名为 rules_list.txt 的文件中。

sudo firewall-cmd --list-rich-rules > ~/project/rules_list.txt

现在读取该文件,确认内容正确。

cat ~/project/rules_list.txt

你应该会看到本实验中创建的规则列表。现在,这个文件就可以作为 Rich Rules 配置的简单备份。

总结

在本实验中,你使用 Rich Rules 提升了防火墙配置能力。你学习了如何:

  1. 阻止特定 IP(「Reject」规则)。
  2. 记录安全事件(「摄像机」规则)。
  3. 仅允许受信任网络访问 SSH 等敏感服务。
  4. 通过将规则导出到文件来审计配置。

这些高级技术可以为复杂环境提供所需的精确控制,从而提高安全性。