linux - 有没有办法让非 root 进程绑定(bind)到 Linux 上的 "privileged"端口?

标签 linux root ipv6 iptables linux-capabilities

在我的开发盒上受到这个限制非常烦人,因为除了我之外再也没有任何用户了。

我知道the standard workarounds ,但他们都没有做我想要的:

  1. authbind (Debian 测试中的版本,1.0,仅支持 IPv4)
  2. Using the iptables REDIRECT target to redirect a low port to a high port (ip6tables 的“nat”表尚未实现,iptables 的 IPv6 版本)
  3. sudo(我试图避免以 root 身份运行)
  4. 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 中。

现在注意事项:

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

资源:

注意:RHEL first added this in v6 .

关于linux - 有没有办法让非 root 进程绑定(bind)到 Linux 上的 "privileged"端口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/413807/

相关文章:

c - 如何在 linux 内核中使用另一个 c 文件中的变量?

android - 一次不能执行多个 shell 命令

networking - 为 IPv6 找到正确的 "network interface"号码

c++ - 不要使用 C++ 在 Linux 中为 IPv6 数据包分段标志

Linux xargs 命令

linux - 如何将一个目录中文件的前300行复制到另一个目录?

c - 如何调试/跟踪套接字编程

ruby-on-rails - 如何在rails中将设计登录页面设置为根页面

android - 将 Control-C 发送到通过 Runtime.getRuntime().exec ("su"运行的进程;

Spring Boot 应用程序在没有 -Djava.net.preferIPv4Stack=true 和 -Djava.net.preferIPv4Addresses 参数的情况下监听 IPv6