我正在运行一个安装有FreePBX / Astrisk的Linux机器。 我使用ip2location的列表封锁了中国和香港。 com / blockvisitorsbycountry.aspx网站。 我的失败是每3-9分钟一次,现在我每天都在8-10的时间里进行非常有限的尝试。 我很想阻挡更多,但是我担心如果我在桌子上再增加10K,我可能会把系统重新调整到石器时代。 你怎么看?
别担心,最坏的情况是铁器时代的performance。 (GRIN)
内核必须贯穿每一个数据包的大量netfilter规则将对系统性能和资源消耗(包括CPU和内存)产生负面影响。 好的是有很多技巧可以用来减less问题。
-m state --state ESTABLISHED,RELATED -j ACCEPT规则来避免必须将所有这些数据包放在冗长的filter列表中。 只过滤某些端口:如果您运行的是networking服务器,但实际上您只是担心SSH暴力攻击,则可以避免必须通过将filter列表单独放置在filter列表中来处理所有HTTP通信链,然后只通过filter发送端口22的stream量,如下所示:
iptables -N geofilter iptables -I geofilter -s <ip range> -j DROP [etc etc etc] iptables -I INPUT -p tcp --dport 22 -j geofilter
“树结构”您的过滤规则:您可能有10,000个过滤规则,但只有其中一个匹配。 因此,可以使用树结构来减less任何一个数据包必须经过的规则的数量,把每个/ 8的所有规则放入自己的链中。 扩展以前的geofilter示例:
iptables -N geofilter_1 iptables -N geofilter_2 [etc etc etc all the way to geofilter_223] iptables -I geofilter -s 1.0.0.0/8 -j geofilter_1 iptables -I geofilter -s 2.0.0.0/8 -j geofilter_2 [etc etc etc] iptables -I geofilter_1 -s 1.2.3.0/24 -j DROP iptables -I geofilter_1 -s 1.5.9.0/18 -j DROP [etc etc etc for all rules in 1/8] iptables -I geofilter_2 -s 2.42.0.0/16 -j DROP [etc etc etc for all rules in 2/8] [continue pattern for all /8s]
这意味着任何需要通过过滤规则的数据包最多需要遍历223个规则(所有的geofilter规则),而且每个/ 8个filter列表中都有许多规则。 (为什么在geofilter链中有223个,而不是geofilter或256个规则是geofilter读者的一个练习)。 你可以通过多级树来实现这个更高的效率:分割在/ 4上,然后在/ 8上,然后在/ 12上,或类似的东西。 您可以添加尽可能多的水平,以符合您的成本/收益折衷。 你甚至可以对不同的链条做不同的处理:从/ 4开始一个单一的等级分裂,然后是任何有超过几百个规则的链条,在/ 8分裂,还有几百个链条规则,在/ 12分裂。
汇总规则:我会合理地下注您使用的地址列表未被最佳汇总。 即使他们是一个国家的单一国家,一旦你把几个国家的名单放在一起,可能会有来自不同国家的相邻街区,你可以放在一起。 举一个例子,说中国有192.0.2.0/25人,香港有192.0.2.128/25 (是的,不太实际的块,但RFC5737只给了我们一个/ 24的文档)。 你可以把它聚合到192.0.2.0/24并保存一个规则。
一旦你开始这样做,你可以经常发现,你可以显着减less列表中的规则数量。 (结合下一条规则,可以将规则列表减半或更多。)实现聚合非常简单, netmask工具将采取一个任意的块列表,并给你一个CIDR块的最小列表:
netmask -c 192.0.2.0/25 192.0.2.128/25 192.0.3.0/24 192.0.1.0/25 192.0.1.0/25 192.0.2.0/23
消极的规则:通常,你会发现大量的小块聚合成一个更大的块, 除了中间的一小块。 在某些情况下,几乎整个/ 8或10分配给一个国家,除了几个小小的/ 22以某种方式逃到世界的另一个地方。 在这种情况下,您可以将这两个小白名单块的ACCEPT规则放在后面,然后对覆盖较大的块执行DROP规则。 制定最佳模块需要一定程度的编程,但这不是火箭科学。
有一件事要注意:IP块会相当有规律地改变他们的地理位置,特别是在IPv4的这些“结束时间”。 确保你不只是开火和忘记这个规则集。 获取地理列表的更新副本,并基于它们重buildfilter列表。 否则,有一天你会发现你所过滤的块已经被你自己的ISP占用了,并且你将把自己locking在你自己的服务器之外,因为你先前阻塞的一个IP地址被分配给了你。 (真实的故事)
iptables规则的主要问题在于,它们是按顺序执行的,并且具有较大的规则集可能性是在数据包被授权访问或被拒绝之前必须parsing的一些规则。
Womble的回答已经解释了许多减less处理惩罚的策略,通过巧妙地sorting规则以及在哪里我同意最重要的是使用全状态防火墙configuration,其中只有NEW连接被检查完整的规则集,并且一旦初始build立该连接的数据包已被审查和批准,同一连接中的所有后续数据包都被授予访问权限。
假设你现在有一些阻止访问者的DROP规则:
# Source: http://www.ip2location.com/free/visitor-blocker iptables -A INPUT -s 1.0.1.0/24 -j DROP iptables -A INPUT -s 1.0.2.0/23 -j DROP iptables -A INPUT -s 1.1.0.0/24 -j DROP iptables -A INPUT -s 1.1.2.0/23 -j DROP iptables -A INPUT -s 1.1.8.0/21 -j DROP iptables -A INPUT -s 119.15.136.0/21 -j DROP iptables -A INPUT -s 119.16.0.0/16 -j DROP iptables -A INPUT -s 119.18.192.0/20 -j DROP iptables -A INPUT -s 119.18.208.0/21 -j DROP
这些规则可以通过使用ipset实用程序简化为一个iptables规则 。
IP集是内核维护的networking地址和/或范围列表,匹配的速度比iptables中的顺序匹配规则快得多。
首先创build一个IP集(本手册build议对hash:net的随机大小selecttypeshash:net ):
ipset create blacklist-china hash:net hashsize 4096
添加您希望阻止的CIDR范围:
ipset add blacklist-china 1.0.1.0/24 ipset add blacklist-china 1.0.2.0/23 ipset add blacklist-china 1.1.0.0/24 ipset add blacklist-china 1.1.2.0/23 ipset add blacklist-china 1.1.8.0/21 ipset add blacklist-china 119.15.136.0/21 ipset add blacklist-china 119.16.0.0/16 ipset add blacklist-china 119.18.192.0/20 ipset add blacklist-china 119.18.208.0/21
您的防火墙configuration现在简化为:
iptables -m set --match-set blacklist-china src -j DROP
另一种方法是使用iptables的xt_geoip模块。 虽然我没有testing过对ipsets性能(如果我正确地理解源代码xt_geoip使用d&c二进制search,而ipsets使用散列)。 这个好处可能是简单的更新。
例如,Ubuntu默认在xtables-addons-dkms中发布 。