![如何在 ssh 中阻止 IP](https://linux22.com/image/1497337/%E5%A6%82%E4%BD%95%E5%9C%A8%20ssh%20%E4%B8%AD%E9%98%BB%E6%AD%A2%20IP.png)
一个非常坚持的人在过去几天里不断试图(未经授权)访问我的系统...有无数的条目,例如/var/log/auth.log
:
Jun 21 03:55:15 cloudy sshd[32487]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=116.31.116.20 user=root
Jun 21 03:55:16 cloudy sshd[32487]: Failed password for root from 116.31.116.20 port 30629 ssh2
Jun 21 03:55:19 cloudy sshd[32487]: Failed password for root from 116.31.116.20 port 30629 ssh2
Jun 21 03:55:21 cloudy sshd[32487]: Failed password for root from 116.31.116.20 port 30629 ssh2
Jun 21 03:55:21 cloudy sshd[32487]: Received disconnect from 116.31.116.20: 11: [preauth]
Jun 21 03:55:21 cloudy sshd[32487]: PAM 2 more authentication failures; logname= uid=0 euid=0 tty=ssh ruser= rhost=116.31.116.20 user=root
我想请教一下如何阻止此人消耗计算机资源,是否有可能“硬阻止”该 IP 甚至打开 ssh 连接?请注意,我使用 Debian 8 作为操作系统。
答案1
添加sshd: 116.31.116.20
/etc/hosts.deny
答案2
您还可以使用iptables
创建一个包含要阻止的 IP 地址的文件blocked.ips.txt
现在创建并运行包含以下内容的脚本:
blocked=$(egrep -v -E "^#|^$" ./blocked.ips.txt)
for ip in $blocked
do
iptables -I INPUT -s $ip -p tcp --dport ssh -j DROP
done
运行iptables -L
应该会输出丢弃的数据包
答案3
iptables 方法是最直接的方法。Erik Handriks 建议将其作为脚本使用。
两个但是: - 每次重启后都必须启动该脚本(如果表没有使用 iptables 内部备份)。 - 按原样调用脚本,两次或两次以上将重复条目。
尝试用以下方法简单地抓住坏人:
iptables -I INPUT -s BAD_IP -p tcp --dport ssh -j DROP
在大多数发行版中,iptables 都有自己的规则保存恢复机制。查看是否存在“/var/lib/iptables/rules-save”。对于您的发行版,它可能位于其他地方(此处为 gentoo)。
添加每个 BAD IP 后,尝试:
iptables-保存 > /var/lib/iptables/rules-保存
重启后,使用“iptables -L”检查那里有什么......
答案4
在我的服务器 (Ubuntu 16.04) 上,我使用 UFW (UncomplicatedFireWall),这是 iptables 上的简化层,它似乎是 Ubuntu 服务器上的标准配置(但应该适用于其他发行版)。对于这些情况,我使用:
ufw insert 1 deny from nnn.nnn.nnn.nnn
UFW 还允许您限制连接数
ufw limit ssh/tcp
请注意,这也适用于成功的连接,因此如果您使用使用多个 ssh 命令的脚本,则必须通过发出以下命令禁用您的 IP 的此限制:
ufw insert 1 allow in from nnn.nnn.nnn.nnn