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

新手上路,请多包涵

对我的开发框有这个限制是非常烦人的,因为除了我之外永远不会有任何用户。

我知道 标准的解决方法,但没有一个完全符合我的要求:

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

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

编辑:在某些情况下,您可以 使用功能 来执行此操作。

原文由 Jason Creighton 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 599
2 个回答

好的,感谢指出能力系统和 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 将禁用 LD_LIBRARY_PATH 在任何具有提升权限的 --- program 上,如 setcapsuid 。因此,如果您的 program 使用自己的 .../lib/ ,您可能需要考虑其他选项,例如端口转发。

资源:

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

原文由 Jason Creighton 发布,翻译遵循 CC BY-SA 4.0 许可协议

您可以进行端口重定向。这就是我为在 Linux 机器上运行的 Silverlight 策略服务器所做的

iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 943 -j REDIRECT --to-port 1300

原文由 FlappySocks 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题