CentOS 4GB Ran、双核 2.3GHz 上的 iptables 中有 10,000 个条目?

Cha*_*lor 1 iptables freepbx centos6.5

我正在运行一个安装了 FreePBX/Astrisk 的 linux 机器。我已经使用来自 ip2location 的列表屏蔽了中国和香港。com/blockvisitorsbycountry.aspx 网站。我的 fail2ban 每隔 3-9 分钟就会出现一次,现在我的尝试非常有限,通常每天大约 8-10 次。我很想阻止更多,但我担心如果我再向表中添加 10k,我可能会限制系统回到石器时代。你怎么认为?

wom*_*ble 10

别担心,最坏的情况是铁器时代的表现。(咧嘴笑)

内核必须为每个数据包运行大量的 netfilter 规则,这将对系统性能和资源消耗(CPU 和内存)产生负面影响。好消息是,您可以使用许多技巧来最大程度地减少问题。

  1. 常见情况的“短路”规则:您收到的 90+% 的数据包将是现有已建立或相关连接的一部分。因此,通过任何过滤器列表规则之前设置-m state --state ESTABLISHED,RELATED -j ACCEPT规则,您可以避免将所有这些数据包放入冗长的过滤器列表中。
  2. 仅过滤某些端口:如果您正在运行网络服务器,但您真的只担心 SSH 暴力攻击,则可以通过将过滤器列表放在单独的过滤器列表中来避免必须通过过滤器列表处理所有 HTTP 流量链,然后仅通过过滤器发送端口 22 流量,如下所示:

    iptables -N geofilter
    iptables -I geofilter -s <ip range> -j DROP
    [etc etc etc]
    iptables -I INPUT -p tcp --dport 22 -j geofilter
    
    Run Code Online (Sandbox Code Playgroud)
  3. “树状结构”过滤规则:您可能有 10,000 条过滤规则,但只有其中一条会匹配。因此,您可以使用树结构来减少任何一个数据包必须经过的规则数量,方法是将所有规则(例如每个 /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]
    
    Run Code Online (Sandbox Code Playgroud)

    这意味着任何需要通过过滤规则的数据包最多需要遍历 223 条规则(所有geofilter规则)以及许多规则在任何 per-/8 过滤器列表中。(为什么geofilter链中有 223 条规则,而不是 254、255 或 256 条规则,留给精明的读者作为练习)。您可以通过具有多个级别的树来提高效率:在 /4 上拆分,然后在 /8 上,然后在 /12 上,或类似的东西。您可以根据需要添加任意数量的级别以匹配您的成本/收益权衡。您甚至可以对不同的链进行不同的处理:从 /4 处的单级拆分开始,然后是具有超过几百条规则的任何链,在 /8 处拆分,以及仍然具有数百条规则的任何链规则,在 /12 处拆分。

  4. 聚合规则:我打赌您使用的地址列表没有经过最佳聚合。即使它们是针对一个国家的,一旦您将几个国家的列表放在一起,您就可以将来自不同国家的相邻块放在一起。举个例子,假设中国有人有192.0.2.0/25,香港有人得到192.0.2.128/25(是的,不是现实的块,但 RFC5737 只给了我们一个 /24 的文档)。您可以将其汇总192.0.2.0/24并保存为规则。

    一旦开始这样做,您通常会发现可以显着减少列表中的规则数量。(结合下一条规则,您可以将规则列表减少一半或更多。)实现聚合很容易;该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
    
    Run Code Online (Sandbox Code Playgroud)
  5. 负规则:通常情况下,你会发现,有大量的小的块合并为一个,很多较大的块,除了在中间的一个小块。在某些情况下,几乎整个 /8 或 /10 都分配给了一个国家,除了一些以某种方式逃到世界其他地方的小/22。在这种情况下,您可以ACCEPT为这两个列入白名单的小块设置DROP规则,然后为覆盖较大的块设置规则。计算出最佳块需要一定程度的编程,但这不是火箭科学。

需要注意的一件事:IP 块相当定期地更改其地理位置,尤其是在 IPv4 的这些“结束时间”。确保你不只是一劳永逸地忘记这个规则集。获取地理列表的更新副本,并根据它们重建过滤器列表。否则,有一天您会发现您过滤的一个块已被您自己的 ISP 占用,并且您将自己锁定在自己的服务器之外,因为您之前阻止的 IP 地址已分配给您。(真实的故事)


HBr*_*ijn 6

iptables规则的主要问题是它们是按顺序执行的,并且规则集的可能性很大,在数据包被授予访问权或被拒绝之前,必须解析相当多的规则。

Womble 的回答已经解释了很多减少处理惩罚的策略,通过巧妙地对规则进行排序,我同意最重要的一个是使用有状态的防火墙配置,其中只针对完整的规则集检查新连接,并且一旦初始建立该连接的数据包已经过检查和批准,则同一连接中的所有后续数据包都被授予访问权限。

假设您现在有许多阻止访问者的 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
Run Code Online (Sandbox Code Playgroud)

通过使用该实用程序,可以将这些规则简化为单个 iptables 规则ipset

一个IP组是由内核和匹配针对维护网络地址和/或范围列表是远远快于在iptables的顺序匹配规则。

首先创建一个 IP 集(手册推荐了hash:net随机大小的网络块的类型):

ipset create blacklist-china hash:net hashsize 4096
Run Code Online (Sandbox Code Playgroud)

添加要阻止的 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
Run Code Online (Sandbox Code Playgroud)

您的防火墙配置现在减少为:

 iptables -m set --match-set blacklist-china src -j DROP
Run Code Online (Sandbox Code Playgroud)

  • 哦!不敢相信我忘记了 ipsets。 (2认同)