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

Posted

技术标签:

【中文标题】如何在 Node.js server.listen() 中使用可选的主机名参数【英文标题】:How to use the optional hostname parameter in Node.js server.listen() 【发布时间】:2016-04-15 10:09:33 【问题描述】:

从目前为止我在教程中阅读的内容来看,server.listen(port[, hostname][, backlog][, callback]) 的可选 hostname 参数始终是 127.0.0.1(环回)、0.0.0.0(listen on every available network interface, the default option)或实际 IP 之一服务器可用的地址。其他所有内容都会给出Error: listen EADDRNOTAVAIL。这是全图吗? (我相信主机名在技术上与 IP 不同......)

我无法从doc 中找到太多关于它的信息...

【问题讨论】:

【参考方案1】:

因此,您需要一个可解析的 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 应用程序时,我有过这方面的第一手经验。

0.0.0.0/0 子网是一种非常奇特的说法:these are all the network interfaces I have on this computer,而127.0.0.1 始终是仅限本地的接口。如果你把它绑定到这个,你就摆脱了很多安全问题。其中之一可能是“黑客”试图在所有接口上附加一个侦听器,如果您没有非常严格的防火墙,在某个地方或其他地方,可能存在泄漏。

这不是一个规则,而只是一个最佳实践。

P.S.:代码是我从 Modulus 的博客中摘录的一个 sn-p;如果我想尝试一下,很快。

【讨论】:

您能否为“绑定到环回是最佳实践”提供支持?我认为默认的全能0.0.0.0 是要走的路......我很好奇何时/为什么将服务器绑定到其他地方,因此问题:) 我不确定绑定到环回是否会起作用,除非在开发中,但您应该指定理想情况下要绑定的接口。据我所知,可选的第二个参数实际上是主机而不是主机名。您可以提供主机名,在这种情况下,服务器将尝试查找与该地址关联的 IP,或者您可以指定地址。您还可以指定一个 unix 套接字(具有文件路径)。 想要绑定到特定地址的一个现代原因是您使用容器的位置。容器可能会加入多个网络 - 管理和容器间通信。您可能希望确保特定 API 服务器仅绑定到网络,在该网络上它将接受通信作为另一层安全性以及 TLS、客户端证书/令牌和基于 IP 的白名单。 最后一点,文档不是很有帮助,但***的链接有一些关于 0.0.0.0/::: 如何工作的有用信息,可以为怪异熊猫的答案添加一些信息。

以上是关于如何在 Node.js server.listen() 中使用可选的主机名参数的主要内容,如果未能解决你的问题,请参考以下文章

用node.js模拟服务器和客户端

Web进程无法在启动node.js后的60秒内绑定到$ PORT

Socket.io无法在Node.js前面使用Nginx反向代理

node.js 初学

node.js 的页面渲染方法ejs

Nginx+PM2+Node.js最简单的配置