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

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

问题现象

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

  • SFTP工具无法建立连接

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

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

系统化排查流程

1. 基础状态检查

1.1 实例状态验证

# 通过AWS CLI检查实例状态
 

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

确保实例状态为 running,而不是 stoppedstopping 或 pending

1.2 系统状态检查

在AWS控制台中检查:

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

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

2. 网络配置排查

2.1 安全组配置检查

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

确保有以下规则:

  • 类型:SSH

  • 协议:TCP

  • 端口范围:22

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

2.2 网络ACL检查

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

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

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

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

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

3. 实例级别排查

3.1 使用EC2 Instance Connect测试

如果启用了EC2 Instance Connect:

# 通过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访问实例:

# 启动会话
aws ssm start-session --target i-1234567890abcdef0

前提条件

  • 实例已安装SSM Agent

  • 实例具有适当的IAM角色

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

4.1 检查SSH服务状态

通过Session Manager连接后:

# 检查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 检查磁盘空间
# 检查磁盘使用情况
df -h

# 检查根分区是否已满
du -sh /var/log/*
4.3 检查系统日志
# 查看系统日志
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关联
# 查看弹性IP关联
aws ec2 describe-addresses --filters "Name=instance-id,Values=i-1234567890abcdef0"
5.2 检查网络接口
# 查看网络接口详情
aws ec2 describe-network-interfaces --filters "Name=attachment.instance-id,Values=i-1234567890abcdef0"

6. 高级故障排除

6.1 使用VPC Reachability Analyzer
# 创建路径分析
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 检查实例元数据
# 从实例内部获取元数据(通过Session Manager)
curl http://169.254.169.254/latest/meta-data/
问题2:磁盘空间不足

解决方案

# 清理日志文件
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备份:

aws ec2 create-image \
    --instance-id i-1234567890abcdef0 \
    --name "Production-Server-Backup-$(date +%Y%m%d)" \
    --description "Backup before maintenance"
8.2 使用启动模板和用户数据
#!/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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值