如何允许节点在 Ubuntu 18.04 上监听 1024 以下的端口?

Posted

技术标签:

【中文标题】如何允许节点在 Ubuntu 18.04 上监听 1024 以下的端口?【英文标题】:How can I allow node to listen to ports below 1024 on Ubuntu 18.04? 【发布时间】:2019-04-25 23:08:49 【问题描述】:

我可以在安装了 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 以来事情发生了变化。

【问题讨论】:

***.com/questions/10182798/… @AbhishekMani 我知道这一点。这不是我要问的。请注意在 cmets 中如何提及 CAP_NET_BIND_SERVICE 不要否定诺顿,但这些是保留的系统端口。他们被阻止是有原因的。你需要做什么,实际上需要一个系统端口? @unflores 我不想因为你试图和我一起思考而显得忘恩负义,但讨论理由会让我们远离这个问题。出于所有意图和目的,它是无关紧要的。 您找到解决方案了吗?我有同样的问题...... 16.04 一切正常,18.04 不再工作 【参考方案1】:

@AdiRoiban 关于为什么setcap 不起作用的答案可能是正确的。检查安装了node 的文件系统。如果是nvmnode 可能会安装在您的主目录中。您的主目录可能已加密。您的加密主页可能会挂载为nosuid

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


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

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

authbind node index.js

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

例如:

authbind --deep nodemon --inspect index.js

【讨论】:

【参考方案2】:

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

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

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

它们应该看起来像

CapPrm: 0000000000000400
CapEff: 0000000000000400
CapBnd: 0000003fffffffff

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

CapPrm: 0000000000000000
CapEff: 0000000000000000
CapBnd: 0000003fffffffff

希望对您有所帮助。 我是在和朋友商量后才知道的:)

【讨论】:

运行时功能不应该由 root 使用 setcap 可变吗? 我认为你是对的。 nvm 在我家中安装了node,而不是系统根目录。加密家庭是nosuid。我已接受您的回答,并发布了一个解决方法作为另一个答案。

以上是关于如何允许节点在 Ubuntu 18.04 上监听 1024 以下的端口?的主要内容,如果未能解决你的问题,请参考以下文章

Ubuntu Server 18.04 与 Squid 3.5.x

Ubuntu 18.04 desktop-允许使用管理员或者超级管理员 ssh登录

如何修复 Ubuntu 18.04 上没有声音?

如何在虚拟机Ubuntu 18.04上安装catkin

如何在专用 Ubuntu 18.04 服务器上激活 IPv6?

如何在Ubuntu 18.04 Server上安装Redis