在排查网络连接问题或服务启动失败时,第一步往往是检查系统中哪些端口正在被占用,以及是哪个进程在“把守”这些端口。对于 Linux 系统管理员和开发者来说,熟练使用命令行工具来探查端口是必备技能。本文将详细介绍三种最常用的工具:ss、netstat和lsof,帮助你快速定位端口与进程的对应关系,这些方法同样适用于 macOS 等类 Unix 系统。
1. 什么是监听端口?
网络端口由其编号、关联的 IP 地址和通信协议类型(TCP 或 UDP)共同标识。
监听端口 是指应用程序或进程在其上监听并等待通信的网络端口。每个监听端口可以被防火墙配置为 开放 或 关闭(被过滤) 。通常,开放端口意味着它会接受来自远程主机的传入连接请求。
一个重要的原则:在同一网络接口的同一个 IP 地址上,不能有两个服务监听相同的协议和端口号。例如,如果 Apache Web 服务器已经在监听 80 和 443 端口,那么再尝试启动 Nginx 服务就会失败,因为 HTTP 和 HTTPS 的默认端口已经被占用了。
2. 检查监听端口的三种利器
2.1 ss 命令 - 现代端口检查的“瑞士军刀”
ss(Socket Statistics)是 netstat 的现代替代品,它速度更快,能提供更详细的 TCP 状态信息,并且在所有主流的 Linux 发行版中都默认安装。
要列出系统中所有正在监听的 TCP 和 UDP 端口及其对应的进程,可以使用以下命令:
sudo ss -tulnp

上面命令中各个参数的含义如下:
| 参数 |
含义 |
说明 |
-t |
TCP 端口 |
显示传输控制协议端口 |
-u |
UDP 端口 |
显示用户数据报协议端口 |
-n |
数字显示 |
禁用主机名/服务名解析,直接显示IP和端口号 |
-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))
- Netid:网络协议类型(
tcp / udp)。
- State:连接状态(
LISTEN, ESTABLISHED, TIME-WAIT 等)。
- Recv-Q:接收队列中等待应用程序读取的数据量(字节)。
- Send-Q:发送队列中等待发送到网络的数据量(字节)。
- Local Address:Port:本地监听的 IP 地址和端口号。
- Peer Address:Port:对端(远程)的地址和端口(监听状态时为
*)。
- Process:占用该端口的进程详细信息(用户、PID、文件描述符)。
高级过滤与用法
-
精确查找特定端口(如 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))
也可以使用通用的 grep 过滤:
sudo ss -tnlp | grep ':22'
-
查看所有已建立的 TCP 连接:
[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

-
查看处于 TIME-WAIT 状态的连接(常用于分析连接释放问题):
ss -tn state time-wait

2.2 netstat 命令 - 经典实用的“老将”
netstat 是一个历史悠久的命令行工具,用于显示网络连接、路由表、接口统计等信息。虽然在新系统中 ss 是更优选择,但 netstat 在旧系统或某些脚本中仍有其价值。
列出所有正在监听的 TCP/UDP 端口:
sudo netstat -tunlp
其参数与 ss 命令类似:
-t — 显示 TCP 端口。
-u — 显示 UDP 端口。
-n — 显示数字地址,不进行主机名解析。
-l — 仅显示监听 (LISTEN) 状态的端口。
-p — 显示监听进程的 PID 和程序名(需要 root 权限)。
输出示例:
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
关键字段包括:
- Proto — 套接字使用的协议(tcp, tcp6, udp等)。
- Local Address — 进程监听的 IP 地址和端口号。
- PID/Program name — 进程的 PID 和名称。
常用检查方法
- 检查特定端口:
sudo netstat -tnlp | grep ':22'
- 仅查看所有 TCP 连接(包括非监听状态):
sudo netstat -tnp

- 查看内核路由表(
netstat 的附加功能):
netstat -rn
2.3 lsof 命令 - 基于进程视角的“侦探”
lsof(List Open Files)是一个功能强大的工具,用于列出进程打开的文件。在 Linux 中,“一切皆文件”,网络套接字也被视为一种特殊的文件。因此,lsof 非常适合从进程角度分析端口占用情况。
要列出所有正在监听的 TCP 端口,可以使用:
sudo lsof -nP -iTCP -sTCP:LISTEN

参数说明
-n — 不解析主机名,直接显示 IP 地址。
-P — 不将端口号转换为服务名称(如 22 不显示为 ssh)。
-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 端口已被占用:
# 检查8080端口被哪个进程占用
sudo ss -tlnp | grep ':8080'
# 或者
sudo lsof -i:8080
# 找到冲突进程的PID后,可以优雅地停止它
sudo kill -TERM <PID>
# 或强制终止
sudo kill -9 <PID>
3.2 服务无法连接排查
Web 服务器(如 Nginx)启动后外部却无法访问?
# 首先,检查服务是否真的在80或443端口上监听
sudo ss -tlnp | grep -E '(80|443)'
# 如果服务在监听,则检查防火墙是否放行了该端口
sudo iptables -L -n | grep 80
# 对于使用firewalld的系统
sudo firewall-cmd --list-all
3.3 异常连接状态分析
发现系统存在大量异常连接?
# 查看处于SYN_RECEIVED状态的连接(可能是SYN Flood攻击迹象)
ss -tn state syn-recv
# 查看处于CLOSE_WAIT状态的连接(可能是应用程序未正确关闭连接)
ss -tn state close-wait
# 统计各种状态的连接数量,快速了解概况
ss -tan | awk '{print $1}' | sort | uniq -c
4. 使用注意事项与技巧
4.1 权限管理
- 普通用户可以使用
ss -tln 或 netstat -tln 查看端口监听情况,但无法看到进程信息。
- 查看详细的进程信息(PID/程序名)需要使用
sudo 提权,即 sudo ss -tlnp 或 sudo netstat -tunlp。
4.2 性能与脚本化建议
4.3 组合命令技巧
例如,在 RHEL/CentOS 系统中,找到监听 80 端口的进程后,进一步查看其对应的 systemd 服务配置:
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 |
| 列出所有监听端口 (传统) |
sudo netstat -tunlp |
| 查找特定端口(如80)上的进程 |
sudo ss -tlnp sport = :80 |
| 查找特定端口(如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 |
6. 总结与进阶建议
- 日常首选:
ss 命令,它是性能最优、功能最全面的现代工具,应作为你的第一选择。
- 兼容考虑:
netstat 命令 在旧的 Linux 系统或需要兼容既有脚本的环境中仍有用武之地。
- 深度分析:
lsof 命令 擅长从进程出发进行关联分析,适合解决复杂的端口和文件描述符相关问题。
将这三种工具结合使用,可以应对绝大多数端口检查需求。对于更深入的运维/DevOps/SRE工作,你还可以将它们与 nmap(端口扫描)、tcpdump(网络流量抓包分析)等工具结合,从而构建一个完整的网络诊断与云栈社区运维体系。
注:以上命令的输出可能因 Linux 发行版、内核版本及具体配置而略有差异,实际使用时请根据环境灵活调整。