是否有有效和容易的方法使用IP黑名单(就像这个,但可能大2-3倍,不能简化为CIDR),以拒绝使用标准/用户空间软件(没有内核重新编译)访问web服务器(或者是lighttpd或Apache)?
Apache中的AFAIK Deny规则和iptables具有线性查找时间。有些内核模块可以有效地处理大型IP列表,但是安装这些模块需要对内核进行修补。
发布于 2009-05-30 23:59:34
你可以尝试使用模块 (google还不能添加链接,新用户)。禁用所有下载的区块列表,并仅使用您生成的本地封锁列表。您可能需要将NFQUEUE (netlink queue)支持添加到内核中,但默认情况下它可能已经存在了。
一般的设置是:对于您想要过滤的端口上的所有SYN数据包,使用netfilter的NFQUEUE操作将它们推送到位于userspace中的moblock。Moblock进行有效的匹配,并将接收或删除响应发送回netlink。
moblock配置文件格式非常简单:在每一行上,以123.123.42-123.123.124.56形式给出一个名称和一个IP范围。当moblock加载范围时,它构建一个有效的数据结构来匹配这些范围。当由于匹配而丢弃数据包时,将记录范围名称和实际源IP (如果禁用匹配的日志记录,则不记录)。
我在其默认配置(下载的区块)中使用了moblock,其IP范围约为230000,并且没有观察到明显的性能命中(不过,只过滤SYN数据包对于保持内核/用户空间通信量很重要)。
一个警告:如果moblock没有运行,我相信NFQUEUE的默认操作是删除,从而导致拒绝您的应用程序服务。尽管如此,我已经连续运行的moblock没有任何问题超过6个月。不过,您可能希望设置一个监视探针,如果一个已知的好IP无法再连接到服务器上的:80,它会提醒您。您肯定不想使用moblock来过滤ssh,除非您已经在netfilter中使用了一些可信的in来恢复。
发布于 2009-05-31 04:44:23
AFAIK拒绝Apache配置中的规则,iptables具有线性查找时间。
说大也大吧。您可以在IPTables中使用链来拆分它,即简化的方法是为每个A类地址块(例如1.0.0.0/8、2.0.0.0/8等)设置一条链。以及链中该块的规则,显着地减少了查找时间(即,最坏的情况~200条规则评估,以得到A类规则,然后在该块中有许多规则)。您还可以使用"iptables -v -n“来查看哪些规则集被计算得最重,并将它们移到顶部。还有其他更好的方法可以做到这一点,iptables文档将介绍这一点。
发布于 2009-05-31 00:02:12
是的,在你的系统里,应该有一个/etc/hosts.allow。看看,它有一些非常容易的例子来锁定IP,即使是在每个服务的基础上。
简而言之,在/etc/hosts.allow中:
ALL : ALL : allow
httpd : /etc/hosts.httpd.deny : deny
sshd : /etc/hosts.sshd.deny : denyhttps://serverfault.com/questions/15931
复制相似问题