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


8

偶尔,我会搜索如何在Linux中进行用户级权限以进行网络端口访问,并且变得相当枯燥。例如,如果您有一台运行关键进程的计算机在端口5080上侦听,我觉得应该有一种方法可以让仅特定的一组受信任用户访问该端口-就像任何其他理智的权限过程一样完成,例如文件系统权限。

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

Answers:


4

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

如果希望仅在特定用户内在计算机上访问的通信端口,则可以使用传统的Unix套接字,该套接字在文件系统空间中具有名称并具有权限。Linux授予对AF_UNIX套接字的读/写权限。

如果一台计算机在端口5080上侦听来自其他计算机的外部TCP或UDP请求,则我们再也不能真正谈论用户权限。您必须在超过5080的协议中建立安全性:身份验证,加密,完整性/防欺骗/拒绝访问。


网络名称空间是否允许不同的用户访问不同的名称空间,从本质上讲,某些端口的所有用户都可以访问该名称空间,而阻塞其他端口吗?
BT

2

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

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


有趣。我必须说,要做一个解决方案,其中每个动作都需要一个新的过程,这就是Linux要做的事情。
BT

0

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

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

不能立即看到的是,当建立连接时,该连接的客户端使用端口号。除非客户端程序明确请求特定的端口号,否则使用的端口号是临时端口号。临时端口是由机器的IP堆栈分配的临时端口,并为此从指定的端口范围分配。当连接终止时,临时端口可用于重用,尽管大多数IP堆栈在使用了所有临时端口池之前不会重用该端口号。因此,如果客户端程序重新连接,它将为新连接的另一端分配一个不同的临时端口号。


1
用户级别的网络权限如何防止这种情况?
英国电信
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.