如何在 Linux 中检查端口是否开放

LinuxLinuxBeginner
立即练习

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

简介

在这个实验中,你将学习在 Linux 系统上检查网络端口状态的基本技术。了解哪些端口处于开放状态对于网络管理、故障排除和安全分析至关重要。

你将首先使用带有特定选项的 netstat 命令来列出所有处于监听状态的开放 TCP 和 UDP 端口。接下来,你将使用更现代的 ss 命令确认端口状态,该命令提供类似的网络统计信息。最后,你将使用 nc(netcat)命令主动测试与特定端口的连接性,从客户端的角度验证该端口是否可访问且开放。通过完成这些步骤,你将获得在 Linux 环境中识别和验证开放端口的实用技能。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL linux(("Linux")) -.-> linux/RemoteAccessandNetworkingGroup(["Remote Access and Networking"]) linux/RemoteAccessandNetworkingGroup -.-> linux/nc("Networking Utility") linux/RemoteAccessandNetworkingGroup -.-> linux/netstat("Network Monitoring") subgraph Lab Skills linux/nc -.-> lab-558746{{"如何在 Linux 中检查端口是否开放"}} linux/netstat -.-> lab-558746{{"如何在 Linux 中检查端口是否开放"}} end

使用 netstat -tuln 列出开放端口

在这一步中,你将学习如何使用 netstat 命令列出 Linux 系统上的开放端口。了解哪些端口处于开放状态对于网络故障排除和安全至关重要。

netstat 命令(网络统计)是一个命令行工具,用于显示网络连接、路由表、接口统计信息、伪装连接和多播成员关系。

我们将使用 netstat 的以下选项:

  • -t:显示 TCP 连接。
  • -u:显示 UDP 连接。
  • -l:显示监听套接字(开放端口)。
  • -n:显示数字地址,而不解析主机名和服务名。

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

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

netstat -tuln

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

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN
tcp6       0      0 :::22                   :::*                    LISTEN
udp        0      0 127.0.0.53:53           0.0.0.0:*
udp        0      0 0.0.0.0:68              0.0.0.0:*

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

  • Proto:套接字的协议(例如,tcpudp)。
  • Local Address:本地 IP 地址和端口号。格式为 IP_Address:Port0.0.0.0 表示服务正在所有可用的 IPv4 接口上监听,::: 表示服务正在所有可用的 IPv6 接口上监听。
  • Foreign Address:远程 IP 地址和端口号。0.0.0.0:*:::* 表示套接字未连接到特定的远程地址(它正在监听)。
  • State:套接字的状态。LISTEN 表示端口已开放并正在等待传入连接。

在示例输出中,你可以看到端口 53(DNS)和端口 22(SSH)在 IPv4 和 IPv6 上都处于 LISTEN 状态。

此命令对于快速检查系统上正在运行和可访问的服务非常有用。

点击 继续 进入下一步。

使用 ss -tuln 确认端口状态

在上一步中,你使用 netstat 列出了开放端口。现在,让我们使用一个更现代且通常速度更快的工具 ss(套接字统计)来实现相同的目的。ss 旨在取代 netstat,并提供有关套接字的更详细信息。

我们将对 ss 使用与 netstat 类似的选项:

  • -t:显示 TCP 套接字。
  • -u:显示 UDP 套接字。
  • -l:显示监听套接字(开放端口)。
  • -n:显示数字地址,而不解析主机名和服务名。

如果终端尚未打开,请打开它。

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

ss -tuln

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

Netid  State      Recv-Q Send-Q Local Address:Port               Peer Address:Port
udp    UNCONN     0      0      127.0.0.53%lo:53                 0.0.0.0:*
udp    UNCONN     0      0      0.0.0.0:68                       0.0.0.0:*
tcp    LISTEN     0      128    127.0.0.53%lo:53                 0.0.0.0:*
tcp    LISTEN     0      128    0.0.0.0:22                       0.0.0.0:*
tcp    LISTEN     0      128    [::]:22                          [::]:*

该输出与 netstat 的输出类似,显示了协议(Netid)、状态(State)、本地地址和端口(Local Address:Port)以及对端地址和端口(Peer Address:Port)。

你可以看到相同的端口(53 和 22)被列为 LISTEN 状态,这证实了 netstat 的结果。

虽然输出格式略有不同,但 ss 提供了有关监听端口的类似信息,并且由于其性能和额外功能(在这个入门实验中我们不会涉及),在现代 Linux 系统中通常更受青睐。

同时使用 netstatss 有助于交叉参考信息,并让你熟悉 Linux 中可用的不同工具。

点击 继续 进入下一步。

使用 nc -zv 测试端口连通性

在前面的步骤中,你学习了如何使用 netstatss 列出开放端口。现在,让我们使用 nc 命令(netcat)来测试你是否真的可以连接到特定端口。nc 是一个多功能的网络工具,它可以使用 TCP 或 UDP 读写网络连接。

我们将使用 nc 的以下选项:

  • -z:指定 nc 仅扫描监听的守护进程,而不向它们发送任何数据。这对于检查端口是否开放很有用。
  • -v:启用详细输出,显示有关连接尝试的更多详细信息。

我们将测试到端口 22(SSH)的连通性,在前面的步骤中我们看到该端口正在监听。我们将测试连接到本地机器,本地机器可以通过 IP 地址 127.0.0.1 或主机名 localhost 来引用。

如果终端尚未打开,请打开它。

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

nc -zv 127.0.0.1 22

你应该会看到类似以下的输出:

Connection to 127.0.0.1 22 port [tcp/ssh] succeeded!

此输出确认 nc 能够成功连接到本地机器上的端口 22。

现在,让我们尝试测试一个可能未开放的端口,例如端口 80(HTTP),因为在此环境中默认没有运行 Web 服务器。

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

nc -zv 127.0.0.1 80

你可能会看到表明连接被拒绝或超时的输出,类似于以下内容:

nc: connect to 127.0.0.1 port 80 (tcp) failed: Connection refused

此输出表明 nc 无法连接到端口 80,这是预期的,因为该端口上没有服务在监听。

使用 nc -zv 是一种快速简便的方法,用于验证从你当前位置是否可以访问并打开特定端口。

点击 继续 完成此实验。

总结

在这个实验中,你学习了如何使用命令行工具检查 Linux 中的端口是否开放。你首先使用 netstat -tuln 命令列出所有处于监听状态的开放 TCP 和 UDP 端口,并了解了包括协议、本地地址、外部地址和状态在内的输出格式。

接下来,你使用 ss -tuln 命令确认了端口状态,该命令提供的信息与 netstat 类似,但通常被认为是更现代、速度更快的替代方案。最后,你学习了如何使用 nc -zv 命令测试与特定端口的连通性,该命令会尝试建立连接并报告端口是否开放且可访问。这些步骤为 Linux 系统的网络故障排除和安全分析提供了必要的技能。