问题描述
现象
- 从当前系统无法 SSH 连接到
host2 - 从当前系统可以正常 SSH 连接到
host1 - 从
host1可以正常 SSH 连接到host2
错误信息
Received disconnect from host2 port 22:2: Too many authentication failures
排查过程
1. 网络连通性检查
ping -c 3 host2 # ✅ 通
nc -zv host2 22 # ✅ 端口开放
ip route get host2 # ✅ 路由正常
2. SSH 详细调试
ssh -vvv user1@host2
发现连接建立后,在认证阶段失败:
- SSH agent 返回 10 个密钥
- 依次尝试所有密钥后被服务器断开
3. 检查本地 SSH Agent 密钥
ssh-add -l
发现 agent 中有 10 个密钥:
3072 SHA256:EXAMPLE0001 user1@host1 (RSA)
256 SHA256:EXAMPLE0002 user2@host2 (ED25519)
256 SHA256:EXAMPLE0003 user3@host3 (ED25519)
4096 SHA256:EXAMPLE0004 user4@host4 (RSA)
256 SHA256:EXAMPLE0005 user5@host5 (ED25519)
4096 SHA256:EXAMPLE0006 user6@host6 (RSA)
256 SHA256:EXAMPLE0007 user7@host7 (ED25519)
3072 SHA256:EXAMPLE0008 user8@host8 (RSA)
3072 SHA256:EXAMPLE0009 user9@host9 (RSA)
3072 SHA256:EXAMPLE0010 user10@host10 (RSA)
4. 检查服务器 MaxAuthTries 配置
# 通过 host1 跳板查看
ssh user1@host1 "ssh user1@host2 'sshd -T | grep maxauthtries'"
输出:
maxauthtries 6
5. 对比 host1 的状态
ssh user1@host1 "ssh-add -l 2>/dev/null | wc -l"
输出:
0 # agent 中没有密钥
根因分析
┌─────────────────┐
│ 当前系统 │
│ SSH Agent: 10 │ ─────┐
└─────────────────┘ │
▼
┌─────────────────┐
│ host2 │
│ MaxAuthTries: 6 │
└─────────────────┘
│
│ 尝试10个密钥 > 6次限制
▼
❌ Connection closed
| 源 | SSH Agent 密钥数 | 目标 | MaxAuthTries | 结果 |
|---|---|---|---|---|
| 当前系统 | 10 | host2 | 6 | ❌ 失败 |
| 当前系统 | 10 | host1 | ? | ✅ 成功 |
| host1 | 0 | host2 | 6 | ✅ 成功 |
SSH 工作原理:
- SSH 客户端连接时会依次尝试 agent 中的所有密钥
- 每次被拒绝计入一次认证尝试
- 达到
MaxAuthTries限制后,服务器断开连接 - 默认
MaxAuthTries = 6
解决方案
方案 1:临时禁用 SSH Agent(推荐用于紧急连接)
SSH_AUTH_SOCK="" ssh user1@host2
方案 2:仅使用密码认证
ssh -o "IdentitiesOnly=yes" -o "PreferredAuthentications=password" user1@host2
方案 3:清空本地 SSH Agent
# 清空所有密钥
ssh-add -D
# 然后正常连接
ssh user1@host2
方案 4:在 SSH 配置中指定
编辑 ~/.ssh/config:
Host host2
User user1
IdentitiesOnly yes
IdentityFile ~/.ssh/id_ed25519
方案 5:提高服务器 MaxAuthTries(需要修改服务器配置)
在 host2 上编辑 /etc/ssh/sshd_config:
MaxAuthTries 10
重启 sshd:
systemctl restart sshd
预防措施
定期清理 SSH Agent
ssh-add -D # 清空所有 ssh-add -d ~/.ssh/key_file # 删除指定密钥使用
IdentitiesOnly yes- 在
~/.ssh/config中为每个主机明确指定密钥 - 避免尝试无关的密钥
- 在
管理 Agent 中的密钥
- 只添加当前需要的密钥到 agent
- 避免使用
AddKeysToAgent yes全局选项
相关命令速查
# 查看 agent 中的密钥
ssh-add -l
# 查看密钥指纹
ssh-keygen -l -f ~/.ssh/key.pub
# 测试模式查看 sshd 配置
sshd -T | grep maxauthtries
# SSH 详细调试
ssh -vvv user@host
# 检查端口连通性
nc -zv host 22