如何在 Node.js server.listen() 中使用可选的主机名参数

2024-01-22

从我到目前为止在教程中读到的内容来看,可选的hostname参数为server.listen(port[, hostname][, backlog][, callback])一直都是127.0.0.1(环回),0.0.0.0 (监听每个可用的网络接口,默认选项 https://stackoverflow.com/questions/20778771/what-is-the-difference-between-0-0-0-0-127-0-0-1-and-localhost),或服务器可用的实际 IP 地址之一。其他一切都会给Error: listen EADDRNOTAVAIL。这就是全貌吗? (我相信主机名在技术上与IP不同......)

我无法从 中找到太多相关信息doc https://nodejs.org/api/net.html#net_server_listen_port_hostname_backlog_callback...


因此,您需要一个可解析的 DNS 主机名才能正常工作。举个简单的例子,我编辑了/etc/hosts文件包含以下条目:

...
127.0.0.1 MyTestDnsHostName.local

然后我用旧的刷新解析器缓存dscacheutil -flushcache并在简单的 Node.js 服务器中使用了以下代码。

var http = require('http')
  , PORT = 8080;

function handleRequest( request, response ){
    response.end( 'It Works!' );
}

var server = http.createServer( handleRequest );

server.listen( PORT, "MyTestDnsHostName.local", 34, function(){
    console.log( "Server listening on port:%s", PORT );
});

果然它有效。

错误EADDRNOTAVAIL表示可以解析但不可用;现在,为了能够绑定到它,它也应该是可绑定的(可用的)。

你可以做一个lsof -i TCP检查它的绑定位置。

但是,我不明白为什么你必须在其他地方绑定服务器;绑定到环回是最佳实践。


是的,所以这实际上是一个安全缺陷;如果将它绑定到所有可用的接口0.0.0.0,你的意思是Listen to every available network interface there is。这可能会造成安全漏洞,因为它可能会绑定到您不希望它使用的适配器;我在部署 RoR 应用程序时对此有过第一手经验。

The 0.0.0.0/0子网是一种非常奇特的表达方式:these are all the network interfaces I have on this computer, 同时127.0.0.1始终是仅限本地的接口。如果你将它绑定到此,你就可以消除很多安全问题。其中之一可能是“黑客”尝试在所有接口上附加侦听器,如果您没有非常严格的防火墙,则可能会出现泄漏。

这不是一个rule如此,但这只是最佳实践。

P.S.:该代码是我从 Modulus 博客中摘取的一个片段;如果我想尝试一些东西,那很快。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Node.js server.listen() 中使用可选的主机名参数 的相关文章

随机推荐