当前位置:首页>Linux>Linux 端口监听检查工具详解:ss、netstat、lsof

Linux 端口监听检查工具详解:ss、netstat、lsof

  • 2026-10-11 05:33:26
Linux 端口监听检查工具详解:ss、netstat、lsof

在 Linux 系统运维和故障排查过程中,检查端口监听状态是最基础也是最重要的操作之一。通过查看哪些端口正在被监听,可以快速定位服务是否正常运行、排查端口冲突问题、以及识别潜在的安全风险。本文将详细介绍三款常用的端口检查工具:ss、netstat 和lsof,帮助系统管理员高效完成网络诊断工作。

1. 什么是监听端口

在深入工具使用之前,有必要先理解"监听端口"的概念。

监听端口是指应用程序或进程在特定网络端口上等待传入连接的网络端点。每个监听端口由以下三个要素唯一标识:

  • 端口号:用于区分不同服务的数字标识(如 80、443、22 等)
  • IP 地址:绑定的网络接口地址
  • 通信协议:TCP 或 UDP

需要特别注意的是,同一 IP 地址、同一协议、同一端口不能被两个服务同时占用。例如,如果 Apache 已经占用了 80 端口,再启动 Nginx 就会因为端口冲突而失败。

2. ss 命令:现代首选工具

2.1 工具简介

ss(Socket Statistics)是netstat 的现代替代品,具有以下优势:

  • 执行速度更快,尤其在处理大量连接时表现优异
  • 提供更详细的 TCP 状态信息
  • 现代 Linux 发行版默认已安装,无需额外安装
2.2 常用命令与参数
2.2.1 查看所有监听端口
sudo ss -tunlp

参数说明:

参数含义
-t
显示 TCP 端口
-u
显示 UDP 端口
-n
显示数字地址,不解析主机名
-l
仅显示监听状态的端口
-p
显示使用该套接字的进程信息(需 root 权限)

典型输出示例:

State    Recv-Q   Send-Q     Local Address:Port      Peer Address:Port
LISTEN   0        128              0.0.0.0:22             0.0.0.0:*      users:(("sshd",pid=445,fd=3))
LISTEN   0        128                    *:3306                 *:*      users:(("mysqld",pid=534,fd=30))
LISTEN   0        128                 [::]:80                [::]:*      users:(("apache2",pid=765,fd=4))

输出关键字段解析:

  • State:套接字状态,LISTEN 表示端口正在等待传入连接
  • Local Address:Port:进程监听的 IP 地址和端口号
  • users:使用该套接字的进程名称和 PID
2.2.2 查找特定端口的监听进程

方法一:使用 grep 过滤

sudo ss -tnlp | grep :22

方法二:使用 ss 内置过滤(推荐,效率更高)

sudo ss -tlnp sport = :22
2.2.3 查看已建立的连接
ss -tn state established

3. netstat 命令:经典兼容工具

3.1 工具简介

netstat 是一款历史悠久的网络统计工具,虽然已被标记为"过时(obsolete)",但由于其广泛的兼容性和熟悉的输出格式,仍然在许多环境中被使用。

注意:现代 Linux 发行版默认不安装 netstat,需要手动安装 net-tools 包。

3.2 安装方法

# Debian/Ubuntu 系列:

sudo apt install net-tools

# RHEL/CentOS/Fedora 系列:

sudo dnf install net-tools
3.3 常用命令
3.3.1 查看所有监听端口
sudo netstat -tunlp

参数含义与ss 完全相同:-t(TCP)、-u(UDP)、-n(数字地址)、-l(仅监听)、-p(进程信息)。

典型输出示例:

[root@yyzc*** ~]# netstat -tunlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      768/rpcbind         
tcp        0      0 192.168.122.1:53        0.0.0.0:*               LISTEN      1500/dnsmasq        
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1129/sshd           
tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN      1132/cupsd          
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1237/master         
tcp6       0      0 :::111                  :::*                    LISTEN      768/rpcbind         
tcp6       0      0 :::1521                 :::*                    LISTEN      125320/tnslsnr      
tcp6       0      0 :::22                   :::*                    LISTEN      1129/sshd           
tcp6       0      0 ::1:631                 :::*                    LISTEN      1132/cupsd          
tcp6       0      0 :::13624                :::*                    LISTEN      125533/ora_d000_yyz 
tcp6       0      0 ::1:25                  :::*                    LISTEN      1237/master         
tcp6       0      0 :::5500                 :::*                    LISTEN      125320/tnslsnr      
udp        0      0 0.0.0.0:5353            0.0.0.0:*                           751/avahi-daemon: r 
udp        0      0 0.0.0.0:34426           0.0.0.0:*                           751/avahi-daemon: r 
udp        0      0 192.168.122.1:53        0.0.0.0:*                           1500/dnsmasq        
udp        0      0 0.0.0.0:67              0.0.0.0:*                           1500/dnsmasq        
udp        0      0 0.0.0.0:111             0.0.0.0:*                           768/rpcbind         
udp        0      0 0.0.0.0:924             0.0.0.0:*                           768/rpcbind         
udp6       0      0 ::1:42913               :::*                                125533/ora_d000_yyz 
udp6       0      0 ::1:40392               :::*                                125535/ora_s000_yyz 
udp6       0      0 ::1:16463               :::*                                125520/ora_lreg_yyz 
udp6       0      0 :::111                  :::*                                768/rpcbind         
udp6       0      0 :::924                  :::*                                768/rpcbind         
[root@yyzc*** ~]# 
3.3.2 查找特定端口的监听进程
[root@yyzc*** ~]# netstat -tnlp | grep :22
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1129/sshd           
tcp6       0      0 :::22                   :::*                    LISTEN      1129/sshd           
[root@yyzc*** ~]# 

