一尘不染

有没有办法让非根进程绑定到Linux上的“特权”端口?

linux

当我之外再也没有其他用户时,在我的开发箱上有这个限制是非常令人讨厌的。

我知道标准的解决方法,但是它们都不能完全满足我的要求:

  1. authbind(Debian测试版1.0版仅支持IPv4)
  2. 使用iptables REDIRECT目标将低端口重定向到高端口(iptable的IPv6版本ip6tables尚未实现“ nat”表)
  3. sudo(以root用户身份运行是我要避免的操作)
  4. SELinux(或类似版本)。(这只是我的开发箱,我不想引入很多额外的复杂性。)

是否有一些简单的sysctl变量允许非根进程绑定到Linux上的“特权”端口(端口小于1024),还是我不走运?


阅读 327

收藏
2020-06-02

共1个答案

一尘不染

好的,感谢指出能力系统和CAP_NET_BIND_SERVICE能力的人们。如果您使用的是最新内核,则确实可以使用它以非root用户身份启动服务,但绑定低端口。简短的答案是您这样做:

setcap 'cap_net_bind_service=+ep' /path/to/program

然后任何时间program执行,此后它将具有此CAP_NET_BIND_SERVICE功能。setcap在debian软件包中libcap2-bin

现在需要注意的是:

  1. 您将至少需要2.6.24内核
  2. 如果您的文件是脚本,则无法使用。(即,使用#!行启动解释器)。据我所知,在这种情况下,您必须将功能应用于解释器可执行文件本身,这当然是安全的噩梦,因为使用该解释器的任何程序都将具有该功能。我找不到解决此问题的任何简单明了的方法。
  3. Linux将在program具有更高特权的任何磁盘上禁用LD_LIBRARY_PATH,例如setcapsuid。因此,如果您program使用自己的.../lib/,则可能必须考虑其他选项,例如端口转发。

资源:

注意:RHEL首先在v6中添加了它

2020-06-02