有没有高效且简单的方法使用IP黑名单(像这个(但可能大 2-3 倍,无法简化为 CIDR)来拒绝访问网络服务器(lighttpd 或 Apache)使用标准/用户空间软件(无需重新编译内核)Linux?
据我所知,Deny
Apache 配置中的规则iptables
具有线性查找时间。有一些内核模块可以有效处理大量 IP 列表,但安装这些模块需要修补内核。
答案1
您可以尝试使用莫布洛克(谷歌搜索 - 新用户,暂时无法添加链接)。禁用所有下载的阻止列表,仅使用您生成的本地阻止列表。您可能需要在内核中添加 NFQUEUE(netlink 队列)支持,但它可能默认已经存在。
常规设置是:对于要过滤的端口上的所有 SYN 数据包,使用 netfilter 的 NFQUEUE 操作将它们推送到位于用户空间的 moblock。Moblock 进行有效匹配,并向 netlink 返回 ACCEPT 或 DROP 响应。
moblock 配置文件格式非常简单:在每一行中,给出一个名称和一个 IP 范围,格式为 123.123.123.42-123.123.124.56。当 moblock 加载范围时,它会构建一个有效的数据结构来匹配这些范围。当数据包因匹配而被丢弃时,会记录范围名称和实际源 IP(如果禁用匹配记录,则不会记录)。
我使用 moblock 的默认配置(下载的黑名单)对大约 230000 个 IP 进行了测试范围,并且没有观察到明显的性能下降(不过,仅过滤 SYN 数据包对于降低内核/用户空间流量很重要)。
需要注意的是:如果 moblock 没有运行,我相信 NFQUEUE 的默认操作是 DROP,这会导致您的应用程序拒绝服务。话虽如此,我已经连续运行 moblock 超过 6 个月,没有任何问题。不过,您可能希望设置一个监控探测器,当已知良好的 IP 无法再连接到您服务器上的 :80 时,它会向您发出警报。您绝对不想使用 moblock 来过滤 ssh,除非您已在 netfilter 中明确将一些受信任的 IP 列入白名单以进行恢复。
答案2
据我所知,Apache 配置和 iptables 中的拒绝规则具有线性查找时间。
有点。您可以使用 IPTables 中的链来分解它,即一种简单的方法是为每个 A 类地址块(例如 1.0.0.0/8、2.0.0.0/8 等)建立一个链,并在链中为该块建立规则,从而大大减少查找时间(即最坏情况下约 200 个规则评估才能获得 A 类规则,然后是该块中的许多规则。您还可以使用“iptables -L -v -n”来查看哪些规则集的评估最严格,并将它们移至顶部。还有其他更好的方法可以做到这一点,iptables 文档对此进行了介绍。
答案3
是的,您的系统上应该有一个/etc/hosts.allow
。看一下,它有一些非常简单的示例,甚至可以按服务锁定 IP。
简而言之,在/etc/hosts.allow
:
ALL : ALL : allow
httpd : /etc/hosts.httpd.deny : deny
sshd : /etc/hosts.sshd.deny : deny
答案4
您也可以在 .htaccess 中执行此操作
下面是一个按用户代理阻止的示例,但想法是一样的:http://jetfar.com/trap-content-scraper-spam-harvester-bots-using-honeypot-wordpress-htaccess/
据我所知,Apache 配置和 iptables 中的拒绝规则具有线性查找时间。
在排除这种可能性之前,我会尝试一下,然后做一些测试——影响可能不明显,而且很容易维护。
类似地,您可以尝试将列表添加到 /etc/hosts.deny
如果不先测试两者,我不会假设哪个更快。
干杯/Richy