这是标准行为,不允许非特权用户绑定到特权端口(端口号低于1024)。因此,例如想绑定到端口80的应用程序必须特权运行(通常是指以root身份运行)才能绑定到该端口。
一种常见的方法是与特权用户一起运行一个小的“侦听器”进程,该进程接受连接,然后生成一个非特权进程来处理请求。出于安全原因,已经完成了丢弃请求处理的特权。如果有人能够利用处理请求的进程,那么通常它允许入侵者使用与处理进程相同的特权来执行命令。因此,使用特权进程处理整个请求将很糟糕。
但是,对于许多应用程序而言,如今通常以非root用户身份运行。但是这样的过程当然无法在标准配置中绑定到特权端口。因此,像Tomcat或JBoss这样的服务器曾经绑定到诸如8080这样的高端口,因此它们不需要特权侦听器。
当然,如果将这样的过程暴露给Internet,则很可能会在端口80上提供访问权限,因为使用HTTP协议时,每个浏览器都会首先尝试连接到端口80。提供此功能的常用解决方法是在应用程序和公共Internet之间使用防火墙或端口转换器。因此,请求会到达请求端口80的防火墙,但防火墙会将请求转发到端口8080上的某个内部主机。这样,真正的Web服务器就可以在高端口上运行,而在端口80上则是公共可用的。
- (internet request) ----> (port 80)[Firewall] ------> (port 8080)[Webserver]
有时,仅使用iptables
NAT规则即可完成此重定向:
iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080
这允许运行非特权应用程序在端口8080上侦听,而对端口80的所有传入请求都仅重定向到端口8080。
但是,使用现代Linux内核还有另一种可能性:使用功能。
setcap CAP_NET_BIND_SERVICE=+ep /some/webserver/binary
binary
即使从非root用户启动时,这也将允许绑定到特权端口。请参阅man capabilities
以获取更多详细信息。