为什么低于1024的端口有特权?

我听说这是一个安全function,但它往往是一个安全问题。 如果我想编写一个使用特权端口的服务器,不仅要担心我的代码有多安全,还要特别担心我是否正在使用setuid权限和删除特权。

真正。 但是这也意味着任何与您交谈的人都知道您必须拥有root权限才能运行该服务器。 当您login到端口22上的服务器(比如说)时,您知道您正在与一个由root运行的进程(抛开安全问题)进行对话,因此您可以使用该系统的密码或其他信息不要信任在该系统上拥有用户帐户的任何人。

参考: http : //www.w3.org/Daemon/User/Installation/PrivilegedPorts.html 。

编辑来阐述推理:许多最重要的networking服务 – 远程login(是的,它仍然被使用 – 令人惊讶的经常),SSH,许多HTTP服务,FTP等等 – 涉及通过线路发送密码等重要数据。 在一个安全的设置中,无论是固有的协议(SSH)还是缠绕它(stunnel,IPSec)的某种encryption都可以保护数据不被窃听,但所有这些保护都在服务器上结束。

为了妥善保护您的数据,您需要确定您正在与“真实”的服务器通话。 今天,安全证书是在networking上(以及其他地方)执行此操作的最重要的方式:假定只有“真实”的服务器才能访问证书,所以如果您确认您正在与之交谈的服务器具有该证书,相信它。

特权端口以非常相似的方式工作:只有root才能访问特权端口,所以如果您正在与特权端口通话,则您知道您正在与root通话。 这在现代networking上并不是很有用:重要的是服务器的身份 ,而不是IP。 在其他types的networking中,情况并非如此:例如,在学术networking中,服务器通常由安全的房间中的可信人员进行物理控制,但学生和工作人员作为用户可以非常自由地访问。 在这种情况下,假设您始终可以信任root,这样做通常很安全,因此您可以login并将私有数据安全地发送到特权端口。 如果普通用户可以监听所有的端口,那么你需要一个额外的层来validation特定的程序是否被某些数据信任。

你没有说你正在使用什么平台,但是在Linux上,至less你可以使用能力(特别是CAP_NET_BIND_SERVICE)来允许一个非根进程监听一个小于1024的端口。例如,看看有没有办法非root进程绑定到Linux上的“特权”端口?

另一个select是设置iptables规则来转发来自特权端口的stream量到非特权端口(我在生产中使用过这个,而且非常简单,效果很好)。 这也在上面的链接描述。