为什么我不能向 iptables 链中添加两个‘...-m recent --update --hitcount...’规则?

为什么我不能向 iptables 链中添加两个‘...-m recent --update --hitcount...’规则?

为了阻止对我的服务器(操作系统是 CentOS 6)的暴力攻击,我想要

  1. 封锁最后一分钟内尝试登录超过 4 次的所有人 1 分钟
  2. 封锁过去一天内登录尝试次数超过 100 次的所有人 1 天

当我为项目 (1) 添加 iptables 规则时

#--- SSH brutforce atack prevention ------------------------------             
# Create SSH attack chains                                                     
-N SSH_CHECK                                                                   
-N SSH_ATTACKED                                                                
# Capture SSH connections                                                      
-A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -j SSH_CHECK            
# Define SSH_CHECK chain                                                       
-A SSH_CHECK -m recent --set --name SSH                                        
-A SSH_CHECK -m recent --update --seconds 60 --hitcount 4 --rttl --name SSH -j SSH_ATTACKED
-A SSH_CHECK -j ACCEPT                                                         
# Define SSH_ATTACKED chain                                                    
-A SSH_ATTACKED -j LOG --log-prefix "SSH anti-brutforce: " --log-level 1       
-A SSH_ATTACKED -j REJECT --reject-with icmp-host-prohibited                   
#----------------------------------------------------------------

iptables 接受它并按预期工作。但是当我尝试为上面的第 (2) 项添加规则时:

#--- SSH brutforce atack prevention ------------------------------             
# Create SSH attack chains                                                     
-N SSH_CHECK                                                                   
-N SSH_ATTACKED                                                                
# Capture SSH connections                                                      
-A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -j SSH_CHECK            
# Define SSH_CHECK chain                                                       
-A SSH_CHECK -m recent --set --name SSH    
-A SSH_CHECK -m recent --set --name SSH2                                      
-A SSH_CHECK -m recent --update --seconds 60 --hitcount 4 --rttl --name SSH -j SSH_ATTACKED
# Next line causes an error
-A SSH_CHECK -m recent --update --seconds 86400 --hitcount 100 --rttl --name SSH2 -j SSH_ATTACKED
-A SSH_CHECK -j ACCEPT                                                         
# Define SSH_ATTACKED chain                                                    
-A SSH_ATTACKED -j LOG --log-prefix "SSH anti-brutforce: " --log-level 1       
-A SSH_ATTACKED -j REJECT --reject-with icmp-host-prohibited                   
#----------------------------------------------------------------- 

它会导致错误。我做了一些实验,似乎它拒绝将两个带有 --hitcount 选项的规则添加到 SSH_CHECK 链中。

我做错了什么?下面是我当前的 /etc/sysconfig/iptables 文件。

*filter                                                                        
:INPUT ACCEPT [0:0]                                                            
:FORWARD ACCEPT [0:0]                                                          
:OUTPUT ACCEPT [0:0]                                                           
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT                        
-A INPUT -p icmp -j ACCEPT                                                     
-A INPUT -i lo -j ACCEPT                                                       

#--- SSH brutforce atack prevention ------------------------------             
# Create SSH attack chains                                                     
-N SSH_CHECK                                                                   
-N SSH_ATTACKED                                                                
# Capture SSH connections                                                      
-A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -j SSH_CHECK            
# Define SSH_CHECK chain                                                       
-A SSH_CHECK -m recent --set --name SSH                                        
-A SSH_CHECK -m recent --update --seconds 60 --hitcount 4 --rttl --name SSH -j SSH_ATTACKED   
-A SSH_CHECK -j ACCEPT                                                         
# Define SSH_ATTACKED chain                                                    
-A SSH_ATTACKED -j LOG --log-prefix "SSH anti-brutforce: " --log-level 1       
-A SSH_ATTACKED -j REJECT --reject-with icmp-host-prohibited                   
#-----------------------------------------------------------------             


# NTP                                                                          
-A INPUT -m state --state NEW -m tcp -p tcp --dport 123 -j ACCEPT              
-A INPUT -m state --state NEW -m udp -p udp --dport 123 -j ACCEPT              

-A INPUT -j REJECT --reject-with icmp-host-prohibited                          
-A FORWARD -j REJECT --reject-with icmp-host-prohibited                        
-A INPUT -j LOG                                                                
COMMIT 

编辑:

有人问我有关错误消息的问题。它根本没说任何有用的信息(在我看来)。

iptables-恢复 /etc/sysconfig/iptables

iptables-restore: line ## failed

其中 ## 是 /etc/sysconfig/iptables 中最后一行的编号

iptables -I SSH_CHECK 3 -m recent --update --seconds 86400 --hitcount 100 --rttl --name SSH2 -j SSH_ATTACKED

iptables: Invalid argument. Run `dmesg' for more information.

dmesg 不包含任何相关信息

答案1

--set --name SSH2在错误消息中列出的行之前的某处缺少一行。

选项要求同一列表--rttl必须有一个选项。您有一个针对列表的选项,但没有针对列表的选项。--setSSHSSH2

错误消息可以对此更清楚一点。

答案2

--hitcount 的默认最大数量设置为 20

您可以验证这一点:cat /sys/module/xt_recent/parameters/ip_pkt_list_tot

您需要使用额外的参数重新加载模块:modprobe xt_recent ip_pkt_list_tot=500

可用参数列表:modinfo xt_recent

相关内容