问题出现得很突然,日志倒是留得挺全。发布系统同时向四十台机器推送,sshd 日志里出现 beginning MaxStartups throttling,部分机器直接报 Connection closed by remote host,发布任务随机失败。

刚开始盯着「客户端没复用连接,每次执行都新建 SSH 会话」,折腾了半个多小时,排掉了。

这类报错背后常见的原因有几处,逐个排除就行。默认 MaxStartups 是 10:30:100,未认证连接超过十就开始随机丢。另一种情况是LoginGraceTime 太长,卡住的连接把名额一直占着。

不容易想到的是,fail2ban 把短时间高频连接当成暴力破解封掉。

上来先确认日志里的限流记录

grep -i 'MaxStartups' /var/log/secure | tail

调大未认证连接的上限

grep -nE 'MaxStartups|LoginGraceTime' /etc/ssh/sshd_config

缩短认证等待时间并重载

sshd -t && systemctl reload sshd

等前面都确认过,再用并发方式验证不再被拒

for i in $(seq 1 40); do ssh -o BatchMode=yes host$i true & done; wait

别只看报错消失,验证要多做一步。并发四十个连接全部成功建立,secure 日志里不再出现 throttling 记录,发布任务一次通过。

这里还有个坑。调大 MaxStartups 会放大暴力破解的面,配合 fail2ban 和密钥登录一起用;更彻底的办法是让发布系统开 ControlMaster 复用连接。报错文案容易误导,真正的原因往往在相邻那一层的日志里。

作者 9823189