如何查找正在侦听特定端口的服务

本指南解释了几种不同的方法来查找哪个服务正在侦听 Linux 中的特定端口。 大多数人都知道流行服务或进程的默认端口。 例如,默认端口 Apache 是 80,FTP 默认端口是 21,SSH 默认端口是 22。您可以在 Linux 中找到端口名称和编号,如 本指南. 默认端口号也可以更改为任何自定义端口以保护 Linux 服务器。 例如,以下指南描述了如何更改默认端口 Apache, FTP 和 SSH 到不同的端口。

  • 如何改变 Apache 默认端口到自定义端口
  • 如何将 FTP 默认端口更改为自定义端口
  • 如何将 SSH 默认端口更改为自定义端口

如果更改默认端口号,您将如何找到哪个服务正在侦听哪个端口? 这就是我们现在要发现的!

内容

  1. 查找哪个服务正在侦听 Linux 中的特定端口
    1. 方法 1 – 使用 netstat
    2. 方法 2 – 使用“ss”命令
    3. 方法 3 – 使用 lsof
    4. 方法 4 – 使用 fuser 命令

查找哪个服务正在侦听 Linux 中的特定端口

我在下面列出了四种方法来检查特定端口号中正在运行的服务。 如果将来遇到任何新方法,我将继续更新此列表。 因此,将其添加为书签并偶尔检查一次。

方法 1 – 使用 netstat

这是查找哪个服务正在侦听哪个端口的最常用方法。 网络统计 是一个命令行实用程序,用于打印网络连接、路由表、接口统计信息、伪装连接和多播成员资格。

Netstat 在大多数 Linux 发行版的默认存储库中都可用。

要将其安装在 Arch Linux 及其变体上,请执行以下操作:

$ sudo pacman -S net-tools

在 CentOS、RHEL 上:

$ sudo yum install net-tools

在 Fedora:

$ sudo dnf install net-tools

在 Debian、Ubuntu 上:

$ sudo apt install net-tools

安装后,运行以下命令以查找哪些服务正在侦听哪些端口:

$ sudo netstat -tulpn

样本输出:

Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name     tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      665/systemd-resolve  tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1026/sshd            tcp        0      0 0.0.0.0:8000            0.0.0.0:*               LISTEN      2068/python3         tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      1072/mysqld          tcp6       0      0 :::22                   :::*                    LISTEN      1026/sshd            tcp6       0      0 :::80                   :::*                    LISTEN      1062/apache2         udp        0      0 127.0.0.53:53           0.0.0.0:*                           665/systemd-resolve  udp        0      0 192.168.225.22:68       0.0.0.0:*                           647/systemd-network  udp        0      0 192.168.225.53:68       0.0.0.0:*                           647/systemd-network  udp6       0      0 fe80::a00:27ff:feff:546 :::*                                647/systemd-network  udp6       0      0 fe80::a00:27ff:fe7e:546 :::*                                647/systemd-network
在 Linux 中使用 netstat 查找哪些服务正在侦听哪些端口

如您所见,python 服务 (简单的HTTP服务器 在这种情况下)正在侦听端口号 8000,mysqld 服务正在侦听端口 3306,ssh 服务正在端口号 22 上运行,apache2 正在端口号 80 上运行,依此类推。

这里,

  • -t 标志显示 tcp 连接。
  • -u 标志显示 udp 连接。
  • -l flag 显示监听套接字。
  • -p 标志显示进程 ID(PID) 和任何使用该端口的进程名称。
  • -n flag 显示数字地址。

上面的命令列出了所有服务和它们正在监听的端口号。 如果您想查找哪个服务正在侦听特定端口怎么办? 这里是哪里 grep 命令 派上用场! 我们可以结合 netstatgrep 过滤特定服务的输出的命令,例如 mysqld,如下所示。

$ sudo netstat -tulpn | grep mysqld [sudo] password for sk:  tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 1076/mysqld

看? mysqld 服务正在侦听端口号 3306。

如果您已经知道端口号,但不知道当前正在使用哪个服务,只需将服务名称替换为端口号,如下所示。

$ sudo netstat -tulpn | grep -w 3306 tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 1076/mysqld

这里, -w flag 仅显示那些包含构成整个单词的匹配项的行。 换句话说, -w 选项显示给定字符串的完全匹配。

你也可以使用 -i 忽略大小写区别,以便仅大小写不同的字符相互匹配

$ sudo netstat -tulpn | grep -i 3306

就是这么简单。

有关更多详细信息,请参阅手册页。

$ man netstat

Netstat 大多已过时。 netstat 的替代方案是“ss”。

方法 2 – 使用“ss”命令

ss 是用于调查套接字的命令行实用程序。 它是 netstat 的替代品,“ss”的用法与“netstat”几乎相同。 它预装在 Ubuntu 及其变体上。

要查找哪些服务正在侦听哪些端口,请运行:

$ sudo ss -tulpn

