直接原因是MaxStartups参数过低导致未认证连接队列溢出而拒绝连接;可通过日志排查、调整MaxStartaways值(如50:30:100)、提升系统文件描述符限制及优化客户端连接复用与退避策略综合解决。

直接原因是 MaxStartups 参数设得太低,导致大量客户端同时发起连接时,未完成认证的连接队列被拒绝,报错 “Connection refused”。
确认是否是MaxStartups触发的限制
查看 SSH 服务日志可快速验证:
- 执行
sudo tail -20 /var/log/auth.log | grep "sshd.*connection.*refused"(Ubuntu/Debian)或sudo journalctl -u sshd -n 20 --no-pager | grep refused(RHEL/CentOS) - 若日志中出现类似
error: fork of unauthenticated connection failed: Resource temporarily unavailable或大量Connection closed by remote host before authentication,基本就是 MaxStartups 触顶了 - 配合
ss -tn state syn-sent | grep :22 | wc -l可观察客户端侧堆积的未完成握手连接数
调整MaxStartups参数(最直接有效)
编辑 /etc/ssh/sshd_config,修改或添加这一行:
-
MaxStartups 50:30:100—— 表示:最多允许 50 个未认证连接;超过 50 后,每新增 30 个连接随机丢弃 1 个;达到 100 则全部拒绝 - 若部署规模固定为 24 台机器并行连接(如原文案例),设为
MaxStartups 30即可(等价于30:30:30) - 避免设为无上限(如
0或极大值),否则可能被暴力扫描拖垮服务
改完后必须重启服务:sudo systemctl restart sshd
同步检查系统级资源瓶颈
仅调 MaxStartups 不够,若底层资源不足,仍会失败:
-
文件描述符限制:每个 SSH 连接至少占 2–3 个 fd。检查
ulimit -n,并在/etc/security/limits.conf中为sshd进程提升限制,例如:sshd soft nofile 65536sshd hard nofile 65536 -
systemd 服务限制(现代系统常用):检查
sudo systemctl show sshd | grep -E "(LimitNOFILE|TasksMax)",必要时在/etc/systemd/system/sshd.service.d/override.conf中添加:[Service]LimitNOFILE=65536TasksMax=1024 - 改完需执行
sudo systemctl daemon-reload && sudo systemctl restart sshd
优化客户端连接行为(辅助但实用)
从源头减少瞬时并发压力,更稳定:
- 批量脚本中加入轻量退避,例如用
sleep 0.1或指数退避控制连接节奏 - 启用 SSH 连接复用(ControlMaster),让多个命令复用同一 TCP 连接,大幅降低新连接数:
在~/.ssh/config中配置:Host target-serverControlMaster autoControlPersist 4hControlPath ~/.ssh/sockets/%r@%h:%p - 若使用 Ansible,开启
pipelining = True和ssh_args = -o ControlMaster=auto -o ControlPersist=60s,效果显著

















