我遇到过这样一种情况:客户端需要将一组将近一百万个单独的IP地址(没有子网)列入黑名单,并且网络性能是一个问题。虽然我可以推测IPTables规则对性能的影响比对路由的影响要小,但这只是一个推测。
有没有人有任何确凿的证据或其他理由赞成使用IPTables或空路由作为将IP地址长列表列入黑名单的解决方案?在这种情况下,一切都是自动化的,因此易用性并不是真正的问题。
编辑11年11月26日
经过一些测试和开发,这些选项似乎都不可行。似乎路由查找和iptables都通过规则集进行线性搜索,并且处理这些规则花的时间太长。在现代硬件上,将100万个项目放入iptables黑名单会使服务器的速度降低到每秒约2打数据包。因此IPTables和空路由都消失了。
ipset
,如Jimmy Hedman所建议的那样,将非常有用,除了它不允许您在一个集合中跟踪超过65536个地址外,因此,除非有人有任何想法,否则我什至无法尝试使用它。
显然,阻止这么多IP的唯一解决方案是在应用程序层中进行索引查找。不是吗
更多信息:
这种情况下的用例是阻止IP地址的“已知违规者”列表访问Web服务器上的静态内容。FWIW,通过Apache进行阻塞Deny from
同样很慢(如果不是更多的话),因为它也进行线性扫描。
仅供参考:最终可行的解决方案是将apache的mod_rewrite与berkeley DB映射结合使用以对黑名单进行查找。伯克利数据库的索引性质使列表可以随着O(log N)性能进行扩展。