Linux(如果重要的话,是 CentOS)上有没有办法让普通用户使用 1024 以下的端口?(在该端口上打开监听 TCP 套接字)
目前我了解到只有 root 才有权使用这些端口。
答案1
不适用于 CentOS 3/4/5 (缺少文件系统功能):
您可以将 CAP_NET_BIND_SERVICE 功能设置为需要打开此端口的程序。Root 将在可执行文件上设置此功能,然后任何用户都可以运行该可执行文件,它将能够使用 <1024 的端口。
要设置可执行文件的功能:
setcap cap_net_bind_service=+ep /path/to/program
答案2
据我所知这是不可能的,或者如果可以的话,出于安全原因也不建议这么做。
但是如果您希望用户能够监听特定端口,您可以始终使用 TCP 转发器rinetd
或 iptables 规则将到该端口的连接重定向到他们可以监听的端口,并让他们将他们的服务设置为监听更高的端口。
例如
aa.bb.cc.dd 80 127.0.0.1 8000
在 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
无论哪种方式,都可以比让任何用户在任何端口上监听提供更细粒度的控制。
iptables 方法的优点是侦听应用程序将看到调用客户端的 IP 地址(使用 rinetd 方法,它将看到所有连接都来自本地主机)。iptables 方法还允许使用 UDP 和 TCP。
答案3
您可以创建一个包装器,运行 SUID 并在打开端口后放弃权限。
答案4
这些是否完全脱离了背景,还是我忽略了一些基本的东西?http://smarden.org/runit/chpst.8.html&http://cr.yp.to/daemontools/setuidgid.html