如何检查 Linux 中特定网络套接字是否开放

LinuxLinuxBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在这个实验中,你将学习如何在 Linux 系统中检查特定的网络套接字(socket)是否处于开放状态。掌握识别和检查活动网络套接字的方法,是进行网络故障排查和监控的一项基本技能。

通过实际操作练习,你将使用像 ssnetstat 这样强大的命令行工具来列出并过滤网络连接。你还将探索 /proc/net 文件系统,以更深入地了解套接字的详细信息,从而全面验证系统上网络套接字的状态。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL linux(("Linux")) -.-> linux/BasicFileOperationsGroup(["Basic File Operations"]) linux(("Linux")) -.-> linux/RemoteAccessandNetworkingGroup(["Remote Access and Networking"]) linux/BasicFileOperationsGroup -.-> linux/cat("File Concatenating") linux/RemoteAccessandNetworkingGroup -.-> linux/netstat("Network Monitoring") subgraph Lab Skills linux/cat -.-> lab-558761{{"如何检查 Linux 中特定网络套接字是否开放"}} linux/netstat -.-> lab-558761{{"如何检查 Linux 中特定网络套接字是否开放"}} end

使用 ss -tuln 检查套接字

在这一步中,你将学习如何使用 ss 命令来检查 Linux 系统上的网络套接字(socket)。套接字是网络中数据收发的端点。了解如何查看活动的套接字对于网络故障排查和监控至关重要。

ss 命令是一个用于检查套接字的强大工具。我们将使用以下选项:

  • -t:显示 TCP 套接字。
  • -u:显示 UDP 套接字。
  • -l:显示监听套接字(等待连接的套接字)。
  • -n:不解析服务名称(显示端口号而非服务名)。

如果终端尚未打开,请打开它。你可以在桌面左侧找到 Xfce 终端 图标。

现在,输入以下命令并按回车键:

ss -tuln

你将看到类似如下的输出:

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:*
tcp   LISTEN     0      128    127.0.0.1:631                    0.0.0.0:*
tcp   LISTEN     0      128    0.0.0.0:5900                     0.0.0.0:*
tcp   LISTEN     0      128    127.0.0.1:25                     0.0.0.0:*
tcp   LISTEN     0      128    [::]:22                          [::]:*
tcp   LISTEN     0      128    [::1]:631                        [::]:*
tcp   LISTEN     0      128    [::]:5900                        [::]:*
tcp   LISTEN     0      128    [::1]:25                         [::]:*
udp   UNCONN     0      0      127.0.0.1:323                    0.0.0.0:*
udp   UNCONN     0      0      0.0.0.0:631                      0.0.0.0:*
udp   UNCONN     0      0      [::1]:323                        [::]:*
udp   UNCONN     0      0      [::]:631                         [::]:*

让我们来分析一下输出内容:

  • Netid:套接字的类型(例如,tcpudp)。
  • State:套接字的状态(例如,LISTEN 表示它正在等待连接)。
  • Recv-Q:接收队列中的字节数。
  • Send-Q:发送队列中的字节数。
  • Local Address:Port:套接字绑定的本地 IP 地址和端口号。0.0.0.0[::] 分别表示套接字正在所有可用的网络接口(IPv4 和 IPv6)上监听。
  • Peer Address:Port:套接字连接的远程 IP 地址和端口号。* 表示套接字正在监听来自任何远程地址的连接。

此输出显示了系统上正在运行并监听连接的服务。例如,你可以看到 SSH(端口 22)、CUPS(端口 631)、VNC(端口 5900)和邮件服务器(端口 25)正在监听。

理解此输出是诊断网络连接问题或识别系统上可能存在的不必要服务的第一步。

点击 继续 进入下一步。

使用 netstat -tuln 验证套接字

在这一步中,你将使用另一个命令 netstat 来验证网络套接字(socket)。与 ss 相比,netstat 是一个较旧的命令,但它仍然被广泛使用,并且能提供有关网络连接、路由表和接口统计信息等类似内容。

我们将使用与 ss 相同的选项来运行 netstat,以查看监听的 TCP 和 UDP 套接字,且不解析服务名称:

  • -t:显示 TCP 套接字。
  • -u:显示 UDP 套接字。
  • -l:显示监听套接字。
  • -n:不解析服务名称。

