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