如何限制每个 IP 每分钟的 SSH 登录尝试次数?
我想在失败后 5 秒内禁用登录尝试。这可能吗 ?我不是在谈论像 Fail2ban 这样解析日志后禁止用户。
答案1
问题1
这可以通过模块来完成hashlimit
。
iptables -A INPUT -p tcp --dport 22 -m hashlimit \
--hashlimit-mode srcip --hashlimit-above 3/minute -j DROP
问题2
Netfilter 只看不到登录失败的连接。您需要一个在两个级别上都有效的工具(例如 Fail2ban)。您可以创建一个包含被阻止的 IP 的链,并在每次登录失败后运行一个脚本,这会执行类似的操作
iptables -A blocked_ips -s $evil_ip -j DROP
sleep 5
iptables -D blocked_ips -s $evil_ip -j DROP
答案2
查看iptables
iptables -I INPUT -p tcp --dport 22 -i eth0 -m state --state NEW -m recent --set
iptables -I INPUT -p tcp --dport 22 -i eth0 -m state --state NEW -m recent --update --seconds 5 --hitcount 2 -j DROP
它将每 5 秒只允许每个 IP 建立 1 个新连接。
答案3
GNU/Linux 系统上负责身份验证的组件是 PAM(可插入身份验证系统)。
您可以通过添加模块来配置它。您的案例中一个有趣的模块可能是pam_tally
.它用于限制登录尝试次数并禁止用户。
如果您在其中一个/etc/pam.d/
配置文件中添加这一行:
auth required pam_tally.so deny=1 unlock_time=5 per_user
您可以阻止登录失败的用户在接下来的五秒内再次尝试。因此,您将每分钟的连接尝试次数限制为 12 次。
参考:
答案4
在 /etc/ssh/sshd_config 文件内有一个指令,我相信会对您有所帮助。
MaxAuthTries 6
以下是手册页中的 MaxAuthTries 定义:
MaxAuthTries - 指定每个连接允许的最大身份验证尝试次数。一旦失败次数达到该值的一半,就会记录更多失败。默认值为 6。