AWSHigh
Fix: AWS EC2 Instance Unreachable via SSH
SSH connection times out: 'Connection timed out'
!Symptoms
- SSH connection times out: 'Connection timed out'
- SSH connection refused: 'Connection refused'
- Instance is Running in console but unreachable
- Cannot ping the instance public IP
?Root Causes
- Security group does not allow inbound SSH (port 22) from your IP
- Network ACL blocking traffic
- Instance has no public IP or Elastic IP assigned
- SSH daemon (sshd) is not running on the instance
- Wrong key pair being used for authentication
- Instance is in a private subnet without NAT gateway or bastion
#Diagnosis Steps
- 1Check instance state in AWS Console: should be 'running' with status checks passed
- 2Check security group rules: `aws ec2 describe-security-groups --group-ids <sg-id>`
- 3Verify the instance has a public IP: `aws ec2 describe-instances --instance-ids <id> --query 'Reservations[].Instances[].PublicIpAddress'`
- 4Check VPC route table for internet gateway route
- 5Use EC2 Instance Connect or SSM Session Manager as alternative access
- 6Check system log: `aws ec2 get-console-output --instance-id <id>`
>Fix
- 1Add inbound SSH rule to security group: `aws ec2 authorize-security-group-ingress --group-id <sg-id> --protocol tcp --port 22 --cidr <your-ip>/32`
- 2Assign a public IP or Elastic IP if the instance lacks one
- 3Fix Network ACL to allow inbound/outbound on port 22
- 4Use SSM Session Manager for access without SSH: `aws ssm start-session --target <instance-id>`
- 5If sshd is down, use EC2 user data or instance connect to restart it
*Prevention
- Use SSM Session Manager instead of direct SSH for better security
- Restrict SSH access to specific IPs, not 0.0.0.0/0
- Set up a bastion host or VPN for private subnet access
- Monitor instance status checks and set up auto-recovery
- Use infrastructure as code to manage security groups consistently
Related Error Messages
Connection timed outConnection refusedPermission denied (publickey)No route to hostNetwork is unreachable