更改实例的 sshd_config 文件后,如何使用 SSH 访问我的 EC2 实例?

2 分钟阅读
0

我更改了 Amazon Elastic Compute Cloud(Amazon EC2)实例的 sshd_config 文件,现在无法使用 SSH 访问我的实例。

简短描述

通过 SSH 连接时,更改实例的 sshd_config 文件可能会导致连接被拒绝错误。

要确认是否因连接被拒绝错误而无法访问实例,请在启用详细消息的情况下通过 SSH 访问该实例。请参阅以下示例:

$ ssh -i "myawskey.pem" ec2-user@ec2-11-22-33-44.eu-west-1.compute.amazonaws.com -vvv

此示例与 DNS 名称连接,并使用 myawskey.pem 作为私有密钥文件、ec2-user 作为用户名。将示例的密钥文件和用户名替换为您的密钥文件和用户名。

以下输出示例显示了连接被拒绝错误消息:

OpenSSH_7.9p1, LibreSSL 2.7.3
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 48: Applying options for *
debug1: Connecting to ec2-11-22-33-44.eu-west-1.compute.amazonaws.com port 22.
ssh: connect to host ec2-11-22-33-44.eu-west-1.compute.amazonaws.com port 22: Connection refused

解决方法

**注意:**如果您使用的是基于 Nitro 的实例,则设备名称不同于下列步骤中给出的示例。例如,基于 Nitro 的实例上的设备名称不是 /dev/xvda/dev/sda1,而是 /dev/nvme。有关更多信息,请参阅 Linux 实例上的设备名称

方法 1: 使用 EC2 Serial Console

如果您激活了适用于 Linux 的 EC2 Serial Console,则可以将其用于对受支持的基于 Nitro 的实例类型进行问题排查。串行控制台可帮助您排查启动问题、网络配置和 SSH 配置问题。串行控制台无需有效的网络连接即可连接到您的实例。使用 Amazon EC2 控制台或 AWS 命令行界面(AWS CLI)访问串行控制台。

在使用串行控制台之前,请在账户级别授予对控制台的访问权限。然后,创建 AWS Identity and Access Management(IAM)策略,授予对您的 IAM 用户的访问权限。此外,每个使用串行控制台的实例都必须包含至少一个基于密码的用户。如果您的实例无法访问,且您没有配置对串行控制台的访问权限,请按照方法 2: 使用救援实例部分中的说明进行操作。有关如何配置适用于 Linux 的 EC2 Serial Console 的信息,请参阅配置对 EC2 Serial Console 的访问权限

**注意:**如果在运行 AWS CLI 命令时收到错误,请确保您使用的是最新版本的 AWS CLI

方法 2: 使用救援实例

警告:

  • 如果您的实例是由实例存储提供支持,或者具有包含数据的实例存储卷,则数据会在实例停止时丢失。有关更多信息,请参阅确定实例的根设备类型
  • 如果您的实例是 Amazon EC2 Auto Scaling 组的一部分,则停止实例可能同时导致其终止。使用 Amazon EMR、AWS CloudFormation 或 AWS Elastic Beanstalk 启动的实例可能是 AWS Auto Scaling 组的一部分。在这种情况下,是否会发生实例终止取决于您的自动扩缩组的实例缩减保护设置。如果您的实例是自动扩缩组的一部分,则在开始执行解决步骤之前,请暂时从自动扩缩组中删除该实例
  • 停止和启动实例都会更改其公共 IP 地址。如果您不希望 EC2 公共 IP 地址在重启或终止实例时发生变化,请使用弹性 IP 地址。如果您使用的是 Amazon Route 53,则在公共 IP 发生变化时可能需要更新 Route 53 DNS 记录

1.    在您的虚拟私有云(VPC)中启动新的 EC2 实例。在同一可用区中使用与受损实例相同的亚马逊云机器镜像(AMI)。这一新实例将成为您的救援实例。

2.    停止受损实例

3.    将 Amazon Elastic Block Store(Amazon EBS)根卷 (/dev/xvda or /dev/sda1) 与受损实例分离

4.    将 EBS 卷作为辅助设备 (/dev/sdf) 附加到救援实例。

5.    使用 SSH 连接到您的救援实例

6.    运行 lsblk 命令查看设备:

$ lsblk
NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda    202:0    0   8G  0 disk
└─xvda1 202:1    0   8G  0 part /
xvdf    202:80   0   8G  0 disk
 └─xvdf1 202:81   0   8G  0 part

7.    为您在第 4 步中附加到救援实例的新卷创建一个挂载点目录 (/rescue):

$ sudo mkdir /mnt/rescue

8.    将该卷挂载到您在第 7 步中创建的目录:

$ sudo mount -t xfs -o nouuid /dev/xvdf1 /mnt/rescue/

要挂载 ext3 和 ext4 文件系统,请运行以下命令:

$ sudo mount /dev/xvdf1 /mnt/rescue

**注意:**前面的挂载命令的语法可能与此处不同。有关更多信息,请运行 man mount 命令。

9.    再次运行 lsblk 命令,验证该卷是否挂载到该目录:

$ lsblk
NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda    202:0    0   8G  0 disk
└─xvda1 202:1    0   8G  0 part /
xvdf    202:80   0   8G  0 disk
└─xvdf1 202:81   0   8G  0 part /mnt/rescue

更正或复制 sshd_config 文件

您可以调查受损实例上的 sshd_config 文件,并在需要时回滚您的更改。使用 SSH 详细消息输出将您引导至文件中的错误位置:

$ sudo vi /mnt/rescue/etc/ssh/sshd_config

或者,运行以下命令将 sshd_config 文件从救援实例复制到您的受损实例。此命令替换原始实例上 sshd_config 文件的内容:

$ sudo cp /etc/ssh/sshd_config /mnt/rescue/etc/ssh/sshd_config

将卷重新连附加到原始实例并测试连接

注意:如果您使用方法 2: 使用救援实例,请完成以下步骤。

1.    运行 umount 命令来卸载该卷:

$ sudo umount /mnt/rescue/

2.    将辅助卷与救援实例分离,然后将该卷作为 /dev/xvda(根卷)附加到原始实例。

3.    启动实例

4.    使用 SSH 连接到该实例,验证其是否可以访问。

相关信息

为什么我无法使用 SSH 连接到我的 Amazon EC2 Linux 实例?

AWS 官方
AWS 官方已更新 1 年前