服务器被暴力破解,SSH 登录失败怎么办?
暴力破解到底有多野?先了解现状
云服务器只要暴露在公网上,服务器被暴力破解几乎是每天都会发生的事。
SSH(远程登录协议)默认端口22,是扫描机器最常盯上的目标。
如果你发现 ssh root@你的服务器IP 提示连接被拒绝、登录超时或反复输入密码都进不去,十有八九是SSH登录失败次数太多,系统或安全组把IP封了。
别慌,按下面的步骤一步步排查和修复。
前期准备:登录服务器与查看日志工具
操作前需要:
- 一台运行 Linux(CentOS/Ubuntu/Debian)的云服务器,能通过VNC控制台或阿里云/腾讯云的“远程连接”功能进入系统(如果SSH已经连不上)。
- 确认你拥有 root 权限或 sudo 权限。
- 准备一个记事本,记录下后续要修改的IP和端口。
如果服务器还能 SSH 登录(只是偶尔掉线),直接打开终端即可。
如果完全连不上,请从云服务商的管理后台使用 VNC 或 Web Shell 进入系统,照样能执行命令。
紧急处理:临时封禁恶意IP(两行命令)
查看登录失败记录
首先查看SSH登录失败的统计,找到攻击者的IP:
# 查看最近1000条认证失败的日志,提取IP并排序去重
journalctl -u sshd -n 1000 | grep "Failed password" | grep -oP "from \K[^ ]+" | sort | uniq -c | sort -rn | head -10
如果系统是 CentOS 6/7 或使用 rsyslog,用 /var/log/secure:
sudo grep "Failed password" /var/log/secure | grep -oP "from \K[^ ]+" | sort | uniq -c | sort -rn | head -10
Ubuntu/Debian 用 /var/log/auth.log。
输出类似:
520 203.0.113.5
230 198.51.100.20
次数最高的几个IP就是攻击源。
临时封禁IP
用 iptables 或 firewalld 临时封禁,比如封掉 203.0.113.5:
sudo iptables -A INPUT -s 203.0.113.5 -j DROP
注意:这个规则重启后失效,但能立刻解决问题。
如果想永久生效,需要保存规则(不同系统命令不同)。
更推荐下一步的长期方案。
如果是宝塔面板用户,可以在 安全 > 防火墙 里直接添加 IP 黑名单,效果等同。
长期防护:安装Fail2ban + 密钥登录
临时封IP只是止血,要避免服务器被暴力破解反复发生,必须加固 SSH。
方法一:安装 Fail2ban(自动封禁)
Fail2ban 会监控登录日志,发现多次失败就自动封IP。
安装和配置一条龙:
# CentOS
sudo yum install epel-release -y && sudo yum install fail2ban -y
# Ubuntu/Debian
sudo apt update && sudo apt install fail2ban -y
启动并开机自启:
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
检查状态:
sudo fail2ban-client status sshd
看到 Status 输出,说明已生效。
默认设置下,同一个IP在10分钟内失败5次就会被封10分钟。
如果需要调策略,编辑 /etc/fail2ban/jail.local,比如:
[sshd]
enabled = true
maxretry = 3
bantime = 3600
findtime = 600
然后重启服务。
方法二:改用密钥登录 + 关闭密码登录
密码登录是暴力破解的靶子。
用密钥登录几乎可以杜绝暴力破解。
- 在本地电脑生成密钥对(Windows 用 Git Bash / PowerShell,Mac/Linux 直接终端):
ssh-keygen -t ed25519 -f ~/.ssh/my_server_key -N ""
生成后得到 my_server_key(私钥)和 my_server_key.pub(公钥)。
- 将公钥添加到服务器:
ssh-copy-id -i ~/.ssh/my_server_key.pub root@你的服务器IP
如果无法使用 ssh-copy-id,手动复制:
# 在本地查看公钥内容
cat ~/.ssh/my_server_key.pub
# 在服务器上执行(使用VNC或Web Shell)
mkdir -p ~/.ssh && chmod 700 ~/.ssh
echo "粘贴公钥内容" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
- 测试用密钥登录:
ssh -i ~/.ssh/my_server_key root@你的服务器IP
成功登录后,关闭密码登录:编辑 /etc/ssh/sshd_config,找到并修改:
PasswordAuthentication no
PubkeyAuthentication yes
保存后重启 SSH:
sudo systemctl restart sshd
务必保留VNC控制台作为救急通道,万一密钥不对还能从后台修复。
高频问题与避坑(含验证效果)
常见问题
- Q:我按步骤操作了,但SSH登录还是失败? A:检查安全组是否放行了新端口(如果改了端口),或者 Fail2ban 是否把你自己封了。用
sudo fail2ban-client set sshd unbanip 你的IP解封。 - Q:封禁IP后自己也被封了怎么办? A:从VNC控制台登录,执行
sudo iptables -F清空规则,或者用sudo fail2ban-client set sshd unbanip 你的公网IP。 - Q:Fail2ban 没生效? A:检查日志
sudo journalctl -u fail2ban,确认 sshd jail 加载成功。部分系统需要手动启用[sshd]的 enabled = true。
避坑说明
- 不要直接删除 /var/log/secure 或 auth.log,这些日志是排查依据,应该定期轮转而非删除。
- 修改 SSH 配置时千万别关闭当前连接的 Shell,先执行
ssh -O check或另开一个窗口测试,否则你可能彻底锁在外面。 - 使用 Fail2ban 时,默认的 “maxretry = 5” 对正常用户可能太宽松,建议改为 3。但也不要太低(比如2),以免误封。
验证最终效果
重启后,用新配置登录几次,观察 sudo fail2ban-client status sshd 中的 Banned IP 列表。
如果连续多次尝试错误密码,IP 会被自动封禁。
也可以查看系统日志确认无新攻击:
sudo journalctl -u sshd --since "1 hour ago" | grep "Failed password" | wc -l
如果返回数字持续为0,说明服务器被暴力破解的问题已基本解决。
如果你正在处理服务器被暴力破解,SSH登录失败怎么办?建议先按本文步骤完整执行,再根据自己的环境做微调;
遇到异常时优先回看避坑和高频问题部分。