4. lsof 命令:文件视角的端口检查

4.1 工具简介

lsof(List Open Files)是一款功能强大的工具,用于查看进程打开的文件。在 Linux 的设计理念中,一切皆文件,网络套接字也不例外。因此,lsof 同样可以用于检查端口监听状态,其独特优势在于能够清晰地展示进程、用户与端口之间的关联关系。

4.2 常用命令
4.2.1 查看所有监听的 TCP 端口
sudo lsof -nP -iTCP -sTCP:LISTEN

# 参数说明:

参数含义
-n
不解析主机名,显示数字地址
-P
不将端口号转换为服务名
-iTCP
仅显示 TCP 网络文件
-sTCP:LISTEN
仅显示 TCP 状态为 LISTEN 的套接字

# 典型输出示例:

COMMAND      PID   USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
rpcbind      768    rpc    8u  IPv4   20145      0t0  TCP *:111 (LISTEN)
rpcbind      768    rpc   11u  IPv6   20148      0t0  TCP *:111 (LISTEN)
sshd        1129   root    3u  IPv4   26143      0t0  TCP *:22 (LISTEN)
sshd        1129   root    4u  IPv6   26145      0t0  TCP *:22 (LISTEN)
cupsd       1132   root   10u  IPv6   27882      0t0  TCP [::1]:631 (LISTEN)
cupsd       1132   root   11u  IPv4   27883      0t0  TCP 127.0.0.1:631 (LISTEN)
master      1237   root   13u  IPv4   27356      0t0  TCP 127.0.0.1:25 (LISTEN)
master      1237   root   14u  IPv6   27357      0t0  TCP [::1]:25 (LISTEN)
dnsmasq     1500 nobody    6u  IPv4   29413      0t0  TCP 192.168.122.1:53 (LISTEN)
tnslsnr   125320 oracle    8u  IPv6 2046821      0t0  TCP *:1521 (LISTEN)
tnslsnr   125320 oracle   16u  IPv6 2054255      0t0  TCP *:5500 (LISTEN)
ora_d000_ 125533 oracle    8u  IPv6 2054158      0t0  TCP *:13624 (LISTEN)

# 输出关键字段解析:

  • COMMAND:进程名称
  • PID:进程 ID
  • USER:运行该进程的用户
  • NAME:监听的地址和端口号
4.2.2 查找特定端口的监听进程
sudo lsof -nP -iTCP:3306 -sTCP:LISTEN

5. 常见问题与注意事项

5.1 进程信息列显示为空

如果在使用-p 参数时发现进程信息列空白,最常见的原因是权限不足。端口所属的进程信息只有 root 用户或具有 sudo 权限的用户才能查看。解决方法是使用sudo 执行命令。

5.2 监听端口与已建立连接的混淆

-l 参数的作用是仅显示处于 LISTEN 状态的端口。如果省略该参数,工具会显示所有连接状态(包括 ESTABLISHED 等),导致输出信息过多。如果目的是检查服务是否正常运行,务必加上-l 参数。

5.3 使用 grep 过滤端口时的常见错误

在使用grep 按端口号过滤时,必须包含冒号。例如,应使用grep :22 而不是grep 22。后者会错误匹配 PID、IP 地址中包含数字 22 的其他行,导致结果不准确。

6. 快速参考表

任务命令
列出所有监听端口(ss)
sudo ss -tunlp
列出所有监听端口(netstat)
sudo netstat -tunlp
查找特定端口的进程(ss 内置过滤)
sudo ss -tlnp sport = :80
查找特定端口的进程(grep 过滤)
sudo ss -tnlp | grep :80
列出所有监听 TCP 端口(lsof)
sudo lsof -nP -iTCP -sTCP:LISTEN
查找端口 3306 的进程(lsof)
sudo lsof -nP -iTCP:3306 -sTCP:LISTEN
显示已建立的连接
ss -tn state established
显示所有连接及进程信息
sudo ss -tunp

7. 总结

三款工具各有特点,适用于不同的场景:

  • ss:现代 Linux 系统的首选工具,速度快、信息全面、默认安装,推荐在日常运维中优先使用。
  • netstat:经典工具,适合需要与旧系统兼容或团队成员更熟悉其输出格式的场景,但需注意其已被标记为过时。
  • lsof:从文件和进程视角出发,特别适合需要同时查看端口、进程和用户关联关系的深度排查场景。

最新文章

随机文章