很抱歉问这个问题 - 但我一直在浏览有关此主题的论坛和帖子,似乎让自己感到困惑而不是真正得到任何澄清。我需要的只是对这个问题的一个简短而简洁的答案:
如何在 iptables 中设置一条(链式)规则,拒绝在 YY 分钟内尝试 XX 次后仍无法访问服务器的任何源,以便在 ZZ 分钟内密码匹配之前拒绝任何进一步联系服务器的尝试。在最后一次连接尝试后的 ZZ 分钟内,规则必须允许同一源重试其尝试,就像它之前从未尝试过重新连接一样。
- 我认为这必须写成一条新的链式法则。
- 我假设链式规则必须保存到 iptables,以便在重启时恢复该规则。
- 我认为链式法则需要某种类型的记录。
我的问题是我不明白iptables句法不管我对此研究了多少,因此我很感激对这个问题最简短的“脚本类型”回答
答案1
嗯,老实说,iptables 有一点难学习。
首先可以使用ufw来启动,ubw是一个强大的命令行工具,优点是语法和iptables类似。
sudo ufw enable
sudo ufw limit 22
这里我限制了端口 22,您可以使用任何您想要的端口。
https://help.ubuntu.com/11.10/serverguide/C/firewall.html
再次,优点是 ufw 将自动执行大部分操作并简化您的学习过程。
如果您想使用 iptables,您至少需要学习保存和恢复您的规则。
sudo iptables-save > /etc/iptables.save
sudo iptables-restore /etc/iptables.save
您可以编辑/etc/iptables.save
,语法足够简单。
当尝试远程规则时,使用iptables-apply
以防止锁定
sudo iptables-apply /etc/iptables.save
要在启动时恢复规则,其中一种方法是将其添加到 /etc/rc.local
iptables-restore /etc/iptables.save
Ubuntu iptables wiki 页面中列出的其他选项(见下文)。
iptables 语法是
iptables -I INPUT -p tcp -m state --state NEW -m limit --limit 30/minute --limit-burst 5 -j ACCEPT
要记录日志,请添加日志,但除非您要监控日志,否则请使用 snort。在我看来,记录 iptables 对调试更有帮助。
请参阅 man iptables,Ubuntu 维基百科 iptables
有些人发现我的 iptables 网页很有帮助。
要回答您的评论,请参阅这些规则
iptables -A INPUT -p tcp -m tcp --dport 22 -m tcp -m state --state NEW -m recent --set --name SSH --rsource
iptables -A INPUT -p tcp -m tcp --dport 22 -m recent --update --seconds 600 --hitcount 8 --rttl --name SSH --rsource -j DROP
iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
http://kevin.vanzonneveld.net/techblog/article/block_brute_force_attacks_with_iptables/
需要注意的是,这取决于服务。ssh 配置为允许多次尝试密码验证 (9see /etc/ssh/sshd_config
),因此每个连接都会提供 6 次密码尝试机会。