使用大型 IP 黑名单拒绝访问 Web 服务器的最佳方法?

Kor*_*nel 4 linux ip web-server blacklist

是否有有效且简单的方法来使用IP 黑名单比如这个,但可能大 2-3 倍,不能简化为 CIDR)来拒绝使用标准/用户空间访问Web 服务器(lighttpd 或 Apache)Linux上的软件(无内核重新编译)?

DenyApache 配置中的AFAIK规则并iptables具有线性查找时间。有一些内核模块可以有效地处理大量 IP 列表,但是安装这些模块需要对内核进行修补。

小智 9

您可以尝试使用moblock(谷歌它 - 尚无法添加链接,新用户)。禁用所有下载的阻止列表,并仅使用您生成的本地阻止列表。您可能需要向内核添加 NFQUEUE(netlink 队列)支持,但默认情况下它可能已经存在。

一般设置是:对于您要过滤的端口上的所有 SYN 数据包,使用 netfilter 的 NFQUEUE 操作将它们推送到位于用户空间的 moblock。Moblock 进行高效匹配并将 ACCEPT 或 DROP 响应发送回 netlink。

moblock 配置文件格式非常简单:在每一行中,给出名称和 IP 范围,格式为 123.123.123.42-123.123.124.56。当 moblock 加载范围时,它会构建一个有效的数据结构来匹配这些范围。当数据包因匹配而被丢弃时,范围名称和实际源 IP 会被记录(如果禁用匹配记录,则不会记录)。

我已经在其默认配置(下载的阻止列表)中使用了大约 230000 个 IP范围的moblock ,并且没有观察到明显的性能下降(尽管只过滤 SYN 数据包对于保持内核/用户空间流量下降很重要)。

一个警告:如果 moblock 没有运行,我相信 NFQUEUE 的默认操作是 DROP,从而导致您的应用程序拒绝服务。也就是说,我已经让 moblock 连续运行超过 6 个月没有任何问题。不过,您可能希望设置一个监视探测器,以便在已知良好的 IP 无法再连接到服务器上的 :80 时向您发出警报。您绝对不想使用 moblock 来过滤 ssh,除非您已明确将 netfilter 中的一些受信任 IP 列入白名单以进行恢复。