尽pipe80和443是系统端口,但大多数Web服务器如何能够绑定到它们呢?

运行绑定到端口80的Web服务通常不需要sudoer权限。 由于端口80/443是系统端口,意味着它们只能被特权用户使用,那么这些服务又是如何能够绑定到这些端口?

基本上有两种不同的方法:

  1. 最初开始以root身份运行,绑定到特权端口,然后下拉到非特权用户。

  2. inetd或xinetd运行特权,并将请求转发到运行非特权的Web服务器。

由于端口80/443是系统端口,这意味着它们只能被特权用户使用

我想你错了。 任何人都可以使用这些端口 绑定到他们是一个特权的操作。

这里的基本原理是,一些用户Joe不应该能够编写恶意的Web服务器,然后让一些他没有任何pipe理权限的主机。 当然,这是一个非常薄弱的​​模型,通常没有什么能够阻止Joe把他自己的计算机放在networking上,他可以拥有对他有物理访问权限的任何机器的pipe理权限。

我会用netcat做一个演示。

作为普通用户,我无法绑定到端口80:

$ nc -l -p 80 Can't grab 0.0.0.0:80 with bind : Permission denied 

我可以绑定到端口8080:

 $ nc -l -p 8080 

同时在另一个terminal上,我可以连接到80端口并发送一些数据,看到它出现在我刚刚开始的服务器端:

 $ nc 127.0.0.1 8080 <<<"Hello world" 

如果我想绑定到80端口,我需要成为根:

 $ sudo nc -l -p 80 

或者我可以将CAP_NET_BIND_SERVICEfunction分配给nc二进制:

 $ cp `which nc` . $ sudo setcap 'cap_net_bind_service=+ep' ./nc $ ./nc -l -p 80 

另一个select是编写服务器程序,使其在调用listen() ,会丢弃root权限。 这是一个很常见的解决scheme,你会看到它与大多数守护进程。 例如,Apache以root用户身份从init启动,然后删除root权限,一旦绑定到端口80,就成为用户www-data或类似的东西。尝试运行/etc/init.d/apache start作为不是root和Apache可能无法启动。