connection refused 或 timed out 不代表服务宕机,大概率是 fail2ban 等工具因暴力破解将客户端 ip 加入防火墙黑名单;换网络可验证,需通过 vnc 登录后用 fail2ban-client、iptables 或 firewall-cmd 检查封禁状态并解封。

Connection refused 或 Connection timed out 不代表服务挂了,大概率是被暴力破解触发了自动封禁——比如 fail2ban 已把你的 IP 加入 iptables 或 firewalld 黑名单,而你恰好用的是被封的那个出口 IP。
fail2ban 封禁导致 SSH 连接失败
fail2ban 默认监控 /var/log/auth.log(Debian/Ubuntu)或 /var/log/secure(RHEL/CentOS),一旦检测到同一 IP 短时间内多次认证失败,就会调用防火墙命令封禁该 IP。问题在于:它不区分“攻击者”和“手抖输错三次密码的你”。
- 封禁动作通常写入
iptables或firewalld,但不会在日志里明确告诉你“你被 ban 了” - 你本地
ssh -v user@host可能卡在 TCP 握手前,连服务端日志都进不去 - 最直接验证方式:换一个没试过登录的网络(如手机热点)再连;若能通,基本坐实是 IP 被封
操作建议:
- 登录服务器控制台(VNC、救援模式或物理终端),执行:
sudo fail2ban-client status sshd查看当前封禁状态 - 检查封禁列表:
sudo iptables -L INPUT -n | grep :22(iptables场景)或sudo firewall-cmd --list-rich-rules | grep reject(firewalld场景) - 临时解封某 IP:
sudo fail2ban-client set sshd unbanip 1.2.3.4 - 彻底停用(仅调试用):
sudo systemctl stop fail2ban
暴力破解流量挤占连接资源
大量并发连接尝试会快速耗尽 sshd 的 MaxStartups 限制(默认值常为 10:30:60),新连接会被直接丢弃,现象就是 Connection refused,但 systemctl status sshd 显示一切正常。
-
sshd日志里可能看不到明显错误,因为连接根本没进认证流程 -
ss -s输出中tcp行的orphan数值异常高(>100),说明大量半开连接堆积 -
netstat -an | grep :22 | wc -l若远超 50,基本可判定被扫描器占满连接队列
操作建议:
- 临时提升连接上限(需重启
sshd):MaxStartups 30:50:100加入/etc/ssh/sshd_config - 更治本的做法是前置限速:用
iptables限制单 IP 新建连接速率,例如:sudo iptables -A INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j REJECT - 注意:修改
sshd_config后必须运行sudo sshd -t校验语法,再sudo systemctl restart sshd
认证日志被刷屏掩盖真实问题
暴力破解期间,/var/log/auth.log 或 /var/log/secure 每秒涌入几十条 Failed password,导致你自己的合法登录失败记录被冲走,无法定位是否是密钥权限、PermitRootLogin 或 PubkeyAuthentication 关闭等真问题。
- 直接
tail -f /var/log/auth.log会卡顿甚至假死,因为 I/O 压力太大 -
grep -i "user yourname" /var/log/auth.log | tail -20比盲目翻日志更有效 - 若发现
no matching key exchange method found,说明不是被封,而是客户端与服务端加密套件不兼容(常见于新版 OpenSSH 连老系统)
操作建议:
- 先过滤出自己的 IP:
sudo grep "1.2.3.4" /var/log/auth.log | tail -15 - 检查关键配置项是否被暴力破解脚本意外改写(尤其当服务器有 Web 面板时):
sudo grep -E "^(PermitRootLogin|PasswordAuthentication|PubkeyAuthentication)" /etc/ssh/sshd_config - 密钥登录失败最常被忽略的点:
~/.ssh目录权限不能高于700,authorized_keys必须是600,OpenSSH 会静默拒绝——这个错误不会出现在日志里
真正的难点不在“怎么解封”,而在“如何确认封禁来源”。fail2ban、iptables、云平台安全组、甚至运营商封 22 端口,四层规则可能同时生效,必须逐层排除。别依赖单一日志或命令,交叉验证才是关键。











