Ubuntu下Node.js程序312端口无法对外访问的排查求助
问题描述
我开发了一个Node.js HTTP服务,使用312端口传输数据,但该端口仅能被本机访问。已执行ufw allow 312/tcp放行端口,通过以下测试均显示端口已开放:
netstat -ntlup | grep 312输出:
tcp6 0 0 :::312 :::* LISTEN 3871/node
nc -vv <SERVER URL> 312输出:
Connection to <SERVER URL> (<SERVER IP>) 312 port [tcp/*] succeeded!
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
相关产品推荐
相关产品推荐

