AWS EC2实例重启后SSH/SFTP连接失败的全面排查指南

在AWS云环境中,EC2实例重启后无法通过SSH或SFTP连接是一个常见问题。本文将从多个维度分析可能的原因,并提供详细的解决方案。

问题现象

  • SSH客户端连接超时或连接被拒绝

  • SFTP工具无法建立连接

  • 实例状态显示运行中但网络不可达

简单排查:可能是安全组、网络ACL或实例配置问题导致连接失败。建议检查安全组入站规则、网络连接和实例状态。

系统化排查流程

1. 基础状态检查

1.1 实例状态验证

通过AWS CLI检查实例状态

bash 复制代码
aws ec2 describe-instances --instance-ids i-1234567890abcdef0 --query 'Reservations[0].Instances[0].State.Name'

确保实例状态为 running ,而不是 stoppedstoppingpending

1.2 系统状态检查

在AWS控制台中检查:

  • 系统状态检查:验证底层硬件问题

  • 实例状态检查:验证操作系统级别问题

2. 网络配置排查

2.1 安全组配置检查

安全组必须允许SSH流量(端口22):

确保有以下规则:

  • 类型:SSH

  • 协议:TCP

  • 端口范围:22

  • 来源:您的IP地址或 0.0.0.0/0(临时测试)

2.2 网络ACL检查

检查子网的网络ACL是否阻止SSH流量:

bash 复制代码
# 查看网络ACL规则
aws ec2 describe-network-acls --filters "Name=association.subnet-id,Values=subnet-12345678" --query 'NetworkAcls[0].Entries'

确保入站和出站规则都允许SSH流量。

2.3 路由表验证
bash 复制代码
# 检查路由表
aws ec2 describe-route-tables --filters "Name=association.subnet-id,Values=subnet-12345678"

确保有指向互联网网关或NAT设备的路由。

3. 实例级别排查

3.1 使用EC2 Instance Connect测试

如果启用了EC2 Instance Connect:

bash 复制代码
# 通过Instance Connect连接
aws ec2-instance-connect send-ssh-public-key \
    --instance-id i-1234567890abcdef0 \
    --availability-zone us-east-1a \
    --instance-os-user ec2-user \
    --ssh-public-key file://my_key.pub
3.2 使用Session Manager连接(无需SSH)

通过AWS Systems Manager Session Manager访问实例:

bash 复制代码
# 启动会话
aws ssm start-session --target i-1234567890abcdef0

前提条件

  • 实例已安装SSM Agent

  • 实例具有适当的IAM角色

4. 操作系统级别问题排查

4.1 检查SSH服务状态

通过Session Manager连接后:

bash 复制代码
# 检查SSH服务状态
sudo systemctl status sshd
sudo systemctl status ssh

# 如果服务停止,启动服务
sudo systemctl start sshd
sudo systemctl enable sshd

# 检查SSH配置
sudo cat /etc/ssh/sshd_config | grep -v "^#" | grep -v "^$"
4.2 检查磁盘空间
bash 复制代码
# 检查磁盘使用情况
df -h

# 检查根分区是否已满
du -sh /var/log/*
4.3 检查系统日志
bash 复制代码
# 查看系统日志
sudo tail -f /var/log/messages
sudo journalctl -u sshd -f

# 检查cloud-init日志
sudo cat /var/log/cloud-init.log
sudo cat /var/log/cloud-init-output.log

5. 弹性IP与网络接口

5.1 检查弹性IP关联
bash 复制代码
# 查看弹性IP关联
aws ec2 describe-addresses --filters "Name=instance-id,Values=i-1234567890abcdef0"
5.2 检查网络接口
bash 复制代码
# 查看网络接口详情
aws ec2 describe-network-interfaces --filters "Name=attachment.instance-id,Values=i-1234567890abcdef0"

6. 高级故障排除

6.1 使用VPC Reachability Analyzer
bash 复制代码
# 创建路径分析
aws ec2 create-network-insights-path \
    --source i-1234567890abcdef0 \
    --destination-port 22 \
    --protocol tcp

# 启动分析
aws ec2 start-network-insights-analysis \
    --network-insights-path-id <path-id>
6.2 检查实例元数据
bash 复制代码
# 从实例内部获取元数据(通过Session Manager)
curl http://169.254.169.254/latest/meta-data/
问题2:磁盘空间不足

解决方案

bash 复制代码
# 清理日志文件
sudo journalctl --vacuum-size=100M
sudo rm -f /var/log/*.log.*
sudo truncate -s 0 /var/log/*.log

# 清理包缓存
sudo yum clean all  # Amazon Linux
sudo apt clean     # Ubuntu
问题3:文件系统错误

解决方案

  1. 停止实例

  2. 分离根卷

  3. 挂载到临时实例进行修复

  4. 重新挂载并启动原实例

8. 预防措施

8.1 创建自定义AMI

定期创建已知良好的AMI备份:

bash 复制代码
aws ec2 create-image \
    --instance-id i-1234567890abcdef0 \
    --name "Production-Server-Backup-$(date +%Y%m%d)" \
    --description "Backup before maintenance"
8.2 使用启动模板和用户数据
bash 复制代码
#!/bin/bash
# 用户数据脚本 - 自动修复常见问题
yum update -y
systemctl enable sshd
echo "fs.file-max = 65536" >> /etc/sysctl.conf
sysctl -p
8.3 监控和告警

设置CloudWatch告警:

  • CPU使用率

  • 磁盘空间

  • 网络流量

  • 状态检查失败

总结

当AWS EC2实例重启后无法SSH连接时,建议按照以下顺序排查:

  1. 基础状态:实例运行状态和系统检查

  2. 网络配置:安全组、网络ACL、路由表

  3. 实例访问:使用Session Manager或EC2 Instance Connect

  4. 操作系统:SSH服务状态、磁盘空间、系统日志

  5. 高级诊断:VPC Reachability Analyzer

  6. 急速开户:https://mycloudpartners.com/https://mycloudpartners.com/

相关推荐
yuxb734 小时前
LNMP部署及应用
笔记·云计算
chen_note8 小时前
Kubernetes1.23版本搭建(三台机器)
运维·容器·kubernetes·云计算·kubepi
@HNUSTer8 小时前
基于 GEE 的 MODIS 数据逐月植被覆盖度(FVC)计算与数据导出完整流程
云计算·数据集·遥感大数据·gee·云平台·fvc·modis
wanhengidc9 小时前
海外云手机是指什么
运维·服务器·游戏·智能手机·云计算
AWS官方合作商10 小时前
AWS Lambda的安全之道:S3静态加密与运行时完整性检查的双重保障
安全·云计算·aws
boonya1 天前
ChatBox AI 中配置阿里云百炼模型实现聊天对话
人工智能·阿里云·云计算·chatboxai
AKAMAI1 天前
AI 边缘计算:决胜未来
人工智能·云计算·边缘计算
阿里云云原生1 天前
阿里云微服务引擎 MSE 及 API 网关 2025 年 10 月产品动态
阿里云·微服务·云原生·云计算