如何允许节点在 Ubuntu 18.04 上侦听低于 1024 的端口?

How can I allow node to listen to ports below 1024 on Ubuntu 18.04?

我可以在安装了 nvm 的节点中使用 1023 以上的任何 PORTserver.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.

以来情况发生了变化

检查启动可执行文件的分区是否没有挂载nosuid

getcap 对故障排除没有帮助,因为它会显示文件系统上设置的属性,而不是 运行 时可用的实际功能。

您可以在 /proc/PID/status 中查看 运行 时间功能。

它们应该看起来像

CapPrm: 0000000000000400
CapEff: 0000000000000400
CapBnd: 0000003fffffffff

在我的 nosuid 分区上,它们是这样的。

CapPrm: 0000000000000000
CapEff: 0000000000000000
CapBnd: 0000003fffffffff

希望对您有所帮助。 我是在咨询了朋友后才发现的:)

@AdiRoiban 关于为什么 setcap 不起作用的回答可能是正确的。检查安装了 node 的文件系统。在 nvm 的情况下,node 可能安装在您的主目录中。您的主目录可能已加密。并且您的加密家庭可能挂载为 nosuid.

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


首先,安装authbind。然后在 /etc/authbind/byport/ 中创建您希望能够作为空文件访问的端口。授予他们对您的用户或组的读取权限。出于测试目的,您可以全部使用用户 root:root 和权限 777.

接下来,像这样启动您的节点应用程序:

authbind node index.js

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

例如:

authbind --deep nodemon --inspect index.js