对我的开发框有这个限制是非常烦人的,因为除了我之外永远不会有任何用户。
我知道 标准的解决方法,但没有一个完全符合我的要求:
- authbind (Debian 测试中的版本,1.0,仅支持 IPv4)
- 使用 iptables REDIRECT 目标将低端口重定向到高端口(ip6tables 的“nat”表尚未实现,iptables 的 IPv6 版本)
- sudo(以root身份运行是我要避免的)
- SELinux(或类似的)。 (这只是我的开发箱,我不想引入很多额外的复杂性。)
是否有一些简单的 sysctl
变量允许非 root 进程绑定到 Linux 上的“特权”端口(端口小于 1024),或者我只是运气不好?
编辑:在某些情况下,您可以 使用功能 来执行此操作。
原文由 Jason Creighton 发布,翻译遵循 CC BY-SA 4.0 许可协议
好的,感谢指出能力系统和
CAP_NET_BIND_SERVICE
能力的人。如果你有一个最近的内核,确实可以使用它来以非 root 身份启动服务,但绑定低端口。简短的回答是你这样做:然后在任何时候执行
program
之后,它将具有CAP_NET_BIND_SERVICE
能力。setcap
在 debian 包中libcap2-bin
。现在注意事项:
#!
行来启动解释器)。在这种情况下,据我所知,您必须将该功能应用于解释器可执行文件本身,这当然是一场安全噩梦,因为任何使用该解释器的程序都将具有该功能。我找不到任何干净、简单的方法来解决这个问题。LD_LIBRARY_PATH
在任何具有提升权限的 ---program
上,如setcap
或suid
。因此,如果您的program
使用自己的.../lib/
,您可能需要考虑其他选项,例如端口转发。资源:
setcap
的文档。注意: RHEL 首先在 v6 中添加了这个。