问题描述

现象

  • 从当前系统无法 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结果
当前系统10host26❌ 失败
当前系统10host1?✅ 成功
host10host26✅ 成功

SSH 工作原理:

  1. SSH 客户端连接时会依次尝试 agent 中的所有密钥
  2. 每次被拒绝计入一次认证尝试
  3. 达到 MaxAuthTries 限制后,服务器断开连接
  4. 默认 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

预防措施

  1. 定期清理 SSH Agent

    ssh-add -D  # 清空所有
    ssh-add -d ~/.ssh/key_file  # 删除指定密钥
    
  2. 使用 IdentitiesOnly yes

    • 在 ~/.ssh/config 中为每个主机明确指定密钥
    • 避免尝试无关的密钥
  3. 管理 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

参考链接