当前位置: 首页 > 面试题库 >

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

谷隐水
2023-03-14
问题内容

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

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

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

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


问题答案:

好的,感谢指出能力系统和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/,则可能必须考虑其他选项,例如端口转发。

资源:

  • 功能(7)手册页。如果要在生产环境中使用功能,请仔细阅读本章。关于如何在exec()调用之间继承功能的方式,确实存在一些非常棘手的细节,在此进行详细介绍。
  • setcap手册页
  • “绑定低于1024的端口,而在GNU / Linux上没有root”:该文档首先将我指向setcap

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



 类似资料:
  • 所以我正在做一个需要xml模式的小项目,我对这个模式很不熟悉。 我希望能够设置模式以在两组属性之间进行选择,根据我的研究,这在XSD 1.0中是不可能的,但显然是XSD 1.1的一个特性。 目前我正在使用VisualStudio来完成我的工作,它似乎被困在XSD1.0模式中,这是有意义的,因为XSD1.1显然是一个最新的开发。 我的问题是,是否有一个插件/扩展可以让我在Visual Studio中

  • 由于没有快速的lambda计算器,我使用上面的策略将非类型化lambda演算的术语编译为Haskell,以便快速计算它们。我对它的性能印象深刻:该程序创建了一个从到的数字列表,并在我的计算机上在不到一秒钟的时间内将它们相加。这比我预期的要快得多--只比Haskell直接等价物慢4倍--并且足以对我的目标有用。但是,请注意,为了满足类型系统的需要,我必须将函数和术语包装在fun/num构造函数下面。

  • 问题内容: 我知道可以用来从外壳检查给定的二进制文件,但是有可能在一个进程中执行此操作吗? 类似于(我完全组成了系统调用): 我正在尝试在我们的代码库中诊断一些可疑的SO链接问题,并且希望在可能的情况下以这种方式检查RPATH(我宁愿不必生成外部脚本)。 问题答案:

  • 我有一个由多个类实现的接口,这些类也有一些额外的方法。如果我自动连接这个类。有没有办法自动安装这些额外的方法? 例如─ 界面 服务1 服务2 如果我尝试像这样直接自动连接服务- 然后我得到了类似这样的错误-

  • 问题内容: 我在实现Runnable的类中的run()中调用的方法被设计为引发异常。 但是Java编译器不允许我这样做,建议我用try / catch包围它。 问题是,通过用try / catch包围它,我使 特定的 run()无效了。我 确实 想抛出该异常。 如果我指定的run()的本身,编译器会抱怨说。 通常,我对run()不会抛出异常完全满意 。但是,在我必须具有该功能的特殊情况下。 如何解