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

时间:2020-03-21 11:44:30  来源:igfitidea点击:

本教程说明了几种不同的方法来查找在Linux的特定端口上正在侦听哪个服务。
你们中的大多数人都知道流行服务或者流程的默认端口。
例如,Apache的默认端口是80,FTP的默认端口是21,SSH的默认端口是22.
我们可以按照本教程中的说明在Linux中找到端口名称和编号。

还可以将默认端口号更改为任何自定义端口,以保护Linux服务器。
例如,以下教程描述了如何将Apache,FTP和SSH的默认端口更改为其他端口。

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

如果更改了默认端口号,我们将如何找到哪个服务正在哪个端口上监听?

查找Linux特定端口上正在侦听的服务

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

方法1-使用netstat

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

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

要将其安装在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服务(在本例中为simpleHTTPserver)在端口号8000上侦听,mysqld服务在端口3306上侦听,ssh服务在端口号22上运行,apache2在端口80上运行,依此类推。

其中

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

上面的命令列出了所有服务以及它们正在侦听的端口号。
如果要查找哪个服务正在特定端口上监听怎么办?
这是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标志仅显示包含构成整个单词的匹配项的行。
换句话说,-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命令

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