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,而不是 stopped、stopping 或 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:文件系统错误
解决方案:
-
停止实例
-
分离根卷
-
挂载到临时实例进行修复
-
重新挂载并启动原实例
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连接时,建议按照以下顺序排查:
-
基础状态:实例运行状态和系统检查
-
网络配置:安全组、网络ACL、路由表
-
实例访问:使用Session Manager或EC2 Instance Connect
-
操作系统:SSH服务状态、磁盘空间、系统日志
-
高级诊断:VPC Reachability Analyzer
-
急速开户:https://mycloudpartners.com/
https://mycloudpartners.com/
