如何让Ubuntu 18.04下的Node.js监听1024以下端口?

4

我可以在nvm安装的节点中使用任何大于1023的PORT来使用server.listen(PORT)。如何在非特权用户下使用系统端口(例如,低于1024的端口)?

在我们的Ubuntu 16.04服务器上,我曾这样做:

sudo setcap CAP_NET_BIND_SERVICE=+eip `readlink -f \`which node\``

然而,我们升级到Ubuntu 18.04之后,它似乎不再起作用了。我看到了以下错误:

Error listen EACCES 0.0.0.0:925

这种情况发生在所有小于1024的端口上,所以这不仅仅是端口已经被占用的一次性案例。
为什么这个方法不起作用了呢?我必须漏掉了些东西,或者Ubuntu 18.04已经发生了变化。

https://dev59.com/Nmkw5IYBdhLWcg3wDWEk - Abhishek Mani
@AbhishekMani 我知道这个。这不是我要问的。请注意注释中提到了 CAP_NET_BIND_SERVICE - Redsandro
不想泼冷水,但这些是保留的系统端口。它们被阻止是有原因的。你需要做什么事情,实际上需要一个系统端口呢? - unflores
@unflores,我并不想显得不感激你试图和我一起思考,但讨论原理会使我们偏离问题。从所有意义上来说,这是无关紧要的。 - Redsandro
你找到这个问题的解决方案了吗?我也遇到了同样的问题...在16.04中一切正常,但在18.04中不再工作。 - Adi Roiban
@AdiRoiban 我找到了一种解决方案(或者说是一种权宜之计),并在下面发布了它。 - Redsandro
2个回答

3

请检查可执行文件启动的分区是否未使用nosuid挂载。

getcap命令无法用于故障排除,因为它显示的是文件系统上设置的属性,而非运行时可用的实际能力。

您可以在/proc/PID/status中检查运行时能力。

它们应该看起来像:

CapPrm: 0000000000000400
CapEff: 0000000000000400
CapBnd: 0000003fffffffff

在我的nosuid分区中,它们是这样的。
CapPrm: 0000000000000000
CapEff: 0000000000000000
CapBnd: 0000003fffffffff

希望这有所帮助。 在咨询一个朋友之后,我才找到了这个信息 :)

运行时能力不是应该可以通过root使用setcap进行可变吗? - Redsandro
我认为你是正确的。nvm 是与 node 一起安装在我的主目录下而不是系统根目录下的。加密的主目录是 nosuid 的。我已经接受了你的答案,并发布了一个解决方法作为另一个答案。 - Redsandro

0

@AdiRoiban的回答可能是关于为什么setcap不起作用的正确答案。检查node安装在哪个文件系统上。如果使用nvm,则node可能安装在您的主目录中。您的主目录可能已加密。并且您的加密主目录可能被挂载为nosuid

这是我最终使用的解决方法。


首先,安装authbind。然后在/etc/authbind/byport/中创建您想要访问的端口作为空文件。为您的用户或组分配读取权限。为了测试目的,您可以使用用户root:root和权限777

接下来,以以下方式启动您的节点应用程序:

authbind node index.js

如果应用程序生成需要访问的node进程(例如nodemon),则需要使用--deep命令行开关授予该进程授予子进程权限的权限。

E.g.:

authbind --deep nodemon --inspect index.js

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