在Linux系统中,网络端口是网络通信的逻辑端点。它们允许不同的应用程序或服务在同一台机器上通过网络进行数据交换。查看哪些端口正在被使用、被哪些程序使用,以及它们的状态,是系统管理、网络故障排除和安全审计中的一项基本且重要的任务。本文将围绕如何查看Linux系统中的端口使用情况展开详细说明。

端口是什么?

简单来说,端口是IP地址的延伸。如果将IP地址比作建筑物地址,那么端口号就可以比作建筑物内的房间号。数据包到达IP地址后,系统会根据其目标端口号将其导向运行在该端口上的特定应用程序或服务。端口号是一个16位的数字,范围从0到65535。常用的端口号(如HTTP的80、HTTPS的443、SSH的22)被称为“周知端口”或“注册端口”,范围在0-1023和1024-49151之间。动态或私有端口范围在49152-65535。端口与特定的协议(主要是TCP和UDP)相关联。

为什么需要查看端口?

查看Linux系统上的端口使用情况,是出于多种实际需求:

  • 确认服务是否正常运行: 如果一个网络服务(如Web服务器、数据库)启动了,但无法从外部访问,第一步通常是检查该服务是否正在其预期的端口上监听连接。
  • 故障排除: 当遇到网络连接问题时,查看端口状态可以帮助确定是服务没有运行、端口被占用、防火墙阻止连接,还是客户端连接到了错误的端口。
  • 安全审计: 检查系统上开放了哪些端口,有助于发现是否有未经授权的服务在运行,或者是否存在不必要的开放端口,从而减少潜在的攻击面。
  • 资源管理: 确定哪个进程正在使用哪个端口,这对于解决端口冲突或管理系统资源非常重要。

如何查看Linux系统中的端口?

Linux提供了几个强大的命令行工具来查看端口及其相关信息。最常用的是 netstatsslsof

使用 netstat 命令

netstat(network statistics)是一个非常经典的命令行工具,用于显示网络连接、路由表、接口统计等信息。虽然在一些新的发行版中推荐使用 ss,但 netstat 仍然广泛使用。

查看端口的常用选项组合是 -tulnp

netstat -tulnp

让我们分解这个命令的各个选项:

  • -t:显示TCP连接。
  • -u:显示UDP连接。
  • -l:仅显示正在监听(Listening)的套接字(即准备接受连接的端口)。
  • -n:以数字形式显示地址和端口号,而不是尝试解析主机名、服务名。这会使输出更快,并且更精确地显示端口号。
  • -p:显示使用端口的进程ID(PID)和程序名称。执行此操作通常需要root权限。

执行 netstat -tulnp 后,你会看到类似以下的输出(具体内容取决于你的系统运行的服务):

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1234/sshd
tcp6       0      0 :::80                   :::*                    LISTEN      5678/nginx
tcp6       0      0 :::443                  :::*                    LISTEN      5678/nginx
udp        0      0 0.0.0.0:68              0.0.0.0:*                           9101/dhclient

输出的列解释:

  • Proto: 套接字使用的协议(tcp, udp, tcp6, udp6)。
  • Recv-Q: 接收队列(Waiting for receive)。
  • Send-Q: 发送队列(Waiting for send)。
  • Local Address: 本地地址和端口号。0.0.0.0 表示监听所有IPv4地址,::表示监听所有IPv6地址。冒号后面的数字是端口号。
  • Foreign Address: 远程地址和端口号。0.0.0.0:* 或 :::* 表示接受来自任何地址的连接。
  • State: 套接字的状态。LISTEN表示端口正在监听连接;ESTABLISHED表示已建立连接;还有如TIME_WAIT, CLOSE_WAIT等其他状态。
  • PID/Program name: 使用该套接字的进程ID和程序名称。

使用 ss 命令

ss(socket statistics)是 netstat 的替代品,在处理大量连接时通常更快,因为它直接从内核空间获取套接字信息。其选项与 netstat 类似。

查看监听端口的常用命令:

ss -tulnp

选项的含义与 netstat 的基本相同:

  • -t:TCP。
  • -u:UDP。
  • -l:监听中。
  • -n:数字形式。
  • -p:显示进程。

ss 命令还有一些 netstat 没有的强大过滤和信息显示选项,但对于查看端口基本信息, -tulnp 是一个很好的起点。输出格式与 netstat 类似。

