如何使用 ss、netstat 和 lsof 探查 Linux 监听端口

AI 概述
排查网络连接或应用故障时,需检查系统端口使用及应用监听情况。本文介绍了三种工具:ss是现代替代品,速度快、信息详细;netstat是传统工具,提供网络连接信息,参数与ss相同;lsof基于进程分析,从“文件描述符”角度分析端口占用。文章还介绍了工具在端口冲突诊断、服务无法连接、异常连接排查等排错场景中的应用,给出了权限管理、性能优化建议,提供了快速参考表,建议结合其他工具形成完整网络诊断体系。
目录
文章目录隐藏
  1. 1.什么是监听端口?
  2. 2.检查监听端口的三种工具
  3. 3.实战排错场景
  4. 4.注意事项
  5. 5.快速参考表
  6. 6.总结

如何使用 ss、netstat 和 lsof 探查 Linux 监听端口

在 Linux 和类 Unix 系统运维中,排查网络连接与端口占用问题是运维人经常做的事。不管是服务启动失败、端口冲突,还是异常连接排查,快速定位监听端口及对应进程是关键。本文将深入介绍 如何使用 ss、netstat、lsof 三大命令,来精准定位系统中端口的使用情况,包括监听状态、关联进程等信息。掌握这些命令,可让我们在面对网络故障时能够迅速找到问题根源,高效完成故障修复,保障系统的稳定运行。

1.什么是监听端口?

网络端口由其编号、关联的 IP 地址和通信协议类型(如 TCP 或 UDP)共同标识。

监听端口是指应用程序或进程在其上监听并作为通信端点的网络端口。每个监听端口可以通过防火墙设置为开放或关闭(被过滤)。一般来说,开放端口是接受来自远程位置传入数据包的端口。

重要原则:同一 IP 地址上不能有两个服务监听相同的端口。

例如,如果运行了监听 80 和 443 端口的 Apache Web 服务器,然后尝试安装 Nginx,后者将无法启动,因为 HTTP 和 HTTPS 端口已被占用。

2.检查监听端口的三种工具

2.1 ss 命令 – 现代端口检查利器

ss是 netstat 的现代替代品。它速度更快,提供更详细的 TCP 状态信息,并且在所有现代 Linux 发行版中默认安装。

要获取所有监听端口的列表,输入sudo ss -tulnp

[ymadmin@backup ~]$ sudo ss -tulnp
[sudo] ymadmin 的密码:
Netid        State         Recv-Q        Send-Q                 Local Address:Port                  Peer Address:Port        Process                                        
udp          UNCONN        0             0                            0.0.0.0:5353                       0.0.0.0:*            users:(("avahi-daemon",pid=836,fd=12))        
udp          UNCONN        0             0                          127.0.0.1:323                        0.0.0.0:*            users:(("chronyd",pid=883,fd=5))              
udp          UNCONN        0             0                            0.0.0.0:41738                      0.0.0.0:*            users:(("ntopng-main",pid=1743,fd=46))        
udp          UNCONN        0             0                      1*.1**.**.**1:59048                      0.0.0.0:*            users:(("ntopng-main",pid=1743,fd=45))        
udp          UNCONN        0             0                            0.0.0.0:43328                      0.0.0.0:*            users:(("avahi-daemon",pid=836,fd=14))        
udp          UNCONN        0             0                               [::]:54304                         [::]:*            users:(("avahi-daemon",pid=836,fd=15))        
udp          UNCONN        0             0                               [::]:5353                          [::]:*            users:(("avahi-daemon",pid=836,fd=13))        
udp          UNCONN        0             0                              [::1]:323                           [::]:*            users:(("chronyd",pid=883,fd=6))              
tcp          LISTEN        0             4096                       127.0.0.1:631                        0.0.0.0:*            users:(("cupsd",pid=1117,fd=8))               
tcp          LISTEN        0             128                          0.0.0.0:2219                       0.0.0.0:*            users:(("sshd",pid=1119,fd=3))                
tcp          LISTEN        0             4096                         0.0.0.0:3000                       0.0.0.0:*            users:(("ntopng-main",pid=1743,fd=58))        
tcp          LISTEN        0             5                          127.0.0.1:44321                      0.0.0.0:*            users:(("pmcd",pid=1703,fd=0))                
tcp          LISTEN        0             5                          127.0.0.1:4330                       0.0.0.0:*            users:(("pmlogger",pid=2523,fd=7))            
tcp          LISTEN        0             128                        127.0.0.1:6010                       0.0.0.0:*            users:(("sshd",pid=2303788,fd=9))             
tcp          LISTEN        0             511                        127.0.0.1:6379                       0.0.0.0:*            users:(("redis-server",pid=1573,fd=6))        
tcp          LISTEN        0             511                            [::1]:6379                          [::]:*            users:(("redis-server",pid=1573,fd=7))        
tcp          LISTEN        0             128                             [::]:2219                          [::]:*            users:(("sshd",pid=1119,fd=4))                
tcp          LISTEN        0             5                              [::1]:4330                          [::]:*            users:(("pmlogger",pid=2523,fd=8))            
tcp          LISTEN        0             128                            [::1]:6010                          [::]:*            users:(("sshd",pid=2303788,fd=8))             
tcp          LISTEN        0             5                              [::1]:44321                         [::]:*            users:(("pmcd",pid=1703,fd=3))                
tcp          LISTEN        0             4096                           [::1]:631                           [::]:*            users:(("cupsd",pid=1117,fd=7))               
[ymadmin@backup ~]$ 

