EC2实例内可访问Node服务器,本地浏览器连接超时(ERR_CONNECTION_TIMED_OUT)求助
排查EC2 Node服务外部无法访问的思路
我来帮你梳理下几个最常见的排查方向,都是EC2对外暴露服务时容易踩的坑:
检查Node服务的监听地址
很多时候我们启动Node服务时,默认只绑定了localhost(也就是127.0.0.1),这种情况下只有EC2实例内部能访问,外部请求根本打不进来。
你可以在EC2里执行命令查看当前Node服务的监听情况:netstat -tulpn | grep node # 或者用ss命令,更简洁 ss -tulpn | grep node如果输出里显示的是
127.0.0.1:xxxx,那就是监听地址的问题。修改你的代码,把listen的地址改成0.0.0.0,比如:app.listen(3000, '0.0.0.0', () => { console.log('Server running on port 3000'); });这样服务就会监听实例的所有网卡,外部就能访问了。
检查EC2安全组的入站规则
这是最容易忽略的关键点!AWS的安全组相当于实例的防火墙,必须明确开放服务对应的端口。
操作步骤:- 登录AWS控制台,找到你的EC2实例
- 在实例详情页找到「安全组」,点击进入
- 切换到「入站规则」标签,点击「编辑入站规则」
- 添加一条规则:类型选「自定义TCP」,端口范围填你的Node服务端口(比如3000),来源选择
0.0.0.0/0(允许所有外部IP访问,测试用;生产环境建议改成你本地的公网IP更安全) - 保存规则后,再尝试从本地访问
检查子网的网络ACL(NACL)
如果安全组没问题,那就要看子网级别的网络ACL了。NACL是默认允许所有出入流量的,但如果被手动修改过,可能会拦截你的请求。
确认两点:- 入站规则里允许目标端口(你的Node服务端口)的TCP流量,来源
0.0.0.0/0 - 出站规则里允许Ephemeral Ports(通常是1024-65535)的TCP流量,因为服务响应需要用到这些端口
- 入站规则里允许目标端口(你的Node服务端口)的TCP流量,来源
检查EC2实例内部的防火墙
有些Linux发行版(比如CentOS、RHEL)自带firewalld或者iptables,可能会阻止外部访问端口。
你可以先临时关闭防火墙测试:# 针对firewalld sudo systemctl stop firewalld # 针对iptables sudo iptables -F如果关闭后能访问,就需要永久开放端口:
# firewalld的方式 sudo firewall-cmd --add-port=3000/tcp --permanent sudo firewall-cmd --reload # iptables的方式 sudo iptables -A INPUT -p tcp --dport 3000 -j ACCEPT sudo service iptables save确认公网IP和网络连通性
先在本地ping一下你的EC2公网DNS(ec2-18-217-243-129.us-east-2.compute.amazonaws.com),看看能不能收到响应。如果ping不通,可能是:- 你的EC2实例没有分配公网IP(检查实例详情里的「公网IP」字段)
- 你本地的网络(比如公司防火墙、家庭路由器)屏蔽了这个IP或者端口
另外,也可以用telnet或者curl测试端口连通性:
# 本地终端执行 telnet ec2-18-217-243-129.us-east-2.compute.amazonaws.com 3000 # 或者用curl curl http://ec2-18-217-243-129.us-east-2.compute.amazonaws.com:3000
内容的提问来源于stack exchange,提问作者user8685433
相关产品推荐
相关产品推荐

