在对网络连接或特定于应用程序的问题进行故障排除时,首先要检查的是应该在系统上实际使用哪些端口以及哪个应用程序正在侦听特定端口。本文介绍如何使用netstat、ss和lsof命令查找哪些服务正在侦听哪些端口,这些说明适用于所有基于Linux和Unix的操作系统,如macOS。
什么是侦听端口(Listening Port) 网络端口由其编号,关联的IP地址以及TCP或UDP等通信协议的类型标识。 侦听端口是应用程序或进程侦听的网络端口,充当通信端点。 可以使用防火墙打开或关闭(过滤)每个侦听端口,一般而言,开放端口是接收来自远程位置的传入数据包的网络端口。你不能在同一IP地址上侦听同一端口的两个服务。 例如,如果你正在运行侦听端口80和443的Apache Web服务器,并且你尝试安装Nginx,则后者将无法启动,因为HTTP和HTTPS端口已在使用中。
使用netstat检查侦听端口(Listening Port) netstat是一个命令行工具,可以提供有关网络连接的信息,参考检查Linux中的开放端口列表:使用netstat、nmap、ss、lsof命令。 要列出正在侦听的所有TCP或UDP端口,包括使用端口和套接字状态的服务,请使用以下命令: sudo netstat -tunlp 此命令中使用的选项具有以下含义: 1、-t:显示TCP端口。 2、-u:显示UDP端口。 3、-n:显示数字地址而不是解析主机。 4、-l:仅显示侦听端口。 5、-p:显示监听器进程的PID和名称,仅当你以root或sudo用户身份运行命令时,才会显示此信息。 输出看起来像这样:
我们案例中的重要信息是: 1、Proto:套接字使用的协议。 2、Local Address:进程侦听的IP地址和端口号。 3、PID/Program name:PID和过程名称。 如果要过滤结果,请使用grep命令,例如,要查找在TCP 22端口上侦听的进程,请输入: sudo netstat -tnlp | grep :22 输出显示在此机器端口22由SSH服务器使用:
如果输出为空,则表示没有任何内容正在侦听端口。 你还可以根据条件筛选列表,例如PID、协议、状态等,不过netstat已过时并替换为ss和ip,但仍然是检查网络连接最常用的命令。
用ss检查侦听端口 ss是新的netstat,它缺少一些netstat功能,但暴露了更多的TCP状态,而且速度稍快,命令选项大致相同,因此从netstat到ss的转换并不困难。 要获取带有ss的所有侦听端口的列表,请输入: sudo ss -tunlp 输出几乎与netstat报告的输出相同:
用lsof检查侦听端口 lsof是一个功能强大的命令行实用程序,它提供有关进程打开的文件的信息,参考Linux/Unix命令行工具:lsof一文。 在Linux中,一切都是文件,你可以将套接字视为写入网络的文件。 要获取具有lsof类型的所有侦听TCP端口的列表: sudo lsof -nP -iTCP -sTCP:LISTEN 使用的选项如下: 1、-n:不要将端口号转换为端口名。 2、-p:不解析主机名,显示数字地址。 3、-iTCP -sTCP:LISTEN:仅显示TCP状态LISTEN的网络文件。
大多数输出列名称都是很容易理解的: 1、COMMAND,PID,USER:运行与端口关联的程序的名称,pid和用户。 2、NAME:端口号。 要查找正在侦听特定端口的进程,例如3306端口,你将使用: sudo lsof -nP -iTCP:3306 -sTCP:LISTEN 输出显示MySQL服务器使用3306端口:
结论 我们向你展示了几个命令,你可以使用这些命令来检查Linux系统上正在使用的端口,以及如何查找特定端口上侦听的进程。
相关主题 |