如何使用 ss、netstat 和 lsof 探查 Linux 监听端口

上面命令中,参数的含义如下表:

参数 含义 说明
-t TCP 端口 显示传输控制协议端口
-u UDP 端口 显示用户数据报协议端口
-n 数字显示 禁用主机名/服务名解析
-l 仅监听端口 过滤出 LISTEN 状态的套接字
-p 进程信息 显示 PID 和进程名(需 root 权限)

命令优势

  • 性能优越:比 netstat 更快;
  • 信息详细:提供丰富的 TCP 状态信息;
  • 默认预装:主流 Linux 发行版均已集成。

输出解读示例

Netid        State         Recv-Q        Send-Q                 Local Address:Port                  Peer Address:Port        Process                                        
udp          UNCONN        0             0                            0.0.0.0:5353                       0.0.0.0:*            users:(("avahi-daemon",pid=836,fd=12))        
udp          UNCONN        0             0                          127.0.0.1:323                        0.0.0.0:*            users:(("chronyd",pid=883,fd=5))              
udp          UNCONN        0             0                            0.0.0.0:41738                      0.0.0.0:*            users:(("ntopng-main",pid=1743,fd=46))        
  • Netid:网络类型(tcp/udp);
  • State:连接状态;
  • Recv-Q:接收队列中待处理的数据量(字节);
  • Send-Q:发送队列中待发送的数据量(字节);
  • Local Address:Port:本地监听的 IP 地址和端口;
  • Peer Address:Port:对端地址和端口(监听时为*);
  • Process:使用该端口的进程信息。

高级过滤技巧

(1)精确查找 22 端口占用

[ymadmin@backup ~]$ sudo ss -tlnp sport = :22
State            Recv-Q           Send-Q                     Local Address:Port                       Peer Address:Port           Process                                   
LISTEN           0                128                              0.0.0.0:22                              0.0.0.0:*               users:(("sshd",pid=1119,fd=3))           
LISTEN           0                128                                 [::]:22                                 [::]:*               users:(("sshd",pid=1119,fd=4))           
[ymadmin@backup ~]$ 

(2)通用过滤方法

[ymadmin@backup ~]$ sudo ss -tnlp | grep ':22'
LISTEN 0      128          0.0.0.0:22       0.0.0.0:*    users:(("sshd",pid=1119,fd=3))        
LISTEN 0      128             [::]:22          [::]:*    users:(("sshd",pid=1119,fd=4))        
[ymadmin@backup ~]$ 

(3)查看所有已建立连接

[ymadmin@backup ~]$ ss -tn state established
Recv-Q                    Send-Q                                       Local Address:Port                                             Peer Address:Port                     
0                         0                                                127.0.0.1:6379                                                127.0.0.1:42688                    
0                         0                                                127.0.0.1:6379                                                127.0.0.1:42672                    
0                         0                                                127.0.0.1:42688                                               127.0.0.1:6379                     
0                         0                                            10.1**.*9.221:57578                                         185.199.110.133:443                      
0                         0                                                127.0.0.1:42672                                               127.0.0.1:6379                     
0                         132                                          10.1**9.*9.221:22                                                10.1*9.*.22:60341                    
[ymadmin@backup ~]$ 

如何使用 ss、netstat 和 lsof 探查 Linux 监听端口

(4)查看 TIME-WAIT 状态的连接

ss -tn state time-wait

如何使用 ss、netstat 和 lsof 探查 Linux 监听端口

2.2 netstat 命令 – 传统但实用的工具

netstat是一个传统的命令行工具,提供网络连接信息。

要列出所有正在监听的 TCP 或 UDP 端口,包括使用端口的服务和套接字状态:

sudo netstat -tunlp

它的参数与ss命令相同:

  • -t :显示 TCP 端口;
  • -u:显示 UDP 端口;
  • -n:显示数字地址(不解析主机名);
  • -l:仅显示监听端口;
  • -p:显示监听进程的 PID 和名称(需要 root 或 sudo 权限)。

