为什么Linux不允许用户级网络端口权限?

为什么Linux不允许用户级网络端口权限?

每隔一段时间,我就会搜索如何在 Linux 中为网络端口访问设置用户级权限,结果相当枯燥。例如,如果您有一台机器运行一个侦听端口 5080 的关键进程,我觉得应该有一种方法可以只允许一组特定的受信任用户访问该端口 - 就像任何其他理智的权限进程一样完成,如文件系统权限。

但似乎高端口对所有用户都可用,而低端口仅对 root 可用,只有像 authbind 和 iptables 转发这样的粗暴黑客才能允许其他用户使用低端口。这似乎是一个非常奇怪的情况,所以我想知道,为什么它是这样设计的,为什么人们没有觉得有必要改变这种情况?

答案1

Linux 支持网络命名空间。您可以使不同的进程看到不同的网络接口集。这是一个广泛的话题。

如果您想要一个仅特定用户可以在计算机内访问的通信端口,您可以使用传统的 Unix 套接字,它在文件系统空间中有一个具有权限的名称。 Linux 尊重 AF_UNIX 套接字上的读/写权限。

如果一台机器在端口 5080 上监听来自其他机器的外部 TCP 或 UDP 请求,那么我们就不能真正谈论用户不再有权限。您必须在超过 5080 的协议中构建安全性:身份验证、加密、完整性/防欺骗/抗拒绝服务。

答案2

我猜最初是因为它需要复杂的设计,这与早期 Unix 系统的范围不符。

后来,我猜想,因为有一种既定的方法来实现常见情况下的用户级网络端口权限:内网,大约在几年后出现(4.3BSD) TCP/IP (4.2BSD)。该inetd守护进程以 root 身份运行并侦听其配置文件中指定的端口。在传入连接时,inetd生成在其配置文件中指定的另一个程序,并以 inetd 配置文件中指定的用户身份运行。因此,至少对于可以在每个连接上启动新进程的服务来说,问题已经解决了。

答案3

我认为原因之一是大多数用户需要能够使用临时端口用于连接到其他服务器,而不必是 root。

TCP/IPv4 连接由两个端点组成,每个端点由一个 IP 地址和一个端口号组成。因此,当客户端用户连接到服务器计算机时,建立的连接可以被认为是(服务器IP、服务器端口、客户端IP、客户端端口)的4元组。通常,这四个中的三个是很容易知道的——客户端计算机使用自己的 IP 地址,并且在连接到远程服务时,需要服务器计算机的 IP 地址和服务端口号。

不立即明显的是,当建立连接时,连接的客户端使用端口号。除非客户端程序明确请求特定端口号,否则使用的端口号是临时端口号。临时端口是由计算机的 IP 堆栈分配的临时端口,并且是从为此目的指定的端口范围中分配的。当连接终止时,临时端口可供重用,尽管大多数 IP 堆栈在使用整个临时端口池之前不会重用该端口号。因此,如果客户端程序重新连接,将为新连接的一侧分配一个不同的临时端口号。

相关内容