如何允许节点在 Ubuntu 18.04 上侦听低于 1024 的端口?
How can I allow node to listen to ports below 1024 on Ubuntu 18.04?
我可以在安装了 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.
以来情况发生了变化
检查启动可执行文件的分区是否没有挂载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
我可以在安装了 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.
以来情况发生了变化检查启动可执行文件的分区是否没有挂载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