如何查找特定端口上正在侦听的服务
本教程说明了几种不同的方法来查找在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