Linux:阻止巨大的IP列表?

什么是阻止访问8-10k IP地址的最有效的方法是什么?

我的服务器在Debian上运行EngineX。

如果可能的话,我想显示所有的地址内部服务器错误(500)。

IP是分散的,不属于任何特定的子集。

如果地址被分组在一个或几个连续的子网中[例如很less/ 24s],我会创build一个简单的预先路由规则,将端口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 

可以看看: http : //www.hipac.org/它处理大量的规则相当好。 如果您尝试阻止的IP有一个模式,则可以使用MATCH规则。 pQd的预路由规则适用于nf-hipac,nf-hipac使用散列表来存储规则,比默认的iptables查找快得多。

您可以将规则集写入您的位置块中的拒绝行。 为了简单起见,您可以包含一个包含拒绝块的文件,并按小时重新加载configuration。 由于它在nginxconfiguration文件中,所以不应该对性能造成太大的影响。

如果你在一个文件中有这些地址的列表,你可以在Nginxconfiguration文件中尝试以下内容:

1使用geo指令(在http块内)定义一个IP组:

 http {
 ...
   geo $ block {
    默认为0;
    包括黑名单; 
   }
 ...
 }

这意味着默认情况下variables$ block将被设置为0。

2准备一个黑名单文件看起来像这样:

 192.168.0.0/24 1;
 192.168.2.0/24 1;
 10.0.0.0/8 1;

也就是说,为这些地址设置variables$ block为1。

3在“位置”块内,检查这个variables,并报告500错误,如果它是1:

  if($ block = 1){
   回报500;
  }

PS:这种解决scheme的效率是有争议的,因为来自禁止的IP的连接被接受并传递给networking服务器。 但是,如果这个小小的开销对主机来说并不重要,我宁愿用Nginx做,而不是用iptables。