You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Node.js Express应用公网IPv4无法访问,请求排查建议

排查公网无法访问Node.js Express应用的实用建议

看起来你已经做了不少基础排查工作了,我来给你补充几个关键的排查方向,一步步定位问题:

先确认应用的监听范围

你的代码里app.listen(25565, ...)如果没指定host参数,Express默认会监听0.0.0.0(所有网卡),但保险起见,最好明确写出来避免歧义,修改代码如下:

const app = require('express')();
app.get('/health-check', (req, res) => res.sendStatus(200));
app.listen(25565, '0.0.0.0', () => {
  console.log('Server running on port 25565, accessible via all network interfaces');
});

修改后重启应用,确保它不是只绑定127.0.0.1(仅本地回环可访问)。

分步骤排查网络问题

1. 验证公网端口的可达性

  • 不要用家里的WiFi测试公网访问(很多路由器会拦截本地访问公网IP的请求),改用手机流量或者找异地朋友帮忙测试http://<你的公网IP>:25565/health-check
  • 用工具测试端口连通性:在任意一台非本地网络的机器上,执行telnet <公网IP> 25565或者nc -zv <公网IP> 25565,如果返回“connection refused”说明端口没开,“timeout”则是网络层面的拦截。

2. 检查ISP是否封锁了目标端口

很多运营商会默认封锁一些常用端口(比如25565是Minecraft服务器的默认端口,很可能被ISP盯上),你可以临时换个不常见的端口(比如30001),重新配置路由器端口转发并重启应用,再测试公网访问。如果换端口后能通,那就是原端口被ISP封禁了,需要联系客服申请解封。

3. 确认路由器端口转发规则的正确性

即使你开了端口,也要核对以下细节:

  • 转发的外部端口内部端口都设置为25565了吗?别搞混成不同端口。
  • 转发的目标IP是你Ubuntu机器的静态本地IP吗?如果用DHCP自动分配IP,机器重启后IP可能变化,导致转发失效,建议给Ubuntu设置静态IP。
  • 端口转发的协议是否选对了?Express用的是HTTP(基于TCP),要确保规则里勾选了TCP协议,不要只开UDP。

4. 排查Ubuntu系统的安全拦截

你说关闭了防火墙,但最好再确认一下:执行sudo ufw status,输出应该显示inactive。另外,检查是否安装了其他安全工具(比如fail2ban),这些工具也可能拦截外部连接,可以临时停止相关服务再测试。

5. 验证DMZ主机设置是否生效

设置DMZ后,建议重启路由器让配置生效,然后再用端口测试工具验证。如果DMZ生效,所有外部端口请求都会转发到你的Ubuntu机器,这时候如果还是访问不了,大概率是ISP层面的问题。

6. 检查是否处于多层NAT环境

有些小区宽带或企业网络是二级NAT,你的路由器拿到的不是真正的公网IP,而是运营商内网的IP。你可以在Ubuntu机器上执行curl ifconfig.me,对比返回的IP和路由器后台显示的公网IP,如果不一致,说明是多层NAT,需要联系ISP申请真正的公网IP才能实现端口转发。

最后确认应用状态

在Ubuntu机器上执行ss -tulpn | grep 25565,查看是否有node进程监听0.0.0.0:25565或者:::25565,如果显示的是127.0.0.1:25565,那就是应用只绑定了本地回环,公网肯定无法访问,这时候回到第一步修改监听host即可。

内容的提问来源于stack exchange,提问作者bucsy

火山引擎 最新活动