Miko Asked: 2010-04-11 14:20:27 +0800 CST2010-04-11 14:20:27 +0800 CST 2010-04-11 14:20:27 +0800 CST Linux:阻止庞大的 IP 列表? 772 阻止访问 8-10k IP 地址的最有效方法是什么? 我的服务器在 Debian 上运行 EngineX。 如果可能,我想向所有地址显示内部服务器错误 (500)。 IP 是分散的,不在任何特定的子集下。 linux debian iptables nginx 3 个回答 Voted Best Answer pQd 2010-04-11T14:36:55+08:002010-04-11T14:36:55+08:00 如果地址被分组在一个或几个连续的子网中[例如几个/24s] - 我将创建简单的预路由规则,将端口80上的所有流量从它们DNAT到监听端口81的东西[例如来自nginx的vhost],这将只是服务错误页面: iptables -t nat -A PREROUTING -p tcp -s 194.88.0.0/16 --dport 80 -j REDIRECT --to 81 如果这是 8-10k 独特的 ips 散布在“四周”......这会很有趣;-] - 我仍然会使用上述场景,但为了匹配我会使用ipset。像这样的东西: ipset --create ban iphash ipset --add ban 80.1.2.3 ipset --add ban 90.4.5.6 ipset --add ban 153.17.18.19 # .... iptables -t nat -A PREROUTING -p tcp -m set --set ban src --dport 80 -j REDIRECT --to 81 deleted 2010-04-11T15:26:48+08:002010-04-11T15:26:48+08:00 可以看看:http ://www.hipac.org/ 它很好地处理了大量的规则。如果您尝试阻止的 IP 存在某种模式,则可以使用 MATCH 规则。pQd 的预路由规则可以很好地与 nf-hipac 配合使用,nf-hipac 使用哈希表来存储规则,并且比默认的 iptables 查找要快得多。 您可以将规则集写入您的位置块中的拒绝行。为简单起见,您可以包含一个包含拒绝块的文件,并每小时重新加载配置。由于它将位于 nginx 配置文件中,因此它不会对性能产生太大影响。 minaev 2010-04-13T23:45:40+08:002010-04-13T23:45:40+08:00 如果您在文件中有这些地址的列表,您可以在 Nginx 配置中尝试以下操作: 1 使用 geo 指令定义 IP 组(在 http 块内): http { ... 地理$块{ 默认0; 包括黑名单; } ... } 这意味着变量 $block 将默认设置为 0。 2 准备一个黑名单文件,如下所示: 192.168.0.0/24 1; 192.168.2.0/24 1; 10.0.0.0/8 1; 也就是说,将这些地址的变量 $block 设置为 1。 3 在 `location' 块中,检查这个变量,如果它是 1 则报告 500 错误: 如果($块 = 1){ 返回 500; } PS:这个解决方案的效率是有争议的,因为来自被禁止 IP 的连接被接受()并传递给 Web 服务器。但是,如果这个微小的开销对您的主机来说并不重要,我宁愿使用 Nginx,而不是使用 iptables。
如果地址被分组在一个或几个连续的子网中[例如几个/24s] - 我将创建简单的预路由规则,将端口80上的所有流量从它们DNAT到监听端口81的东西[例如来自nginx的vhost],这将只是服务错误页面:
如果这是 8-10k 独特的 ips 散布在“四周”......这会很有趣;-] - 我仍然会使用上述场景,但为了匹配我会使用ipset。像这样的东西:
可以看看:http ://www.hipac.org/ 它很好地处理了大量的规则。如果您尝试阻止的 IP 存在某种模式,则可以使用 MATCH 规则。pQd 的预路由规则可以很好地与 nf-hipac 配合使用,nf-hipac 使用哈希表来存储规则,并且比默认的 iptables 查找要快得多。
您可以将规则集写入您的位置块中的拒绝行。为简单起见,您可以包含一个包含拒绝块的文件,并每小时重新加载配置。由于它将位于 nginx 配置文件中,因此它不会对性能产生太大影响。
如果您在文件中有这些地址的列表,您可以在 Nginx 配置中尝试以下操作:
1 使用 geo 指令定义 IP 组(在 http 块内):
这意味着变量 $block 将默认设置为 0。
2 准备一个黑名单文件,如下所示:
也就是说,将这些地址的变量 $block 设置为 1。
3 在 `location' 块中,检查这个变量,如果它是 1 则报告 500 错误:
PS:这个解决方案的效率是有争议的,因为来自被禁止 IP 的连接被接受()并传递给 Web 服务器。但是,如果这个微小的开销对您的主机来说并不重要,我宁愿使用 Nginx,而不是使用 iptables。