如何使用 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 ~]$

上面命令中,参数的含义如下表:
| 参数 | 含义 | 说明 |
|---|---|---|
| -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 ~]$

(4)查看 TIME-WAIT 状态的连接
ss -tn state time-wait

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

(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 ~]$

参数说明
-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 监听端口的文章就介绍到这了,更多相关内容请搜索码云笔记以前的文章或继续浏览下面的相关文章,希望大家以后多多支持码云笔记。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 admin@mybj123.com 进行投诉反馈,一经查实,立即处理!
重要:如软件存在付费、会员、充值等,均属软件开发者或所属公司行为,与本站无关,网友需自行判断
码云笔记 » 如何使用 ss、netstat 和 lsof 探查 Linux 监听端口
微信
支付宝