无AWS控制台权限,如何通过SSH检查EC2入站端口是否开放?
不用登录AWS控制台验证80端口状态的方法(附问题定位逻辑)
我来帮你梳理几个不用登录AWS控制台就能验证80端口状态的方法,还能帮你区分到底是Nginx配置的问题,还是端口真的没开放:
一、先在EC2实例内部验证端口监听状态(排除Nginx配置问题)
你已经能通过pem登录实例,先从内部确认Nginx是不是真的在监听公网可访问的80端口:
- 用
ss命令检查端口监听:
重点看输出里的ss -tulnp | grep :80LISTEN状态,以及监听的地址是不是0.0.0.0:80(允许所有IP访问)或者你的EC2公网IP:80。如果只显示127.0.0.1:80,那说明Nginx只监听本地回环地址,外部肯定访问不了,得去改Nginx配置里的listen指令。 - 用
lsof命令确认进程关联:
查看lsof -i :80LISTEN行的COMMAND列是不是nginx,同时确认NAME列的地址包含公网可访问的IP段。
二、从外部机器测试端口连通性(直接验证公网能否访问)
找一台能连公网的外部机器(比如你自己的本地电脑),执行以下命令测试:
- telnet测试:
如果显示telnet 你的EC2公网IP 80Connected to xxx,说明端口是通的;如果一直卡在Trying xxx...或者提示Connection refused,那端口大概率没开放。 - netcat(nc)测试:
这个工具比telnet更简洁,成功会输出nc -zv 你的EC2公网IP 80Connection to xxx 80 port [tcp/http] succeeded!,失败会直接提示超时或连接被拒绝。 - curl测试:
如果是端口不通,会直接超时;如果能拿到响应(比如404、500等错误),说明端口是通的,问题出在Nginx的配置或者网站内容上。curl 你的EC2公网IP
三、在EC2实例上用AWS CLI验证安全组/网络ACL(查AWS层面的防火墙)
如果内部监听正常、外部测试不通,那大概率是AWS的安全组或网络ACL没开80端口。你可以在实例上用AWS CLI查询(前提是实例已经附加了允许查看EC2资源的IAM角色,或者你已经在实例上配置了AWS凭证):
- 先获取当前实例的ID(用EC2元数据服务,本地就能访问):
curl http://169.254.169.254/latest/meta-data/instance-id - 获取实例关联的安全组ID:
aws ec2 describe-instances --instance-id 你的实例ID --query 'Reservations[0].Instances[0].SecurityGroups[0].GroupId' --output text - 查看安全组的入站规则:
检查aws ec2 describe-security-groups --group-ids 安全组IDIpPermissions里有没有针对80端口(FromPort: 80)、来源为0.0.0.0/0(允许所有公网IP)或者你的外部IP段的规则。 - 查看子网关联的网络ACL:
检查入站规则里有没有aws ec2 describe-network-acls --filters Name=association.subnet-id,Values=$(aws ec2 describe-instances --instance-id 你的实例ID --query 'Reservations[0].Instances[0].SubnetId' --output text)RuleAction: allow且覆盖80端口的条目,同时出站规则要允许所有或相关端口(比如允许80/443出站)。
排查逻辑总结
- 先确认Nginx在实例内部是否正确监听公网IP的80端口→排除Nginx配置问题;
- 再从外部测试端口连通性→判断端口是否真的对外开放;
- 最后用AWS CLI查安全组/网络ACL→确认AWS层面的防火墙规则。
内容的提问来源于stack exchange,提问作者Mars Lee
相关产品推荐
相关产品推荐

