为了阻止对我的服务器(操作系统是 CentOS 6)的暴力攻击,我想要
- 封锁最后一分钟内尝试登录超过 4 次的所有人 1 分钟
- 封锁过去一天内登录尝试次数超过 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
必须有一个选项。您有一个针对列表的选项,但没有针对列表的选项。--set
SSH
SSH2
错误消息可以对此更清楚一点。
答案2
--hitcount 的默认最大数量设置为 20
您可以验证这一点:cat /sys/module/xt_recent/parameters/ip_pkt_list_tot
您需要使用额外的参数重新加载模块:modprobe xt_recent ip_pkt_list_tot=500
可用参数列表:modinfo xt_recent