在我的开发盒上受到这个限制非常烦人,因为除了我之外再也没有任何用户了。
我知道the standard workarounds ,但他们都没有做我想要的:
- authbind (Debian 测试中的版本,1.0,仅支持 IPv4)
- Using the iptables REDIRECT target to redirect a low port to a high port (ip6tables 的“nat”表尚未实现,iptables 的 IPv6 版本)
- sudo(我试图避免以 root 身份运行)
- SELinux(或类似)。 (这只是我的开发箱,我不想引入太多额外的复杂性。)
是否有一些简单的 sysctl
变量允许非 root 进程绑定(bind)到 Linux 上的“特权”端口(小于 1024 的端口),还是我运气不好?
编辑:在某些情况下,您可以 use capabilities这样做。
最佳答案
好的,感谢指出功能系统和CAP_NET_BIND_SERVICE
功能的人。如果你有一个最近的内核,确实可以使用它来以非 root 身份启动服务,但绑定(bind)低端口。简短的回答是你这样做:
setcap 'cap_net_bind_service=+ep' /path/to/program
然后在任何时候执行 program
之后,它将具有 CAP_NET_BIND_SERVICE
功能。 setcap
在 debian 包 libcap2-bin
中。
现在注意事项:
- 您至少需要 2.6.24 内核
- 如果您的文件是脚本,这将不起作用。 (即使用
#!
行来启动解释器)。在这种情况下,据我所知,您必须将该功能应用于解释器可执行文件本身,这当然是一场安全噩梦,因为任何使用该解释器的程序都将具有该功能。我找不到任何干净、简单的方法来解决这个问题。 - Linux 将在任何具有提升权限(如
setcap
或suid
)的程序
上禁用LD_LIBRARY_PATH
。因此,如果您的program
使用自己的.../lib/
,您可能需要考虑其他选项,例如端口转发。
资源:
- capabilities(7) man page .如果您要在生产环境中使用功能,请仔细阅读这篇文章。关于如何跨 exec() 调用继承功能,这里有一些非常棘手的细节。
- setcap man page
- "Bind ports below 1024 without root on GNU/Linux" :第一次将我指向
setcap
的文档。
关于linux - 有没有办法让非 root 进程绑定(bind)到 Linux 上的 "privileged"端口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/413807/