显然,这个问题已经以多种不同形式被问过很多次了,但我找不到我所得到的具体计划的实际答案。我们经营着一个受欢迎的欧洲商业交易网站,并且从那些甚至无法参与我们提供的交易的国家/地区获得了大量注册/流量(许多零售商甚至在西欧以外都不为人所知)。
我已经确定了问题区域以阻止大量此类流量,但(正如预期的那样)需要数千个 IP 范围。
现在我的问题来了(终于!)。在测试服务器上,我创建了一个脚本来阻止 iptables 中的每个范围,但添加规则所花的时间很长,之后 iptables 就没有响应了(尤其是在尝试 iptables -L 时)。
阻止大量 IP 范围的最有效方法是什么:
- iptables?或者我可以高效地预加载它们的插件?
- 主机.拒绝?
- .htaccess(很讨厌,因为我会在每个负载平衡的 Web 服务器上的 apache 中运行它)?
答案1
据我所知,问题不在于从哪里获取需要阻止的 IP 地址列表,而在于如何有效地使用 iptables 阻止它们。执行一系列“iptables -A”命令的脚本将需要很长时间来加载规则,在此期间防火墙将以不一致的策略运行。这也对其性能有重大影响。
我建议你尝试模块 ipset (http://ipset.netfilter.org/)。它允许您直接操作地址块表,您只需要一个 iptables 规则即可匹配整个集合。您需要尝试不同类型的集合,以找到可以容纳您需要阻止的 IP 地址块数量并提供您需要的性能的集合。无论如何,它在匹配长地址块列表方面要好得多,并且允许您使用命令行工具重新加载它而无需触及规则。
请注意,并非所有 Linux 发行版都在其默认配置中包含 ipset,因此您可能需要重新编译内核模块和 iptables。
国家/地区地址块会不时更改,因此您需要定期更新地址集。要重新加载已使用的地址集,您可以使用命令行工具“ipset”,并且可以轻松地将其包装在 shell 脚本中以自动执行该过程。或者,您可以使用 fwbuilder 生成 iptables 策略,并使用它生成的脚本来管理 ipset(http://www.fwbuilder.org/4.0/docs/users_guide/address-table-object.html(请参阅本章中的“5.2.13.1. 使用地址表对象与 iptables IP 集”)
答案2
我们发现最好的方法是使用最大思维注册时即可查看数据库。免费版本锁定特定国家/地区,您可以付费获取更详细的信息。
仅在注册时执行此操作的好处是,您不会让已经注册的旅行客户感到尴尬。
答案3
Linux iptables 对于基本防火墙来说还算过得去,但对于其他所有功能来说就很差了。
pf 防火墙(大多数 BSD Unices 使用)将使您的生活更加轻松。表pf防火墙中的功能类似于netfilter下的ipset模块。
OpenBSD、FreeBSD、NetBSD、pfSense 和 OPNSense 都使用 pf。我喜欢 OpenBSD 作为防火墙发行版,但如果您需要防火墙的 GUI,pfSense 和 OPNSense 可以满足您的需求。
至于要把什么内容放入 pf 表中,我保存了一个更新的 tarball点击此处查看按国家/地区划分的 CIDR 块。
答案4
采用许多防火墙可以轻松使用的格式列出每个国家的 IP 块(我在 FreeBSD 上使用 PF 表,可以从文件加载): http://www.ipdeny.com/ipblocks/