我刚刚在 Linode 上获得了一个 Ubuntu 实例。为了确保 SSH 的安全,我安装了fail2ban
(使用apt-get
),但随后出现了一个问题:fail2ban
尽管我输入了正确的密码,但 IP 还是被禁止(幸好时间有限)。所以我删除了它,然后fail2ban
重新安装denyhosts
。同样的问题,但更严重:似乎每次我通过 SSH 登录时,我的 IP 都会被禁止。我从 中删除它/etc/hosts.deny
,重新启动denyhosts
并再次登录,我的 IP 再次被禁止。
我能想到的唯一解释是我一直以 root 身份通过 SSH 登录(是的,是的,我知道);也许某个地方设置了某些东西,阻止任何以 root 身份通过 SSH 登录的人,即使他们成功登录?这对我来说似乎很奇怪。有什么想法吗?(将我的 IP 列入白名单是一种临时解决方案。我不想只能从一个 IP 登录。)
答案1
我相信我曾看到有人说,其中一些应用程序会将失败的密钥登录视为暴力破解尝试。您是否有一个运行着密钥的 ssh-agent?使用该设置进行连接将依次提供每个密钥,然后再返回到密码,所以这可能是原因。尝试将 sshd 的日志级别设置得更高,并检查 fail2ban/denyhost 日志。
编辑:这里是向我通报该问题的原始来源,并提供了解决方法。
答案2
请查看以下链接:
- http://denyhosts.sourceforge.net/faq.html#3_9
- http://denyhosts.sourceforge.net/faq.html#3_19
- http://denyhosts.sourceforge.net/faq.html#allowed
如果你想放弃整个 fail2ban 和denyhosts 的想法,请按照下面的 Nathan Powell 所说,将端口 22 更改为更不为人知的端口
还有一些想法:
iptables:以下示例将丢弃十分钟内对端口 22 进行超过 2 次连接尝试的传入连接:
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 60 --hitcount 4 -j DROP
基于密钥的登录
港口敲门者 (knockd)
答案3
如果将 sshd 设置为 VERBOSE 日志级别(或更高),则每当用户成功登录时,系统日志中都会出现短语“...Failed none...”。默认情况下,fail2ban 设置为将此视为失败。我通过将 sshd 的日志级别重新设置为 INFO 解决了该问题。
有关详细信息,请参阅我对这个问题的回答在我多次 *成功* 登录后,fail2ban 禁止了我
答案4
如果你愿意回到 fail2ban,你可以随时使用ignoreip
中的指令jail.conf
。例如:
ignoreip = 127.0.0.1 192.168.1.0/32
这样,您就不会因为输入错误而被屏蔽 ;-) 这也意味着人们无法通过伪造您的 IP 来屏蔽您(尽管对于任何 TCP 流量来说,这并不是什么大问题)。