使用基于浏览器的 SSH 控制台访问我的 Lightsail 实例时,为什么我会收到 UPSTREAM_ERROR、UPSTREAM_NOT_FOUND、或 CLIENT_UNAUTHORIZED 错误提示?
上次更新时间:2021 年 11 月 24 日
使用基于浏览器的 SSH 控制台连接到我的 Amazon Lightsail 实例时,我收到以下错误消息之一:
- 您的实例遇到错误并已关闭连接。请重试或联系客户支持。UPSTREAM_ERROR [515]
- 发生错误,我们无法连接到与您的实例或保持连接状态。如果此实例刚刚启动,请在一两分钟后重试。UPSTREAM_NOT_FOUND [519]
- 登录失败。如果此实例刚刚启动,请在一两分钟后重试。CLIENT_UNAUTHORIZED [769]
如何对这些错误进行故障排除?
简短描述
UPSTREAM_ERROR [515] 和 UPSTREAM_NOT_FOUND [519] 错误表示使用 SSH 时无法访问您的 Lightsail 实例。以下是这些错误的常见原因:
- 实例启动失败、实例状态检查失败或实例上的资源过度使用。
- 操作系统级防火墙正在阻止 SSH 端口访问。
- 默认 SSH 端口 (22) 已更改为另一个端口。
- SSH 服务已关闭。
CLIENT_UNICENCOUNFIED [769] 错误表示您的 Lightsail 实例中存在 SSH 身份验证问题。以下是发生此错误的常见原因:
- /etc/ssh/lightsail_instance_ca.pub 中的 Lightsail 系统密钥配置错误。
- 您已将 Ubuntu 实例从旧版本升级到 20.04 或更高版本。
解决方法
实例启动失败、实例状态检查失败或实例上的资源过度使用
查看实例的状态检查指标,以确定实例的系统状态检查或实例状态检查是否失败。
系统状态检查
如果系统状态检查失败,则说明实例的底层硬件运行状况不佳。要解决此问题,请先停止然后启动该实例。这会将该实例迁移到运行良好的硬件。
警告:请注意,实例的公有 IP 地址在每次停止和启动实例时都会更改。如果您希望 IP 地址在每次停止和启动实例时都保持不变,请附上一个静态 IP 地址。
实例状态检查
如果实例状态检查失败,则可能是操作系统级别的问题导致启动错误。或者,实例的资源(例如 CPU 或内存)可能被过度利用。对于故障排除步骤,请参阅如何排查导致我的 Lightsail 实例无响应的常见问题?
操作系统级防火墙正在阻止 SSH 端口访问
基于浏览器的 SSH 访问使用 Amazon 内部 IP 地址连接到您的 Lightsail 实例。如果操作系统级防火墙(如 Iptables、UFW 等)或访问控制文件,如 /etc/hosts.deny (即基于 cPanel 的实例中的主机访问控制)仅允许 SSH 访问一组 IP 地址而拒绝所有其他 IP 地址,则您会收到 UPSTREAM_NOT_FOUND [519] 或 UPSTREAM_ERROR [515] 错误。如果防火墙完全阻止 SSH 访问,也会出现同样的问题。
要解决此问题,请执行下列操作之一:
- 如果使用终端或 PuTTY 应用程序对实例进行 SSH 访问有效,则登录实例并从防火墙和 /etc/hosts.deny 文件中删除拒绝规则。
- 如果您有 cPanel 实例,请访问 WHM 控制台以删除防火墙规则。
- 如果您无法通过终端或 PuTTY 应用程序使用 SSH 连接到实例,请使用启动脚本停用防火墙。只有在启动实例时才能添加启动脚本。要使用启动脚本停用操作系统级防火墙、Iptables 和 UFW,请执行以下操作:
1. 打开 Amazon Lightsail 控制台。
2. 创建实例的手动快照。
3. 在 Snapshots (快照)选项卡上的 Manual snapshots (手动快照)项下,选择新快照旁边的三个点。
4. 选择 Create new instance (创建新实例)。
5. 选择与上一个实例相同的可用区域。
6. 选择 Add launch script (添加启动脚本),然后添加以下脚本。
注意:以下示例停用 UFW 防火墙,刷新所有 iptable 链或防火墙规则,并通过重命名 /etc/hosts.deny 文件来停用该文件。
sudo ufw disable
sudo iptables -F
sudo mv /etc/hosts.deny /etc/hosts.deny_backup
sudo touch /etc/hosts.deny
sudo systemctl enable sshd
sudo systemctl restart sshd
7. 选择新的实例计划,或使用与之前的实例相同的计划。
8. 输入实例的名称,然后选择 Create instance (创建实例)。
新实例开始运行后,等待 10 到 15 分钟,然后尝试使用基于浏览器的 SSH 控制台连接到该实例。
注意:如果以前的实例具有静态 IP 地址,则可以在新实例上使用它。分离静态 IP 地址,然后从 Networking (联网)选项卡将其附加到新实例。有关更多信息,请参阅 Amazon Lightsail 中的静态 IP 地址。
SSH 服务已关闭
如果 SSH 服务未在实例上运行或未处于活动状态,则 SSH 连接将失败,并且您会收到 UPSREAM_NOT_FUND [519] 错误消息。要解决此问题,请为您的 Lightsail 实例配置 AWS Systems Manager 会话管理器服务。配置会话管理器后,在没有 SSH 服务的情况下访问实例,然后修复 SSH 问题。
SSH 问题的基本故障排除步骤包括:
- 请查看 /var/log/auth.log 或 /var/log/secure 文件中的 SSH 身份验证日志以识别错误,具体取决于操作系统的版本。
- 测试 SSH 配置文件语法,然后更正所有错误。
sudo sshd -t
sudo systemctl restart sshd
Lightsail 系统密钥配置错误 /etc/ssh/lightsail_instance_ca.pub
Lightsail 使用系统密钥 /etc/ssh/lightsail_instance_ca.pub 来激活基于浏览器的 SSH 访问。如果缺少此文件,则 SSH 身份验证将失败,并且您会收到 CLIENT_UNAUTHORIZED [769] 错误提示。如果 Lightsail 系统密钥未在 SSH 配置文件 /etc/ssh/sshd_config 的 TrustedUserCAKeys 参数中进行指定,则会出现同样的错误。
如果通过终端或 PuTTY 应用程序与实例的 SSH 连接正常,则登录实例并确认 /etc/ssh/sshd_config 文件存在且其中包含 ssh-rsa 密钥。
如果文件丢失,请采取以下步骤重新创建文件:
1. 运行以下命令并确认已在命令输出中获得 ssh-rsa 密钥:
sudo cat /var/lib/cloud/instance/user-data.txt | grep ^ssh-rsa
2. 如果命令在输出中返回 ssh-rsa 密钥,则运行以下命令将其复制到 /etc/ssh/lightsail_instance_ca.pub:
sudo sh -c "cat /var/lib/cloud/instance/user-data.txt | grep ^ssh-rsa > /etc/ssh/lightsail_instance_ca.pub"
sudo sh -c "echo >> /etc/ssh/sshd_config"
sudo sh -c "echo 'TrustedUserCAKeys /etc/ssh/lightsail_instance_ca.pub' >> /etc/ssh/sshd_config"
sudo systemctl restart sshd
3. 如果您未从步骤 1 中获得 ssh-rsa 密钥,或者无法使用终端或 PuTTY 应用程序与实例进行 SSH 连接,请创建实例的手动快照并使用该快照启动新实例。实例启动时,Lightsail 系统密钥会自动添加到服务器中。
您已从较旧的 Ubuntu 版本升级到 20.04 或更高版本
对于运行 Ubuntu 20.04 或更高版本的实例,您必须允许证书颁发机构 (CA) 使用 ssh-rsa 算法对证书进行签名。否则,身份验证将失败,并且您会收到 CLIENT_UNAUTHORIZED [769] 错误提示。默认情况下,允许 CA 在 Ubuntu 20.04 实例中使用 ssh-rsa 算法。但是,如果您将旧版本的 Ubuntu 升级到 20.04,则必须手动允许 CA。为此,请执行以下操作:
1. 使用 SSH 客户端(如终端或 PuTTY 应用程序)连接到实例。
2. 打开 SSH 配置文件 (/etc/ssh/sshd_config)。
2. 在 CASignatureAlgorithms 行中添加 ssh_rsa。以下示例显示的是在修改为添加 ssh_rsa 之后的 CASignatureAlgorithms 行:
CASignatureAlgorithms ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,ssh-ed25519,rsa-sha2-512,rsa-sha2-256,ssh-rsa
3. 运行以下命令以重新启动 sshd 服务:
$ sudo systemctl restart sshd