You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu下Node.js程序312端口无法对外访问的排查求助

问题描述

我开发了一个Node.js HTTP服务,使用312端口传输数据,但该端口仅能被本机访问。已执行ufw allow 312/tcp放行端口,通过以下测试均显示端口已开放:

  1. netstat -ntlup | grep 312输出:
tcp6       0      0 :::312                  :::*                    LISTEN      3871/node 
  1. nc -vv <SERVER URL> 312输出:
Connection to <SERVER URL> (<SERVER IP>) 312 port [tcp/*] succeeded!
  1. telnet <SERVER IP> 312输出:
Connected to <SERVER IP>.

注意到netstat记录显示为tcp6,而非HTTP默认80端口那样的tcp。

客户端使用Node.js内置http库编写的请求代码如下:

const http = require('http');
const https_imp = require('https');

module.exports = {}

module.exports.sendRequest = async (url, data, https) => {
    const options = {
        hostname: url,
        port: 312,
        path: '',
        method: 'POST',
        headers: {
            'Content-Type': 'application/json'
        },
    };
    var useThis
    if (https) {
      useThis = https_imp
    } else {
      useThis = http
    }
    return await new Promise((resolve, reject) => {
        const req = useThis.request(options, (res) => {
            var output = ''
            res.on('data', (d) => {
                output += d.toString()
            })

            res.on('end', () => {
                resolve(output)
            })

            res.on('error', (err) => {
                reject(err)
            })
        })
        req.write(JSON.stringify(data))
        req.end()
    })
}

使用该客户端程序和Postman测试均出现超时,但本机开发测试时功能正常,请求帮助排查问题。


解决方案

1. 检查服务端绑定地址

netstat显示tcp6说明服务端可能仅绑定了IPv6地址(::),导致IPv4客户端访问异常。默认情况下Node.js服务监听0.0.0.0会同时支持IPv4和IPv6,若代码指定了::则只监听IPv6。

修改服务端监听代码,确保绑定0.0.0.0:

http.createServer((req, res) => {
  // 业务逻辑
}).listen(312, '0.0.0.0', () => {
  console.log('Server running on port 312');
});

2. 验证防火墙IPv4规则

部分系统中ufw的IPv4和IPv6规则是分开生效的,执行以下命令检查IPv4规则:

ufw status ipv4

若未看到312端口的允许规则,手动添加:

ufw allow in proto tcp to 0.0.0.0/0 port 312

3. 检查云服务商安全组(若为云服务器)

云服务器的安全组优先级高于系统防火墙,即使ufw放行端口,安全组未开放312端口也会导致外部访问超时。登录云服务商控制台,确认安全组规则中已允许312端口的TCP入站请求。

4. 修复客户端代码问题

  • 将options.path设为'/',HTTP请求必须包含合法路径,空字符串可能导致请求异常;
  • 确保调用sendRequest时传入的url是服务器公网IP/域名,而非localhost或127.0.0.1;
  • 添加超时处理便于排查错误:
// 在req.end()前添加
req.setTimeout(5000, () => {
  req.abort();
  reject(new Error('Request timed out'));
});

5. 分别测试IPv4/IPv6连通性

执行以下命令区分测试:

  • IPv4测试:nc -vv <SERVER_IPv4> 312
  • IPv6测试:nc -vv <SERVER_IPv6> 312
    若IPv6能通但IPv4不通,说明服务端绑定或防火墙IPv4规则存在问题。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 05:22:39