使用 firewalld / firewalld.richlanguage 拒绝主机(不是 ip)

1 linux firewalld centos7

是否可以在 linux firewalld 中添加规则来拒绝整个主机(不是 ip 或 ip 范围)?

例如,我希望拒绝来自 my133y.org 的所有连接。

使用防火墙丰富的语言我可以删除 ip,但手册页中没有提供主机拒绝。

拒绝ip的例子

firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.100.4/24" drop'
Run Code Online (Sandbox Code Playgroud)

当修改为:

firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="my133t.org" drop'
Run Code Online (Sandbox Code Playgroud)

我得到了错误:

Error: INVALID_ADDR: my133t.org
Run Code Online (Sandbox Code Playgroud)

Esa*_*nen 6

firewall-cmd的手册页说明了事实:

源地址或地址范围是带有 IPv4 或 IPv6 掩码的 IP 地址或网络 IP 地址,或带有 ipset: 前缀的 MAC 地址或 ipset。对于 IPv4,掩码可以是网络掩码或普通数字。对于 IPv6,掩码是一个普通数字。不支持使用主机名。

这是有充分理由的。firewalld 是一个数据包过滤器。它将数据包与其拥有的规则进行比较。IP 数据包具有源 IP 地址和目标 IP 地址,但没有主机名。因此,使用主机作为标准需要从其他来源(即域名系统DNS)收集附加信息。这种实现很容易受到拒绝服务攻击,因为在尝试过滤数据包时很容易使您的服务器产生新的流量。

此外,虽然通过查询ADNS 中的记录可以轻松地将主机名转换为 IP 地址,但检测 IP 地址的所有主机名并不是那么简单。当然,IP 可以有反向PTR记录,但这不是强制性的,也不值得信赖。

例如,一些带有内容过滤器的统一威胁管理(UTM) 解决方案会根据禁止的主机名阻止 HTTPS 流量,而不加密 TLS 流量。这意味着它不能使用 URL,因为 HTTP 请求及其Host:标头是加密的:它只能看到 IP 地址,就像您的防火墙一样。它不会过滤内容,而是使用该主机名的预取 IP 地址列表来阻止所有到该 IP 地址的 HTTPS 流量。这正是你必须做的。

如果您真的想使用主机名,则需要首先查询 IP 地址。假设您想阻止您的员工serverfault.com在他们宝贵的工作时间上网。

  1. dig +short serverfault.com
  2. 阻止这些目标IP 地址。
  3. 从删除过时的规则开始,定期重复此操作。