辛辛苦苦起了一台EC2,结果SSH连上去一直转圈圈,最后弹出一个"Connection timed out"。或者网站服务跑起来了,浏览器访问就是打不开。这事儿遇到一次就够让人血压升高的。别急着删了重开,按下面这个顺序捋一遍,大多数情况都能揪出元凶。
第一站:安全组——90%的超时都是它拦下来的
安全组(Security Group)就是贴在实例外面的门禁系统。你连不上,大概率是门禁没给你开门。
去EC2控制台找到你的实例,看"安全组"选项卡。点进去检查入站规则(Inbound rules)。SSH对应的是22端口,HTTP是80,HTTPS是443。看看这些端口的"来源"(Source)列填的是什么。
如果你把来源设成了0.0.0.0/0(全世界任何地方都能连),那说明门禁是开放的。如果设成了某个具体IP,比如你家宽带的公网IP,那只有那个IP能进来。如果你的IP变了(比如重启了路由器),那自然被拒之门外。
有个小技巧:如果你实在搞不清自己当前IP是什么,直接去百度搜"IP"就能看到。复制那个地址,加个/32(表示只允许这一个IP),填到安全组里。
出站规则一般不用管,默认是全部放通的。但如果你手欠改过,记得检查出站是否允许了目标端口和协议。
第二站:实例有没有公网IP?
这是个很容易忽略的点。如果你启动实例时没有勾选"自动分配公网IP",或者你用的是启动模板(Launch Template)默认没分配,那这台机器就只有内网地址。
你去ping那个公网IP是肯定不通的——因为压根就没有。这种情况要么给实例绑定一个弹性IP(Elastic IP,固定不变的公网地址),要么停掉实例重新启动,在启动配置里把"自动分配公网IP"打开。
注意:默认的EC2公网IP是动态的,每次停止再启动就会变。如果你依赖这个IP来做解析或者配置,建议换成弹性IP,虽然每月闲置时收一点点钱,但省心。
第三站:网络ACL——安全组之外的另一道门
比安全组更底层的是网络ACL(Network Access Control List,相当于子网级别的防火墙)。如果你在VPC里改过默认的网络ACL规则,它可能会在安全组之前就把流量挡掉。
去VPC控制台找到"网络ACL",检查关联到你EC2所在子网的那一套。入站和出站都需要允许临时端口(Ephemeral Ports,范围通常是1024-65535),因为TCP握手需要这些端口来回传数据。很多人只开了22端口入站,忘了开高位端口出站,结果SSH握手到一半卡死了。
第四站:操作系统内部的防火墙
安全组放行了,操作系统里还跑着防火墙呢。Ubuntu默认的ufw,Amazon Linux默认的firewalld,都有可能挡掉外部连接。
如果你是Amazon Linux 2或2023,可以跑这条命令看看防火墙状态:
text
sudo systemctl status firewalld如果显示active,说明开着。可以暂时关掉测试:
text
sudo systemctl stop firewalld能连上了再根据需要去开端口,别一直关着。
Ubuntu的话用:
text
sudo ufw status第五站:sshd服务有没有跑起来?
有时候实例起来了,但sshd进程挂了。用AWS控制台里的"系统日志"(System Log)或者"实例截图"(Instance Screenshot)看看启动过程有没有报错。
如果你启用了会话管理器(Session Manager),可以直接从浏览器开一个命令行进去,省去SSH这一步。进去后执行:
text
sudo systemctl status sshd看看状态是不是active。如果没跑,手动start一下。
第六站:路由表和互联网网关
这个相对少见,但确实发生过。如果你是在自定义VPC里起实例,而不是用的默认VPC,得检查子网关联的路由表里有没有一条指向互联网网关(Internet Gateway)的0.0.0.0/0路由。
去VPC控制台看"路由表",找到你子网关联的那张表。目标(Destination)0.0.0.0/0,目标(Target)必须是igw-xxxxxxxx。如果这条缺失,那你的实例跟外部网络根本不通。