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

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

AFAIK Apacheconfiguration和iptables Deny规则具有线性查找时间。 有一些内核模块可以高效地处理大量的IP列表,但是安装这些模块需要修补内核。

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

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

moblockconfiguration文件格式非常简单:在每一行上,给出一个名称和一个IP范围,格式为123.123.123.42-123.123.124.56。 当moblock加载范围,它build立一个有效的数据结构来匹配这些范围。 当数据包由于匹配而丢失时,将logging范围名称和实际源IP(如果禁用了匹配logging,则不logging)。

我已经使用默认configuration(下载阻止列表)的moblock与约230000 IP 范围 ,并没有观察到明显的性能影响(只过滤的SYN数据包是重要的,以保持内核/用户空间stream量尽pipe)。

一个警告:如果moblock没有运行,我认为NFQUEUE的默认操作是DROP,导致应用程序拒绝服务。 也就是说,我已经连续运行6个月以上,没有任何问题。 不过,您可能需要设置一个监控探针,以便在已知良好的IP无法再连接到服务器上的情况下提醒您。 你绝对不希望使用moblock来过滤ssh,除非你明确地把netfilter中的一些可信的IP列入白名单来恢复。

AFAIK Apacheconfiguration和iptables中的拒绝规则具有线性查找时间。

有点。 你可以在IPTables中使用链来分解它,也就是说,一个简单的方法是为每个A类的地址块(例如1.0.0.0/8,2.0.0.0/8等)提供一个链,在链中的块,大大减less了查找时间(即最坏的情况〜200规则评估,以获得A类规则,然后在该块内的规则,但也可以使用“iptables -L -v -n”哪些规则集正在被最严重的评估,并将它们移到最顶端,还有其他更好的方法可以做到这一点,iptables文档覆盖了这一点。

是的,在你的系统上,应该有一个/etc/hosts.allow 。 看看,它有一些非常简单的例子,即使在每个服务的基础上lockingIP。

简而言之,在/etc/hosts.allow

 ALL : ALL : allow httpd : /etc/hosts.httpd.deny : deny sshd : /etc/hosts.sshd.deny : deny 

我想如果不修改你的内核,你是无法做到的。

ipset似乎是一个很好的解决scheme。

从其网页引用:

如果你想

  • 存储多个IP地址或端口号,并通过iptables一次性匹配收集;
  • 根据IP地址或端口dynamic更新iptables规则,而不会影响性能;
  • 用一个iptables规则表示复杂的IP地址和基于端口的规则集,并受益于IP集的速度

那么ipset可能是适合你的工具。

你也可以在.htaccess中完成

这是一个用useragent来阻止的例子,但是这个想法是一样的: http : //jetfar.com/trap-content-scraper-spam-harvester-bots-using-honeypot-wordpress-htaccess/

AFAIK Apacheconfiguration和iptables中的拒绝规则具有线性查找时间。

我会尝试一下,然后做一些testing,然后再排除这种情况 – 影响可能不明显,维护起来也很容易。

同样,你可以尝试将列表添加到/etc/hosts.deny

如果不先testing,我不会假设哪个更快。

干杯/ Richy