在终端中输入以下命令并按回车键:

netstat -tuln

你将看到类似如下的输出:

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN
tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:5900            0.0.0.0:*               LISTEN
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN
tcp6       0      0 :::22                   :::*                    LISTEN
tcp6       0      0 ::1:631                 :::*                    LISTEN
tcp6       0      0 :::5900                 :::*                    LISTEN
tcp6       0      0 ::1:25                  :::*                    LISTEN
udp        0      0 127.0.0.1:323           0.0.0.0:*
udp        0      0 0.0.0.0:631             0.0.0.0:*
udp6       0      0 ::1:323                 :::*
udp6       0      0 :::631                  :::*

注意,netstat -tuln 的输出与 ss -tuln 的输出非常相似。这两个命令都提供了有关协议(Proto)、本地地址和端口(Local Address)、外部地址和端口(Foreign Address)以及连接状态(State)的信息。

虽然在复杂场景下,ss 通常被认为速度更快且信息更丰富,但 netstat 仍然是你 Linux 命令工具库中的一个有价值的工具。熟悉这两个命令是很好的做法。

你现在已经成功使用 ssnetstat 查看了监听套接字。这是了解系统网络活动的一项基本技能。

点击 继续 进入下一步。

检查 /proc/net 中的套接字详细信息

在这一步中,你将探索 /proc/net 目录,该目录提供了有关 Linux 内核中网络栈和网络协议的详细信息。ssnetstat 等命令的数据就来源于此。

/proc 文件系统是一个虚拟文件系统,它提供了有关进程和其他系统信息。这是检查内核内部状态的一种强大方式。

/proc/net 目录中,你会找到包含网络连接原始数据的文件。例如,tcpudptcp6udp6 文件分别包含了活动的 TCP 和 UDP 套接字(分别对应 IPv4 和 IPv6)的信息。

让我们查看 tcp 文件的内容。在终端中输入以下命令并按回车键:

cat /proc/net/tcp

你将看到类似如下的输出:

sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode ref pointer drops
   0: 0100007F:0019 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 12345 1 0000000000000000 0
   1: 00000000:0016 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 67890 1 0000000000000000 0
   ... (more lines)

这个输出不如 ssnetstat 的输出直观,因为它是内核的原始数据。每一行代表一个 TCP 套接字,包含多个字段,其中包括:

  • sl:套接字列表索引。
  • local_address:以十六进制格式表示的本地 IP 地址和端口。0100007F127.0.0.1(回环地址)的十六进制表示,0019 是端口 25 的十六进制表示。
  • rem_address:以十六进制格式表示的远程 IP 地址和端口。
  • st:套接字的状态(例如,0A 表示 LISTEN)。
  • tx_queue:发送队列大小。
  • rx_queue:接收队列大小。
  • uid:拥有该套接字的用户 ID。
  • inode:套接字的 inode 编号。

你还可以通过查看 /proc/net/udp 文件来查看 UDP 套接字:

cat /proc/net/udp

对于 IPv6 套接字,你可以检查 /proc/net/tcp6/proc/net/udp6 文件。

虽然在日常使用中你通常不会直接解析这些文件,但了解网络信息的来源可以让你更深入地了解 Linux 是如何管理网络连接的。像 ssnetstat 这样的命令本质上是读取并格式化这些文件中的数据,以便于理解。

你现在已经探索了 /proc/net 文件系统中可用的原始套接字信息。

点击 继续 完成实验。

总结

在本次实验中,你学习了如何使用各种命令行工具来检查 Linux 系统中特定的网络套接字是否处于开放状态。你首先使用了带有 -tuln 选项的 ss 命令来显示正在监听的 TCP 和 UDP 套接字,并了解了输出列,如 NetidStateLocal Address:PortPeer Address:Port

在使用 ss 之后,你通常会使用 netstat 命令来验证套接字信息,该命令提供了类似的网络统计数据。最后,你探索了如何直接从 /proc/net 文件系统中检查详细的套接字信息,这能让你从更底层的视角了解网络栈。这些步骤为识别和检查 Linux 系统上开放的网络套接字提供了一个全面的方法。