本指南解释了几种不同的方法来查找哪个服务正在侦听 Linux 中的特定端口。 大多数人都知道流行服务或进程的默认端口。 例如,默认端口 Apache 是 80,FTP 默认端口是 21,SSH 默认端口是 22。您可以在 Linux 中找到端口名称和编号,如 本指南. 默认端口号也可以更改为任何自定义端口以保护 Linux 服务器。 例如,以下指南描述了如何更改默认端口 Apache, FTP 和 SSH 到不同的端口。
- 如何改变 Apache 默认端口到自定义端口
- 如何将 FTP 默认端口更改为自定义端口
- 如何将 SSH 默认端口更改为自定义端口
如果更改默认端口号,您将如何找到哪个服务正在侦听哪个端口? 这就是我们现在要发现的!
内容
查找哪个服务正在侦听 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
如您所见,python 服务 (简单的HTTP服务器 在这种情况下)正在侦听端口号 8000,mysqld 服务正在侦听端口 3306,ssh 服务正在端口号 22 上运行,apache2 正在端口号 80 上运行,依此类推。
这里,
-t
标志显示 tcp 连接。-u
标志显示 udp 连接。-l
flag 显示监听套接字。-p
标志显示进程 ID(PID) 和任何使用该端口的进程名称。-n
flag 显示数字地址。
上面的命令列出了所有服务和它们正在监听的端口号。 如果您想查找哪个服务正在侦听特定端口怎么办? 这里是哪里 grep 命令 派上用场! 我们可以结合 netstat
和 grep
过滤特定服务的输出的命令,例如 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))
要过滤特定服务(例如 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)
有关更多详细信息,请参阅手册页。
$ 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
有关更多详细信息,请浏览手册页。
$ man fuser
您现在知道了四种不同的工具来查找哪些进程正在侦听哪些端口。 所有这四个都易于使用,并且在大多数 Linux 发行版中都可用。 如果您知道任何其他工具,请在下面的评论部分告诉我们。 我将相应地检查并更新此列表。
CL如果userLinuxLinux命令Linux Serviceslsofnetstat端口号Processesss