找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

2931

积分

0

好友

402

主题
发表于 12 小时前 | 查看: 2| 回复: 0

在排查网络连接问题或服务启动失败时,第一步往往是检查系统中哪些端口正在被占用,以及是哪个进程在“把守”这些端口。对于 Linux 系统管理员和开发者来说,熟练使用命令行工具来探查端口是必备技能。本文将详细介绍三种最常用的工具:ssnetstatlsof,帮助你快速定位端口与进程的对应关系,这些方法同样适用于 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

终端执行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、文件描述符)。

高级过滤与用法

  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))

    也可以使用通用的 grep 过滤:

    sudo ss -tnlp | grep ':22'
  2. 查看所有已建立的 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

    查看已建立TCP连接的ss命令输出截图

  3. 查看处于 TIME-WAIT 状态的连接(常用于分析连接释放问题):

    ss -tn state time-wait

    查看TIME-WAIT状态连接的ss命令输出截图

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 和名称。

常用检查方法

  1. 检查特定端口
    sudo netstat -tnlp | grep ':22'
  2. 仅查看所有 TCP 连接(包括非监听状态)
    sudo netstat -tnp

    netstat -tnp命令输出截图,显示所有TCP连接

  3. 查看内核路由表(netstat 的附加功能)
    netstat -rn

2.3 lsof 命令 - 基于进程视角的“侦探”

lsof(List Open Files)是一个功能强大的工具,用于列出进程打开的文件。在 Linux 中,“一切皆文件”,网络套接字也被视为一种特殊的文件。因此,lsof 非常适合从进程角度分析端口占用情况。

要列出所有正在监听的 TCP 端口,可以使用:

sudo lsof -nP -iTCP -sTCP:LISTEN

lsof命令列出TCP监听端口的输出截图

参数说明

  • -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 -tlnnetstat -tln 查看端口监听情况,但无法看到进程信息。
  • 查看详细的进程信息(PID/程序名)需要使用 sudo 提权,即 sudo ss -tlnpsudo netstat -tunlp

4.2 性能与脚本化建议

  • 生产环境首选 ss:其性能开销远低于 netstat,特别是在连接数非常多的时候。
  • 批量检查使用脚本:如果需要定期检查一组关键端口的健康状况,可以编写简易脚本:
    #!/bin/bash
    PORTS="22 80 443 3306 6379"
    for port in $PORTS; do
      echo "检查端口 $port:"
      sudo ss -tlnp sport = :$port 2>/dev/null || echo "  未找到监听进程"
    done

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 发行版、内核版本及具体配置而略有差异,实际使用时请根据环境灵活调整。




上一篇:Python机器学习实战:模型训练与评估的完整流程与代码详解
下一篇:大模型落地实战:剖析MCP、Agent、RAG、RPA、A2A五大核心技术
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-2-7 20:45 , Processed in 0.443683 second(s), 38 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表