Node.js服务器仅监听ipv6。

22

我正在5403端口上运行一个node.js服务器。我可以telnet到私有IP的这个端口,但无法telnet到相同端口的公共IP。

我认为原因是node.js只监听ipv6。这是以下命令的结果:

netstat -tpln

(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       
PID/Program name
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      
-
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      
-
tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN      
-
tcp        0      0 127.0.0.1:5432          0.0.0.0:*               LISTEN      
-
tcp6       0      0 :::5611                 :::*                    LISTEN      
25715/node
tcp6       0      0 :::22                   :::*                    LISTEN      
-
tcp6       0      0 ::1:631                 :::*                    LISTEN      
-
tcp6       0      0 :::5403                 :::*                    LISTEN      
25709/node

我该如何让 Node 服务器监听 ipv4 地址?


你的配置是什么?这是输出,但输入在哪里呢? :) - damd
1个回答

35

当调用listen()时,您需要指定一个IPv4地址,我在使用http模块时也遇到了同样的问题。如果我使用以下内容:

```javascript server.listen(port, '0.0.0.0'); ```

它会监听所有可用的网络接口。

var http = require('http');

var server = http.createServer(function(request, response) {
...
});

server.listen(13882, function() { });

它只监听IPV6,可以从netstat输出中看到:

$ netstat -lntp
Proto  Recv-Q  Send-Q  Local Address  Foreign Address  State
tcp6        0       0  :::13882       :::*             LISTEN

但是,如果我像这样指定一个IPv4地址:

var http = require('http');

var server = http.createServer(function(request, response) {
...
});

server.listen(13882, "0.0.0.0", function() { });

netstat将报告服务器正在侦听IPV4:

$ netstat -lntp
Proto  Recv-Q  Send-Q  Local Address     Foreign Address  State
tcp         0       0  0 0.0.0.0:13882   0 0.0.0.0:13882  LISTEN

我正在使用Ubuntu 16.04和npm 5.3.0。

希望对你有所帮助。


1
如何在IPv6和IPv4上运行? - Abhay
4
根据 https://nodejs.org/api/net.html#net_server_listen_options_callback ,默认情况下 listen() 方法现在将同时支持 ipv4 和 ipv6。我通过一个简单的 server.listen(13883, function() { }); 测试过了,并且尽管 netstat 只报告 tcp6 正在监听,但我也可以使用像 127.0.0.1 或者 192.168.*.* 这样的 ipv4 地址进行连接。我现在使用的是 Ubuntu 18.04 和 node v8.12.0。 - Dario Fiumicello
6
只有使用 :: 时才有效,当指定的是 0.0.0.0::1 或者 127.0.0.1 时就不起作用了。我在想是否可能让网络服务器同时绑定到 ::1127.0.0.1 上。 - CMCDragonkai

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接