Google VM实例(Ubuntu16.0)Node应用8080端口无法访问求助
排查Google Cloud VM上Node.js 8080端口无法外部访问的问题
我之前在GCP上部署Node.js应用时也碰到过几乎一模一样的情况,给你几个针对性的排查方向,按优先级来:
先确认Node.js应用的监听地址
这是最常见的坑!很多时候Node.js默认会监听127.0.0.1(仅本地回环),就算端口在防火墙开了,外部也根本连不上。你可以在VM里执行命令:netstat -tulpn | grep 8080 # 或者用ss命令(如果netstat没装) ss -tulpn | grep 8080看输出里的
LISTEN地址,如果是127.0.0.1:8080,那必须修改你的Node.js代码,把监听地址改成0.0.0.0(允许所有IP访问),比如:app.listen(8080, '0.0.0.0', () => { console.log('Server running on port 8080'); });重启应用后再试。
验证GCP防火墙规则的有效性
就算你在控制台加了规则,也可能有细节没注意到:- 检查规则的目标标签:你的VM实例必须带有规则里指定的标签,否则规则不会应用到这个VM。比如规则里的targetTags是
node-app,那VM的标签也要加上node-app。 - 确认规则的方向是入站(Ingress),协议是TCP,端口范围包含8080,源IP范围是不是你当前的公网IP(或者
0.0.0.0/0如果要开放给所有人)。 - 可以用gcloud命令快速验证:
看输出里的gcloud compute firewall-rules list --filter="ALLOW=tcp:8080"ENABLED列是不是True,TARGET_TAGS和你的VM标签是否匹配。
- 检查规则的目标标签:你的VM实例必须带有规则里指定的标签,否则规则不会应用到这个VM。比如规则里的targetTags是
检查本地网络栈的其他拦截
虽然你关闭了ufw,但Ubuntu 16.04可能还有iptables的默认规则在生效?你可以执行:iptables -L -n | grep 8080如果有REJECT或者DROP的规则,那需要清理掉。另外,也可以在VM内部用curl访问自己的公网IP:8080,比如:
curl http://[你的公网IP]:8080如果内部都访问不了,那大概率是应用监听的问题或者本地防火墙;如果内部能访问但外部不行,那肯定是GCP防火墙的问题。
确认VM的公网IP状态
虽然你说80、443能访问,但还是确认下你的公网IP是不是静态的?如果是临时IP,重启VM后可能会变,但这种情况概率很低,不过可以快速排除。
一般来说,前两个点就能解决90%的问题,先从监听地址查起,这个最容易忽略!
内容的提问来源于stack exchange,提问作者Awasthî Shußham
相关产品推荐
相关产品推荐