下面是该命令的输出示例:

[ymadmin@backup ~]$ sudo netstat -tunlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN      1117/cupsd          
tcp        0      0 0.0.0.0:2219            0.0.0.0:*               LISTEN      1119/sshd: /usr/sbi 
tcp        0      0 0.0.0.0:3000            0.0.0.0:*               LISTEN      1743/ntopng         
tcp        0      0 127.0.0.1:44321         0.0.0.0:*               LISTEN      1703/pmcd           
tcp        0      0 127.0.0.1:4330          0.0.0.0:*               LISTEN      2523/pmlogger       
tcp        0      0 127.0.0.1:6010          0.0.0.0:*               LISTEN      2303788/sshd: ymadm 
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      1573/redis-server 1 
tcp6       0      0 ::1:6379                :::*                    LISTEN      1573/redis-server 1 
tcp6       0      0 :::2219                 :::*                    LISTEN      1119/sshd: /usr/sbi 
tcp6       0      0 ::1:4330                :::*                    LISTEN      2523/pmlogger       
tcp6       0      0 ::1:6010                :::*                    LISTEN      2303788/sshd: ymadm 
tcp6       0      0 ::1:44321               :::*                    LISTEN      1703/pmcd           
tcp6       0      0 ::1:631                 :::*                    LISTEN      1117/cupsd          
udp        0      0 0.0.0.0:5353            0.0.0.0:*                           836/avahi-daemon: r 
udp        0      0 127.0.0.1:323           0.0.0.0:*                           883/chronyd         
udp        0      0 0.0.0.0:41738           0.0.0.0:*                           1743/ntopng         
udp        0      0 10.1*9.*9.221:59048     0.0.0.0:*                           1743/ntopng         
udp        0      0 0.0.0.0:43328           0.0.0.0:*                           836/avahi-daemon: r 
udp6       0      0 :::54304                :::*                                836/avahi-daemon: r 
udp6       0      0 :::5353                 :::*                                836/avahi-daemon: r 
udp6       0      0 ::1:323                 :::*                                883/chronyd         
[ymadmin@backup ~]$ 

其关键字段包括:

  • Proto套接字使用的协议;
  • Local Address:进程监听的 IP 地址和端口号;
  • PID/Program name:进程的 PID 和名称。

端口状态检查用法

(1)检查特定端口(如 22)

[ymadmin@backup ~]$ sudo netstat -tnlp | grep ':22'
tcp        0      0 0.0.0.0:22            0.0.0.0:*               LISTEN      1119/sshd: /usr/sbi 
tcp6       0      0 :::22                 :::*                    LISTEN      1119/sshd: /usr/sbi 
[ymadmin@backup ~]$ 

(2)仅查看 TCP 连接

[ymadmin@backup ~]$ sudo netstat -tnp

如何使用 ss、netstat 和 lsof 探查 Linux 监听端口

(3)查看路由表(netstat 附加功能)

[ymadmin@backup ~]$ netstat -rn
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
0.0.0.0         10.109.39.1     0.0.0.0         UG        0 0          0 enp1s0
10.109.39.0     0.0.0.0         255.255.255.0   U         0 0          0 enp1s0
[ymadmin@backup ~]$ 

2.3 lsof 命令 – 基于进程的端口分析

lsof 是一个功能强大的命令行实用程序,提供有关进程打开的文件信息。在 Linux 中,一切都是文件。您可以将套接字视为写入网络的”文件”。

要获取所有监听 TCP 端口的列表,输入sudo lsof -nP -iTCP -sTCP:LISTEN

[ymadmin@backup ~]$ sudo lsof -nP -iTCP -sTCP:LISTEN
COMMAND       PID    USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
cupsd        1117    root    7u  IPv6    20013      0t0  TCP [::1]:631 (LISTEN)
cupsd        1117    root    8u  IPv4    20014      0t0  TCP 127.0.0.1:631 (LISTEN)
sshd         1119    root    3u  IPv4    24230      0t0  TCP *:2219 (LISTEN)
sshd         1119    root    4u  IPv6    24232      0t0  TCP *:2219 (LISTEN)
redis-ser    1573   redis    6u  IPv4    30363      0t0  TCP 127.0.0.1:6379 (LISTEN)
redis-ser    1573   redis    7u  IPv6    30364      0t0  TCP [::1]:6379 (LISTEN)
pmcd         1703     pcp    0u  IPv4    36360      0t0  TCP 127.0.0.1:44321 (LISTEN)
pmcd         1703     pcp    3u  IPv6    36361      0t0  TCP [::1]:44321 (LISTEN)
ntopng-ma    1743  ntopng   58u  IPv4    31734      0t0  TCP *:3000 (LISTEN)
pmlogger     2523     pcp    7u  IPv4 18285098      0t0  TCP 127.0.0.1:4330 (LISTEN)
pmlogger     2523     pcp    8u  IPv6 18285099      0t0  TCP [::1]:4330 (LISTEN)
sshd      2303788 ymadmin    8u  IPv6 19322066      0t0  TCP [::1]:6010 (LISTEN)
sshd      2303788 ymadmin    9u  IPv4 19322067      0t0  TCP 127.0.0.1:6010 (LISTEN)
[ymadmin@backup ~]$ 

