是否可以在 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'
修改为:
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="my133t.org" drop'
我收到错误:
Error: INVALID_ADDR: my133t.org
答案1
手册页防火墙命令讲述事实:
源地址或地址范围可以是 IP 地址或带有 IPv4 或 IPv6 掩码的网络 IP 地址,也可以是 MAC 地址或带有 ipset: 前缀的 ipset。对于 IPv4,掩码可以是网络掩码或纯数字。对于 IPv6,掩码是纯数字。不支持使用主机名。
这是有原因的。firewalld 是一个数据包过滤器。它将数据包与它所拥有的规则进行比较。IP 数据包既有源 IP 地址,也有目标 IP 地址,但没有主机名。因此,使用主机作为标准需要从其他来源收集更多信息,即域名系统DNS。这种实现方式容易受到拒绝服务攻击,因为它很容易让您的服务器在尝试过滤数据包时生成新的流量。
此外,虽然通过查询 DNS 中的记录可以轻松将主机名转换为 IP 地址A
,但检测 IP 地址的所有主机名并不那么简单。当然,IP 可以有反向PTR
记录,但这不是强制性的,也不值得信赖。
例如一些统一威胁管理具有内容过滤器的 (UTM) 解决方案会根据禁止的主机名阻止 HTTPS 流量,而不会加密 TLS 流量。这意味着它无法使用 URL,因为 HTTP 请求及其Host:
标头已加密:它只能看到 IP 地址,就像您的防火墙一样。它不会过滤内容,而是使用该主机名的预取 IP 地址列表阻止到该 IP 地址的所有 HTTPS 流量。这正是您必须做的。
如果您确实想使用主机名,则首先需要查询 IP 地址。假设您想阻止员工serverfault.com
在宝贵的工作时间上网。
dig +short serverfault.com
- 阻止那些目的地IP 地址。
- 从删除过时的规则开始,定期重复此操作。