SSH 连接报错排查全记录:从 Connection Reset 到 PowerShell 的 BOM 坑

The Redefine Team Lv5

最近在配置一台 FreeBSD 服务器(Hostuno)的 SSH 免密登录时,遇到了一系列“经典”的连接错误。从最初的连接被重置,到密钥无法识别,最后发现竟然是 Windows PowerShell 管道操作留下的编码“暗坑”。

本文记录了完整的排查过程和解决方案,希望能帮到遇到类似问题的朋友。

1. 遭遇报错:Connection Reset

在使用 SSH 连接服务器时,直接报错退出:

kex_exchange_identification: read: Connection reset
Connection reset by 213.189.54.223 port 22
原因分析
这个错误通常意味着服务器在 SSH 握手阶段(Key Exchange)之前就切断了连接。常见原因有:

IP 被封禁:服务器安装了 Fail2Ban 等防护软件,检测到多次失败尝试后暂时封锁 IP。

防火墙拦截:中间网络设备或 GFW 阻断了连接。

解决
等待了约 10-20 分钟后,IP 封锁自动解除,连接恢复正常。但此时仍需输入密码登录,尚未实现免密。

2. 配置免密登录却失败
为了实现免密登录,我在 Windows 本地通过 PowerShell 将公钥写入服务器:

PowerShell

type $env:USERPROFILE\.ssh\id_ed25519.pub | ssh user@host "cat >> .ssh/authorized_keys"
但在再次连接时,服务器依然提示输入密码,并未自动使用密钥。

开启调试模式
使用 -v 参数查看详细日志:

Bash

ssh -v user@host
日志显示关键信息:

Plaintext

debug1: Offering public key: ... RSA SHA256:f0d... explicit
debug1: Authentications that can continue: publickey,keyboard-interactive
debug1: Next authentication method: keyboard-interactive
解读:客户端成功发送了公钥,但服务器拒绝接受(直接跳过并转入密码验证)。这说明服务器端的 authorized_keys 配置有问题。

3. 揪出元凶:PowerShell 的 BOM 标记
登录服务器,检查 authorized_keys 文件内容:

Bash

cat ~/.ssh/authorized_keys
乍看之下内容似乎正常,但仔细观察输出的开头:

Plaintext

ssh-rsa AAAAB3Nza...
注意 ssh-rsa 前面那个微小的、似乎不存在的空隙。这其实是一个 Windows BOM (Byte Order Mark) 标记。

根本原因
在 Windows PowerShell 中使用管道符(|)传输文本时,PowerShell 默认可能会使用 UTF-8 with BOM 或 UTF-16 编码发送数据。 当这些不可见字符被写入 Linux/Unix/FreeBSD 的 authorized_keys 文件头时,SSHD 守护进程无法识别该行配置,从而导致密钥验证失效。

4. 最终解决方案
步骤一:清除并重新写入纯净公钥
在服务器端直接操作,删除旧文件,用 echo 命令手动写入纯净的公钥字符串(避免复制文件时的编码污染):

Bash

# 1. 删除由于编码问题损坏的文件
rm ~/.ssh/authorized_keys

# 2. 写入纯净内容(注意:直接粘贴公钥字符串,不要包含换行符)
echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD..." > ~/.ssh/authorized_keys
步骤二:严格修正权限
FreeBSD 对权限要求极其严格,权限过大也会导致密钥失效:

Bash

chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
步骤三:移除本地私钥密码(可选)
如果你的私钥本身设有密码(Passphrase),连接时虽然不需要服务器密码,但需要输入“钥匙密码”。若想实现完全的“回车即进”,可以移除私钥密码:

PowerShell

# 在 Windows 终端运行
ssh-keygen -p -f .\.ssh\mysshkey.txt
输入旧密码。

新密码留空,直接回车两次。

总结
跨平台大忌:尽量不要直接用 Windows PowerShell 的管道(|)向 Linux/Unix 传输配置文件,极易出现 BOM 或换行符(CRLF)问题。

推荐做法:使用 scp 上传文件,或者直接在服务器用编辑器粘贴纯文本。

排查神器:遇到 SSH 连不上,第一时间用 ssh -v 查看卡在哪一步。
  • 标题: SSH 连接报错排查全记录:从 Connection Reset 到 PowerShell 的 BOM 坑
  • 作者: The Redefine Team
  • 创建于 : 2025-12-12 16:00:00
  • 更新于 : 2025-12-12 23:09:03
  • 链接: https://redefine.ohevan.com/2025/12/12/2025-12-12-SSH 连接报错排查全记录/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论
目录
SSH 连接报错排查全记录:从 Connection Reset 到 PowerShell 的 BOM 坑