当除了我之外再也没有其他用户的时候,在我的开发框上有这样的限制是非常烦人的
我知道标准的解决办法,但没有一个能完全满足我的要求:
- authbind(Debian测试中的版本,1.0,仅支持IPv4)
- 使用iptables重定向目标将低端口重定向到高端口(尚未为ip6tables(iptables的IPv6版本)实现“nat”表)
- sudo(以root身份运行是我试图避免的)
- SELinux(或类似产品)。(这只是我的开发工具,我不想引入太多额外的复杂性。)
是否有一些简单的sysctl变量允许非根进程绑定到Linux上的“特权”端口(小于1024个端口),或者我只是运气不好
编辑:在某些情况下,您可以使用功能来执行此操作
好的,感谢那些指出能力系统和CAP\u NET\u BIND\u服务能力的人。如果您有一个最近的内核,那么确实可以使用它以非根端口但绑定低端口的形式启动服务。简单的回答是,你做到了:
setcap'cap\u net\u bind\u service=+ep'/path/to/program
然后,无论何时执行程序,它都将具有CAP\u NET\u BIND\u服务功能setcap位于debian包libcap2-bin中
现在要注意的是:
- 您至少需要一个2.6.24内核
- 如果您的文件是脚本,则此操作无效。(即,使用#!行启动解释器)。在这种情况下,据我所知,您必须将该功能应用于解释器可执行文件本身,这当然是一个安全噩梦,因为任何使用该解释器的程序都将具有该功能。我找不到任何干净、简单的方法来解决这个问题
- Linux将在任何具有提升权限(如
setcap或suid)的程序上禁用LD_LIBRARY_路径。因此,如果您的程序使用自己的../lib/,您可能需要研究另一种选项,如端口转发
资源:
- 功能(7)手册页。如果要在生产环境中使用功能,请仔细阅读本文。关于如何在exec()调用中继承功能,这里有一些非常棘手的细节
- setcap手册页
- “在GNU/Linux上绑定1024以下但不带根的端口”:该文档首先向我指出了
setcap
注意:RHEL首先在v6中添加了此功能