使用 1024 以下端口的普通用户

5 networking linux port root

在 Linux(CentOS,如果重要的话)上有没有办法让普通用户使用 1024 以下的端口?(在该端口上打开侦听 TCP 套接字)

目前我知道只有 root 有权使用这些端口。

Jul*_*ano 12

不在 CentOS 3/4/5 上(缺乏文件系统功能):

您可以为需要打开此端口的程序设置 CAP_NET_BIND_SERVICE 能力。Root 将在可执行文件上设置功能,然后任何用户都可以运行该可执行文件,它将能够使用 <1024 的端口。

要在可执行文件上设置功能:

setcap cap_net_bind_service=+ep /path/to/program
Run Code Online (Sandbox Code Playgroud)


Dav*_*ett 5

IIRC 这是不可能的,或者出于安全原因不建议这样做。

但是,如果您希望用户能够侦听特定端口,则可以始终使用 TCP 转发器(如rinetdiptables 规则)将连接重定向到该端口到他们可以侦听的端口,并让他们将服务设置为侦听该更高的端口。

例如线

aa.bb.cc.dd    80      127.0.0.1   8000
Run Code Online (Sandbox Code Playgroud)

在 rinetd 的配置中,会将与地址上的端口 80 的连接转发到aa.bb.cc.dd非特权用户可以侦听的本地主机端口 8000。等效的 iptables 规则类似于

/sbin/iptables -t nat -A PREROUTING -p tcp -d aa.bb.cc.dd --dport 80 -j DNAT --to 127.0.0.1:8000
Run Code Online (Sandbox Code Playgroud)

与让任何用户侦听任何端口相比,无论哪种方式都能为您提供更细粒度的控制。

iptables 方法的优点是侦听应用程序将看到调用客户端的 IP 地址(使用 rinetd 方法它会看到所有连接都来自本地主机)。iptables 方法还允许 UDP 和 TCP。


小智 4

您可以创建一个运行 SUID 并在打开端口后删除权限的包装器。

  • 您可能会想到更多的工作:脚本不能在大多数 UNIX 上自动运行,所以必须深入编写一个小 C 程序,但这并不适合所有人。(诚​​然,setuid 包装器是一个*真正*小的 C 程序,它可以抓取数以千计的网站中的任何一个,但仍然如此。) (2认同)