计算机端口

简介

计算机“端口”是英文 port 的义译,可以认为是计算机与外界通讯交流的出口。其中硬件领域的端口又称接口,如:USB端口、串行端口等。软件领域的端口一般指网络中面向连接服务和无连接服务的通信协议端口,是一种抽象的软件结构,包括一些数据结构和 I/O(基本输入输出)缓冲区。

提示

从现实世界理解端口

将计算机想象成一栋医院大楼,里边有很多科室,科室里还会有主任医师、副主任医师、主治医师等等的单独诊室。挂号处就相当于 inetd 守护进程,而一个个的诊室就相当于端口(门牌号相当于端口号),每个端口负责不同的服务,处理不同的请求。比如:80 诊室负责处理 Web 请求,访客可以通过 80 端口获得网页内容。后来负责处理 Web 请求的人搬进了 8080 诊室,继续做相同的工作。另外一个人搬进了 80 诊室,但他并不处理 Web 请求(或者 80 诊室停止使用了)。那么再有试图通过 80 诊室获得网页内容的访客就会“吃闭门羹”,只有通过新的 8080 诊室才能获得网页内容。

每个端口都拥有一个叫端口号的整数描述符,用来区别不同的端口。由于 TCP/IP 传输层的 TCP 和 UDP 两个协议是两个完全独立的软件模块,因此各自的端口号也相互独立。如 TCP 有一个 255 号端口,UDP 也可以有一个 255 号端口,两者并不冲突。

注解

面向连接(TCP)和无连接协议(UDP)

面向连接服务的特点:面向连接服务要经过三个阶段:数据传数前,先建立连接;连接建立后再传输数据;数据传送完后,释放连接。面向连接服务,可确保数据传送的次序和传输的可靠性。

无连接服务的特点是:无连接服务只有传输数据阶段,消除了除数据通信外的其它开销。它的优点是灵活方便、迅速,特别适合于传送少量零星的报文。缺点也很明显,它不能防止报文的丢失、重复或失序。

要区分“面向连接服务”和“无连接服务”的概念特别简单,来举两个形象的例子:打电话和写信。两个人要通电话,必须先建立连接——拨号,等待应答后才能相互传递信息,最后还要释放连接——挂电话。而写信就没有那么复杂了,地址姓名填好以后直接往邮筒一扔,收信人就能收到。TCP/IP 协议里面低于 1024 的端口都有确切的定义,它们对应着因特网上常见的一些服务。这些常见的服务可以划分为使用 TCP 端口(面向连接如打电话)和使用 UDP 端口(无连接如写信)两种。

端口号有两种基本分配方式:第一种叫全局分配,这是一种集中分配方式,由一个公认权威的中央机构根据用户需要进行统一分配,并将结果公布于众;第二种是本地分配(又称动态连接),即进程需要访问传输层服务时,向本地操作系统提出申请,操作系统返回本地唯一的端口号,进程再通过合适的系统调用,将自己和该端口连接起来(binding,绑定)。

TCP/IP 端口号的分配综合了以上两种方式,将端口号分为两部分,少量的作为保留端口,以全局方式分配给服务进程。每一个标准服务器都拥有一个全局公认的端口叫周知口,即使在不同的机器上,其端口号也相同。剩余的为自由端口,以本地方式进行分配。TCP 和 UDP 规定,小于 256 的端口才能作为保留端口。

按端口号可分为三大类:

  1. 公认端口(Well Known Ports):从 0 到 1023,它们紧密绑定(binding)于一些服务。通常这些端口的通讯明确表明了某种服务的协议。例如:80 端口实际上总是 HTTP 通讯。
  2. 注册端口(Registered Ports):从 1024 到 49151,它们松散地绑定于一些服务。也就是说有许多服务绑定于这些端口,这些端口同样用于许多其它目的。例如:许多系统处理动态端口从 1024 左右开始。
  3. 动态/私有端口(Dynamic and/or Private Ports):从 49152 到 65535,理论上,不应为服务分配这些端口。实际上,机器通常从 1024 起分配动态端口。但也有例外:SUN 的 RPC 端口从 32768 开始。