如何使用 ss、netstat 和 lsof 探查 Linux 监听端口

参数说明

  • -n:不解析主机名,显示数字地址;
  • -P:不将端口号转换为端口名称;
  • -iTCP -sTCP:LISTEN:仅显示 TCP 状态为 LISTEN 的网络文件。

独特优势

从“文件描述符”角度分析端口占用,适合查找特定进程打开的所有端口。

常用命令集

# 查看所有 TCP 监听端口
sudo lsof -nP -iTCP -sTCP:LISTEN

# 查看所有 UDP 端口
sudo lsof -iUDP

# 精确查询 3306 端口
sudo lsof -nP -iTCP:3306 -sTCP:LISTEN

# 查看指定进程(如 nginx)打开的所有文件/端口
sudo lsof -p $(pgrep nginx | head -1)

3.实战排错场景

3.1 端口冲突诊断

# 假设 8080 端口启动失败
sudo ss -tlnp | grep ':8080'
# 或
sudo lsof -i:8080

# 若发现冲突进程,可停止或终止
sudo kill -TERM <PID>

3.2 服务无法连接

# 检查服务是否在监听
sudo ss -tlnp | grep -E '(80|443)'

# 检查防火墙状态(可能阻止端口)
sudo iptables -L -n | grep 80
# 或
sudo firewall-cmd --list-all

3.3 异常连接排查

# 查看异常状态连接
ss -tn state syn-recv  # SYN_RECEIVED 状态
ss -tn state close-wait # CLOSE_WAIT 状态

# 统计各状态连接数
ss -tan | awk '{print $1}' | sort | uniq -c

4.注意事项

4.1 权限管理

# 普通用户可查看基本信息
ss -tln

# 需要 root 权限查看进程信息
sudo ss -tlnp

4.2 性能优化建议

  • 生产环境优先使用 ss:资源占用低,执行速度快
  • 批量检查使用脚本:
    #!/bin/bash
    PORTS="22 80 443 3306"
    for port in $PORTS; do
      echo "检查端口 $port:"
      sudo ss -tlnp sport = :$port 2>/dev/null || echo "  未找到监听进程"
    done
    

4.3 组合命令技巧

比如,查看端口及其对应服务配置文件(RHEL/CentOS):

#
for pid in $(sudo ss -tnlp | awk '/:80/{print $NF}' | cut -d= -f2 | cut -d, -f1); do
    echo "进程 PID: $pid"
    sudo systemctl status $pid 2>/dev/null | grep -A1 "Loaded:"
done

5.快速参考表

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

6.总结

  • 日常首选:ss命令,性能最优,功能全面
  • 兼容考虑:netstat在旧系统或脚本中仍有价值
  • 深度分析:lsof适合复杂场景和进程关联分析
  • 进阶建议:结合nmap进行端口扫描验证,使用tcpdump进行流量分析,形成完整的网络诊断体系。

注:以上命令输出可能因系统版本和配置略有差异,实际使用时请结合具体环境调整参数。

日常运维中,优先选用性能卓越的 ss 命令;在兼容旧系统或特定脚本时,netstat 仍能发挥作用;而 lsof 适合复杂场景下的深度分析。合理运用这些命令,结合实战排错场景中的技巧,能快速解决端口冲突、服务无法连接等常见问题。同时,注意权限管理与性能优化,让网络诊断更加高效准确,确保系统稳定运行。

以上关于如何使用 ss、netstat 和 lsof 探查 Linux 监听端口的文章就介绍到这了,更多相关内容请搜索码云笔记以前的文章或继续浏览下面的相关文章,希望大家以后多多支持码云笔记。

「点点赞赏,手留余香」

1

给作者打赏,鼓励TA抓紧创作!

微信微信 支付宝支付宝

还没有人赞赏,快来当第一个赞赏的人吧!

声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 admin@mybj123.com 进行投诉反馈,一经查实,立即处理!
重要:如软件存在付费、会员、充值等,均属软件开发者或所属公司行为,与本站无关,网友需自行判断
码云笔记 » 如何使用 ss、netstat 和 lsof 探查 Linux 监听端口

发表回复