样本输出:

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:*               users:(("systemd-resolve",pid=671,fd=12))                                                                                                                                 udp            UNCONN            0                 0                                         192.168.225.22%enp0s3:68                              0.0.0.0:*               users:(("systemd-network",pid=653,fd=17))                                                                                                                                 udp            UNCONN            0                 0                                         192.168.225.53%enp0s8:68                              0.0.0.0:*               users:(("systemd-network",pid=653,fd=25))                                                                                                                                 udp            UNCONN            0                 0                             [fe80::a00:27ff:fe7e:8a9c]%enp0s8:546                                [::]:*               users:(("systemd-network",pid=653,fd=24))                                                                                                                                 udp            UNCONN            0                 0                             [fe80::a00:27ff:feff:d2e0]%enp0s3:546                                [::]:*               users:(("systemd-network",pid=653,fd=22))                                                                                                                                 tcp            LISTEN            0                 80                                                    127.0.0.1:3306                            0.0.0.0:*               users:(("mysqld",pid=1076,fd=32))                                                                                                                                         tcp            LISTEN            0                 128                                               127.0.0.53%lo:53                              0.0.0.0:*               users:(("systemd-resolve",pid=671,fd=13))                                                                                                                                 tcp            LISTEN            0                 128                                                     0.0.0.0:22                              0.0.0.0:*               users:(("sshd",pid=1015,fd=3))                                                                                                                                            tcp            LISTEN            0                 128                                                           *:80                                    *:*               users:(("apache2",pid=1094,fd=4),("apache2",pid=1090,fd=4),("apache2",pid=1089,fd=4),("apache2",pid=1088,fd=4),("apache2",pid=1087,fd=4),("apache2",pid=1062,fd=4))       tcp            LISTEN            0                 128                                                        [::]:22                                 [::]:*               users:(("sshd",pid=1015,fd=4))
在 Linux 上使用 ss 命令查找哪些服务正在侦听哪些端口

要过滤特定服务(例如 mysqld)的输出,请使用:

$ sudo ss -tulpn | grep -w mysqld tcp LISTEN 0 80 127.0.0.1:3306 0.0.0.0:* users:(("mysqld",pid=1076,fd=32))

有关更多详细信息,请参阅手册页。

$ man ss

方法 3 – 使用 lsof

正如名字所说, lsof 是一个命令行实用程序,用于列出属于所有活动进程的所有打开文件。

要在 Linux 上安装它,请根据您使用的分发类型使用以下命令。

在 Arch Linux 上:

$ sudo pacman -S lsof

在 Debian、Ubuntu 上:

$ sudo apt install lsof

在 CentOS、RHEL 上:

$ sudo yum install lsof

在 Fedora:

$ sudo dnf install lsof

要查找哪些进程在哪些端口上运行,只需指定端口号,如以下命令所示:

$ sudo lsof -i :80

样本输出:

COMMAND  PID     USER   FD   TYPE DEVICE SIZE/OFF NODE NAME apache2 1062     root    4u  IPv6  20452      0t0  TCP *:http (LISTEN) apache2 1087 www-data    4u  IPv6  20452      0t0  TCP *:http (LISTEN) apache2 1088 www-data    4u  IPv6  20452      0t0  TCP *:http (LISTEN) apache2 1089 www-data    4u  IPv6  20452      0t0  TCP *:http (LISTEN) apache2 1090 www-data    4u  IPv6  20452      0t0  TCP *:http (LISTEN) apache2 1094 www-data    4u  IPv6  20452      0t0  TCP *:http (LISTEN)
在 Linux 上使用 lsof 命令查找正在侦听特定端口的服务使用 lsof 命令查找正在侦听特定端口的服务

有关更多详细信息,请参阅手册页。

$ man lsof

方法 4 – 使用 fuser 命令

定影器 是另一个使用文件或套接字识别进程的命令行实用程序。 它显示使用指定文件或文件系统的进程的 PID。

它也可以在大多数 Linux 发行版的默认存储库中使用。

要在 Arch Linux 上安装它,请运行:

$ sudo pacman -S psmisc

在 Debian、Ubuntu 上:

$ sudo apt install psmisc

在 CentOS、RHEL 上:

$ sudo yum install psmisc

在 Fedora:

$ sudo dnf install psmisc

首先,我们需要找到侦听特定端口的服务或进程的 PID。 例如,我将使用以下命令查找侦听端口 3306 的进程的 PID:

$ sudo fuser 3306/tcp

您将看到如下所示的输出。

3306/tcp: 1076

这里, 1076 是PID。

然后使用 PID 命令找出实际进程:

$ ps -p 1076 -o comm= mysqld

或者,您可以使用 -v 标志以在单个命令中查看完整的详细信息。

$ sudo fuser -v 3306/tcp                      USER        PID ACCESS COMMAND 3306/tcp:            mysql      1076 F.... mysqld
使用 fuser 命令查找正在侦听特定端口的服务使用 fuser 命令查找正在侦听特定端口的服务

有关更多详细信息,请浏览手册页。

$ man fuser

您现在知道了四种不同的工具来查找哪些进程正在侦听哪些端口。 所有这四个都易于使用,并且在大多数 Linux 发行版中都可用。 如果您知道任何其他工具,请在下面的评论部分告诉我们。 我将相应地检查并更新此列表。

CL如果userLinuxLinux命令Linux Serviceslsofnetstat端口号Processesss