这个坑值得记一笔。阿里云 ECS 上 CentOS 7.9,ssh 连上去之后停在 debug1: SSH2_MSG_KEXINIT sent 不动,过一会儿超时断开,同网段其他机器正常,安全组看着也放行了 22 端口。
刚开始盯着「fail2ban 把来源 IP 加进了黑名单,握手阶段就被丢弃」,折腾了半个多小时,排掉了。
这类报错背后常见的原因有几处,逐个排除就行。链路 MTU 不一致,KEXINIT 这种大包被中间设备丢弃;sshd 的 UseDNS 开着,反向解析卡在不可达的 DNS 上;sshd 的 MaxStartups 到了上限,新连接被随机丢掉。
第一件事是看卡在哪一步
ssh -vvv -o ConnectTimeout=10 root@10.0.0.31 2>&1 | tail -20
随后确认 MTU 和分片情况
ping -M do -s 1400 -c 3 10.0.0.31
接着关掉 UseDNS 再重载服务
sed -i 's/^#*UseDNS.*/UseDNS no/' /etc/ssh/sshd_config && systemctl reload sshd
末了检查是不是被 fail2ban 拦了
fail2ban-client status sshd | tail -5
白天有业务在跑,能验证的部分都压到了晚上做。
改完先别撤,确认这几项。ssh -vvv 能走到 Authentication succeeded,登录耗时稳定在一秒内,同网段机器不再出现握手中断。
容易忽略的是,UseDNS 开着而 DNS 不可达时,每次登录都要拖五秒以上,内网机器基本都该关掉;MTU 问题调 sshd 没用,得在链路上把 MSS 钳住。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。