注解

系统管理员可以“重定向”端口:

实现重定向是为了隐藏公认的默认端口,降低受破坏率。如果有人要对一个默认端口进行攻击必须先进行端口扫描,确定是否开启了此端口。大多数端口重定向与原端口有相似之处,例如多数 HTTP 端口由 80 变化而来:81、88、8000、8080、8888,许多人有其它原因选择奇怪的数:42,69,666,31337。Blake R. Swopes 指出使用重定向端口还有一个原因,在 UNIX 系统上,想侦听 1024 以下的端口需要有 root 权限,如果你没有 root 权限而又想开 web 服务,就需要将其重定向到较高的端口。此外,一些 ISP 的防火墙(路由器层面)将阻挡低端口的通讯,这样的话即使你拥有主机 root 权限,需要连接外网还是得重定向到较高的端口。

将默认的 HTTP 端口 80 重定向到端口 8080,网页的访问地址也要相应的改变:http://wwd.adiba.top:8080/net/port.html

关闭不必要的端口

有人曾经把服务器比作房子,而把端口比作通向不同房间(服务)的门,如果不考虑细节的话,这是一个不错的比喻。入侵者要进入房子,势必要破门窗而入,那么对于入侵者来说,了解房子开了几扇门,都是什么样的门,门后面有什么东西就显得至关重要。

入侵者通常会用扫描器对目标主机的端口进行扫描,以确定哪些端口是开放的,从开放的端口,入侵者可以知道目标主机大致提供了哪些服务,进而猜测可能存在的漏洞,因此对端口的扫描可以帮助我们更好的了解目标主机,而对于管理员,扫描本机的开放端口也是做好安全防范的第一步。

查看端口信息

netstat -a     #列出所有端口
netstat -at    #列出所有tcp端口
netstat -au    #列出所有udp端口

netstat -l        #只显示监听端口
netstat -lt       #只列出所有监听 tcp 端口
netstat -lu       #只列出所有监听 udp 端口

关闭一个端口

下面介绍两种关闭 linux 系统端口的方法:

  1. 通过杀掉进程的方法来关闭端口

    每个端口都是一个进程占用着,都会有一个守护进程,kill 掉这个守护进程就可以了。

    netstat -anp | grep 端口号 # 找出占用端口的进程
    kill -9 PID # 通过 PID 杀掉进程
    
  2. 通过防火墙限制端口

    其中 $port 即为端口数字,iptables 的具体用法可以查看 man 手册

    iptables -A INPUT -p $port -j ACCEPT # 打开端口服务
    iptables -A INPUT -p $port -j DROP   # 关闭端口服务
    

特殊的文件

/etc/services 文件是记录网络服务名和它们对应使用的端口号及协议。文件中的每一行对应一种服务,它由 4 个字段组成,中间用 TAB 或空格分隔,分别表示“服务名称”、“使用端口”、“协议名称”以及“别名”。

# /etc/services 文件截取部分
kermit           1649/udp
l2tp             1701/tcp     l2f
l2tp             1701/udp     l2f
h323gatedisc     1718/tcp

很多的系统程序都要使用这个文件。如果每一个服务都能够严格遵循该机制,在此文件里标注自己所使用的端口信息,则主机上各服务间对端口的使用,将会非常清晰明了,易于管理;在该文件中定义的服务名,可以作为配置文件中的参数使用。例如:在配置路由策略时,使用"www"代替"80",即为调用了此文件中的条目“www 80”;

且当有特殊情况,需要调整端口设置,只需要在 /etc/services 中修改 www 的定义,即可影响到服务。

例如:在文件中增加条目“privPort 55555”,在某个私有服务中多个配置文件里广泛应用,进行配置。当有特殊需要,要将这些端口配置改为66666,则只需修改 /etc/services 文件中对应行即可。

在应用程序中可以通过服务名和协议获取到对应的端口号,通过在该文件注册可以使应用程序不再关心端口号。