【问题标题】:Optimizing firewall rules processing优化防火墙规则处理
【发布时间】:2015-01-07 14:53:59
【问题描述】:

我正在使用 fail2ban 来阻止我的服务器上的失败登录尝试。该块是使用具有以下配置的 IP 表执行的:

actionstart = iptables -N fail2ban
              iptables -A fail2ban -j RETURN
              iptables -I <chain> -p tcp -m multiport --dports <port> -j fail2ban

actionstop = iptables -D <chain> -p tcp -m multiport --dports <port> -j fail2ban
             iptables -F fail2ban
             iptables -X fail2ban

actionban = iptables -I fail2ban 1 -s <ip> -j DROP
actionunban = iptables -D fail2ban -s <ip> -j DROP

我关心的是规则处理性能。上述规则处于有状态模式,我一直想知道无状态模式是否会使处理速度更快。为了清楚起见,我在 TCP 端口(例如 22 或 25)上阻止了入侵者 IP 地址。

我在某处读到,对于 TCP 连接,添加 ESTABLISHED,RELATED 状态会更好。但是由于每个 IP 都指向不同的连接,那么应用这些状态是否有意义?

更新:

这是一个示例iptables -L

Chain INPUT (policy ACCEPT 399 packets, 36043 bytes)
 pkts bytes target     prot opt in     out     source               destination         
   39  4230 fail2ban  tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           multiport dports 22,25,80,99,100,101 

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 282 packets, 39686 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain fail2ban (1 references)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 DROP       all  --  *      *       192.168.0.1        0.0.0.0/0
    0     0 DROP       all  --  *      *       192.168.0.2        0.0.0.0/0
    0     0 DROP       all  --  *      *       192.168.0.3        0.0.0.0/0
    0     0 DROP       all  --  *      *       192.168.0.4        0.0.0.0/0           
   39  4230 RETURN     all  --  *      *       0.0.0.0/0            0.0.0.0/0             

【问题讨论】:

    标签: performance iptables fail2ban


    【解决方案1】:

    尽管许多性能辩护者声称,IPtables 可能会产生大量开销,但在您获得大量流量之前不会引起注意。现在,您如何处理表格以及调用哪些扩展,将决定每个数据包的 CPU 开销。

    对于无状态与有状态,是的,性能差异可能是巨大的,但同样是在非常高的吞吐量下。此外,您可能已经阅读过,管理无状态防火墙要复杂得多。只有当 IPtable 的影响是可测量的时才应该这样做。

    但应始终遵循良好做法,并且 IMO 包括最少的开销而不增加很多复杂性。

    现在就您的情况而言,fail2ban 仅考虑整体 iptables 的一部分,但我建议预防性地查看的唯一内容就是这部分。

    -p tcp -m multiport --dports

    使用多端口扩展确实会产生更多开销,除非这样做会显着减少规则。因为你只做 2,我会单独列出它们,以避免多端口扩展......或者更好的是,如果你不关心阻塞 23 和 24,那么最好只按范围列出。

    -p tcp -m tcp --dport 22:25

    至于已建立的跟踪,是的,您可以将它与 fail2ban 一起使用,尽管它确实有一些注意事项。为了获得最大的影响,您需要将 fail2ban 链放在 ESTABLISHED,RELATED 下方。然而,这将允许已经建立的连接,考虑到您需要一个已经过身份验证的用户,这似乎很合理。

    这是我用于我的服务器的表格的一个小示例,带有一些示例规则,我为您评论了它,

    *raw
    :PREROUTING ACCEPT [0:0]
    :OUTPUT ACCEPT [0:0]
    
    ## Stateless on Loopback
    ## Remove everything before #filter if iptables chokes on #raw
    -A OUTPUT -o lo -j NOTRACK
    
    COMMIT
    
    
    *filter
    ## Default Chains
    :INPUT ACCEPT [0:0]
    :FORWARD DROP [0:0]
    :OUTPUT ACCEPT [0:0]
    
    ## Proto Chains
    :FWINPUT-TCP - [0:0]
    :FWINPUT-UDP - [0:0]
    :FWINPUT-ICMP - [0:0]
    
    ## FAIL2BAN Chain
    :fail2ban - [0:0]
    
    ## Accept Established
    -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
    
    ## Accept Loopback
    -A INPUT -i lo -j ACCEPT
    
    ## Seperate Proto
    -A INPUT -p tcp -g FWINPUT-TCP
    -A INPUT -p udp -g FWINPUT-UDP
    -A INPUT -p icmp -g FWINPUT-ICMP
    
    ## Reject Anything Non-TCP/UDP/ICMP
    -A INPUT -j REJECT --reject-with icmp-proto-unreachable
    
    
    
    ## TCP Rules
    -A FWINPUT-TCP -p tcp -m tcp --dport 80 -j ACCEPT
    -A FWINPUT-TCP -p tcp -m tcp --dport 443 -j ACCEPT
    
    ## fail2ban Check
    -A FWINPUT-TCP -p tcp -m tcp --dport 22:25 -g fail2ban
    ## fail2ban Return
    
    -A FWINPUT-TCP -p tcp -m tcp --dport 22 -j ACCEPT
    -A FWINPUT-TCP -p tcp -m tcp --dport 25 -j ACCEPT
    
    ## TCP-Reset Ident
    -A FWINPUT-TCP -p tcp -m tcp --dport 113 -j REJECT --reject-with tcp-reset
    
    ## Reject Any Other TCP Traffic
    -A FWINPUT-TCP -j REJECT --reject-with icmp-port-unreachable
    
    
    ## UDP Rules
    -A FWINPUT-UDP -p udp --dport 5353 -d 224.0.0.251 -j ACCEPT
    
    ## Reject Any Other UDP Traffic
    -A FWINPUT-UDP -j REJECT --reject-with icmp-port-unreachable
    
    
    ## ICMP Rules
    -A FWINPUT-ICMP -p icmp -m icmp --icmp-type 8 -m limit --limit 5/s -j ACCEPT
    -A FWINPUT-ICMP -p icmp -m icmp --icmp-type 3 -j ACCEPT
    -A FWINPUT-ICMP -p icmp -m icmp --icmp-type 4 -j ACCEPT
    -A FWINPUT-ICMP -p icmp -m icmp --icmp-type 11 -j ACCEPT
    -A FWINPUT-ICMP -p icmp -m icmp --icmp-type 12 -j ACCEPT
    
    ## Reject Any Other ICMP Types
    -A FWINPUT-ICMP -j REJECT --reject-with icmp-host-prohibited
    
    ## fail2ban Inserted Rules
    -A fail2ban -j RETURN
    
    COMMIT
    

    我只是将动作开始和动作停止空白,让fail2ban在运行时添加被阻止的IP规则。这将需要更多的手动考虑,例如如果您想开始使用 fail2ban 来阻止更多的东西......但如果这是您尝试处理的固定类型的事情,那么它应该不是问题。

    ...在我的家庭系统上,而不是在服务器上,我通常只是设置一个 iptables 限制并称其为足够好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-07
      • 2016-11-26
      • 1970-01-01
      • 2021-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多