欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

《Linux防火墙(第4版)》——1.7 服务端口:通向您系统中程序的大门

最编程 2024-08-11 14:37:23
...

本节书摘来自异步社区《Linux防火墙(第4版)》一书中的第1章,第1.7节,作者:【美】Steve Suehring(史蒂夫 苏哈林)著,更多章节内容可以访问云栖社区“异步社区”公众号查看

1.7 服务端口:通向您系统中程序的大门

基于网络的服务是运行在其他人可以通过网络访问到的计算机上的程序。而服务端口标识了某个会话或连接所在的程序。对于不同的基于网络的服务来说,服务端口是不同的数字式名称。它们也作为数字标识符在两个程序的特定连接中标识不同的端点。服务端口号的范围是0~65535。

服务端程序(即守护进程,daemon)在为它分配的服务端口上监听到来的连接。按历史上的惯例,主要的网络服务都使用已被分配的公认端口,端口号是1~1023。这些数字到服务的映射关系由因特网地址分配委员会(IANA)协调并作为全球接受的惯例或标准。

一个广告服务在互联网上仅仅通过分配给它的端口可用。如果您的计算机没有提供一个特定的服务,而某人尝试连接到和此服务相关的端口时,任何事都不会发生。有人在敲门,但没有人在那里做应答。例如,HTTP被分配的端口号是80(当然,您可以将它运行在8080、20943或任何可用的端口上)。如果您的计算机没有在运行基于HTTP的Web服务器,而某人尝试连接到80端口,此时客户端程序会从您的计算机处收到一个连接关闭消息和一个错误消息,表示并未提供该服务。

1024~65535的更高的端口号被称为非特权端口(unprivileged port)。它们的存在有两个目的。大多数情况下,这些端口被动态分配给连接的客户端。客户端和服务端的一对端口号,外加两个主机各自的IP地址,以及使用的传输协议唯一地标识了该连接。

另外,1024~49151的端口号是在IANA注册的端口号。这些端口能够被作为通常的非特权端口号池中的一部分,但它们也绑定了一些特定的服务,例如SOCKS或XWindow服务。最初,那些运行在更高的端口号上的服务并不以root权限运行。这些端口被用户级、非特权的程序使用。但这个惯例不适用于某些个别的特例。

服务名到端口号的映射
 

Linux 发行版提供一系列的常用服务端口号。这个列表能在 /etc/services 中找到。

每个条目由一个服务名、分配给它的端口号、此服务使用的协议( TCP 或 UDP )和其他任何可选的服务别称组成。 表 1.5 列出了一些从 Red Hat Linux 中截取的常用的服务名到端口号的映射。
screenshot
请注意,与端口号相关联的符号名依不同的 Linux 发行版和版本而不同。 服务名和别称不同,但端口号一致。

另外请注意端口号和一个协议相关联。 IANA 尝试为同一个服务端口号同时分配 TCP 和 UDP 协议,而不论该服务是否使用两种传输方式。大多数服务使用两者中的一个协议。而域名服务( DNS )二者均使用。
1.7.1 一个典型的TCP连接:访问远程站点
以通过您的浏览器访问Web站点(连接到一个Web服务器)这种常用的TCP连接为例。这部分举例说明连接建立过程和通信过程中与IP数据包过滤(接下来的章节中会介绍)相关的各个方面。

这个过程中到底发生了什么呢?如图1.6所示,某处的计算机中运行着一个Web服务器,等待着从80端口到来的TCP请求。您在Web浏览器中点击一个URL时,URL中的一部分被理解为主机名;该主机名被翻译成Web服务器的IP地址;然后,您的浏览器被分配了一个非特权端口号(例如,TCP端口14000)以便用于连接。接下来,一个发往Web服务器的HTTP消息被建立了。它被封装在一个TCP消息中(并包裹着IP数据报头),然后被发送出去。对于我们的目的而言,报头所包含的字段可见图1.6。

额外的信息被包括在报头中,它们对数据包过滤层次来说是不可见的。然而,描述SYN标志、ACK标志和相关的序列号有助于弄清楚在三次握手中到底发生了什么。当客户端程序发送它的第一个连接请求消息时,SYN标志和同步的序列号均被设置。在客户端向服务器请求连接时,它会传递一个序列号,此序列号会被作为所有客户端发送的其余数据的起始编号。

screenshot

这个数据包将在服务器计算机处被接收。它被发送到80服务端口。由于服务器在监听80端口,因此有到来的连接请求(SYN连接同步请求标志)时,它将接到通知:一个请求从源IP地址和某端口号组成的套接字(您的IP地址,14000)处到来。服务器会在分配一个新套接字(Web服务器IP地址,80)并将此套接字与客户端的套接字关联在一起。

Web服务器会使用确认报文应答该SYN消息,同时会发起SYN请求。如图1.7所示,连接目前处于半打开状态。

screenshot

两个对于数据包过滤级别而言不可见的域均包含在SYN-ACK报头中。服务器发出的报文包括了ACK标志,以及客户端的序列号加上接收到的连续数据的字节数。该确认报文的目的是确认已收到客户端的序列号所标记的数据。服务器通过增加客户端的序列号来进行确认,高效地向客户端表明它已收到了数据,而序列号加1便是服务器期望收到的下一字节数据。由于服务器已经确认收到了最初的SYN消息,客户端此时可以随意丢掉它了。

服务器也在它的第一个消息中设置了SYN标志。和客户端的第一个消息相同,这个SYN标志也伴随一个同步序列号一同发送。服务器为此半连接(从服务器发送数据到客户端,作者将此发送功能作为一个半连接)传递它自己的起始序列号。

只有服务器发送的第一条消息是需要设置SYN标志的。这条消息和以后的消息均需要设置ACK标志。在我们获得可用的信息以构建防火墙时,所有服务器消息里出现的ACK标志相比客户端的第一条缺乏ACK标志的消息,将是一个关键的差别。

在连接建立后,您的计算机接收到此消息并以自己的确认进行应答。图1.8以图例显示了这个过程。从此以后,客户端和服务器(发送的报文中)都会设置ACK标志,但SYN标志不会再被任何一方设置了。

screenshot

随着每一次的确认,客户端和服务端程序递增对方进程的序列号(接收到的消息中的序列号),每收到一个连续的数据字节,序列号加1。这种确认序列号表明已收到了那些字节的数据,并指明了程序想接收的流中的下一个数据字节。

在您的浏览器接收Web页面时,您的计算机从Web服务器接收了包括数据包报头在内的数据消息,如图1.9所示。

screenshot