Netid State      Recv-Q Send-Q       Local Address:Port           Peer Address:Port
tcp   LISTEN     0      128                0.0.0.0:22                 0.0.0.0:* users:(("sshd",pid=1234,fd=3))
tcp   LISTEN     0      128                   [::]:80                    [::]:* users:(("nginx",pid=5678,fd=6))
tcp   LISTEN     0      128                   [::]:443                   [::]:* users:(("nginx",pid=5678,fd=7))
udp   UNCONN     0      0                  0.0.0.0:68                 0.0.0.0:* users:(("dhclient",pid=9101,fd=4))

ss 的输出通常在最后会包含更详细的进程信息(users:((…)))。

使用 lsof 命令

lsof(list open files)是一个非常通用的工具,顾名思义,它列出系统上打开的文件。在Linux中,网络连接也被视为一种文件。因此,lsof 也可以用来查看端口。

使用 lsof -i 可以列出所有的网络连接(互联网地址文件):

lsof -i

要只显示TCP或UDP端口:

lsof -i tcp

lsof -i udp

要查看特定端口的使用情况,例如查看谁占用了80端口:

lsof -i :80

或者查看特定协议和端口:

lsof -i tcp:80

lsof 的输出格式与其他命令略有不同,但包含了进程名称、PID、用户、文件描述符以及详细的网络地址信息:

COMMAND     PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd       1234   root    3u  IPv4  12345      0t0  TCP *:ssh (LISTEN)
nginx      5678 www-data    6u  IPv6  67890      0t0  TCP *:http (LISTEN)
nginx      5678 www-data    7u  IPv6  67891      0t0  TCP *:https (LISTEN)
dhclient   9101   root    4u  IPv4  10112      0t0  UDP *:bootpc

输出列解释:

  • COMMAND: 使用连接的命令名。
  • PID: 进程ID。
  • USER: 启动进程的用户。
  • FD: 文件描述符及其访问模式。
  • TYPE: 文件类型,IPv4或IPv6表示网络连接。
  • DEVICE: 设备号。
  • SIZE/OFF: 文件大小或偏移量。
  • NODE: 文件的节点号。
  • NAME: 网络地址和端口信息。(:ssh, *:http, *:https等)以及状态(LISTEN, ESTABLISHED)。

过滤和查找特定端口或进程

结合使用管道(|)和 grep 命令,可以轻松地从 netstatss 的输出中过滤出你需要的信息。

  • 查找使用特定端口的进程:

    netstat -tulnp | grep :80



    ss -tulnp | grep :80

    这会显示所有监听在80端口的TCP或UDP连接。

  • 查找特定服务的端口:

    netstat -tulnp | grep sshd



    ss -tulnp | grep sshd

    这会显示与sshd进程相关的端口和连接。

  • 查找特定IP地址的连接:

    netstat -an | grep ‘192.168.1.100’



    ss -an | grep ‘192.168.1.100’

    注意这里使用了 -a (显示所有连接,包括非监听的) 和 -n (数字形式) 来匹配具体的IP地址。

使用 lsof 过滤通常更直接,因为它内置了过滤选项 -i

  • lsof -i :22:查看使用22端口的进程。
  • lsof -i tcp:80:查看使用TCP 80端口的进程。
  • lsof -i @192.168.1.100:查看与192.168.1.100相关的网络活动。

一个系统有多少个端口?

理论上,每个IP地址可以有65536个TCP端口和65536个UDP端口,编号从0到65535。因此,一个Linux系统(对于每个IP地址)总共有超过13万个潜在的端口。然而,在实际系统中,绝大多数端口是关闭的或未被使用的。只有当某个应用程序或服务启动并明确“绑定”到某个端口时,该端口才会被系统打开并在相应的协议下处于监听状态(LISTEN),或者在建立连接后处于ESTABLISHED等状态。同时,操作系统会保留一些端口用于系统功能(如端口0通常不用)。所以,“多少”端口可用是一个理论数字,而“多少”端口被使用是一个动态的、取决于系统运行情况的实际数字。

总结

掌握如何在Linux中查看端口是进行系统管理和网络故障排除的关键技能。netstatss 是查看端口监听状态、连接状态和关联进程的主要工具,而 ss 在性能上通常优于 netstatlsof 提供了一个不同的视角,可以根据打开的文件来查找使用特定端口的进程。结合使用这些命令及其选项,以及 grep 等过滤工具,可以高效地获取所需的网络端口信息,帮助你诊断问题、验证服务或加强系统安全。

linux查看端口