人人都会AI编程

11.3 端口与连接:netstat、ss 查看端口占用与 TCP 连接

更新时间:2026-07-12

在调试网络服务时,最常见的问题就是“为什么我的程序启动不了”——端口可能已被占用;或者“为什么客户端连不上”——服务可能只在 localhost 上监听,或防火墙/进程状态有问题。netstatss 就是用来快速查看端口占用、TCP 连接状态、以及各个套接字的详细信息的两把利器。

1. netstat:经典老牌工具
netstat 是最经典的网络统计工具,虽然近年来逐渐被 ss 替代,但绝大多数系统上依然预装,命令习惯也深深嵌入了运维工作的肌肉记忆中。

常用组合:

  • 查看所有监听中的 TCP/UDP 端口,并显示对应的进程和 PID:
  netstat -tunlp
  

选项含义:t=TCP,u=UDP,n=以数字形式显示地址和端口(不做DNS反向解析,加快速度),l=仅显示监听中的套接字,p=显示进程名和PID(需要root权限才能看到不属于当前用户的进程)。
输出示例:

  Proto Recv-Q Send-Q Local Address   Foreign Address   State       PID/Program name
  tcp        0      0 0.0.0.0:22      0.0.0.0:*         LISTEN      1234/sshd
  tcp6       0      0 :::80           :::*              LISTEN      5678/nginx
  

这表示 SSH 守护进程正在所有网络接口的 22 端口上监听,nginx 在所有接口的 80 端口上监听。

  • 查看所有 TCP 连接(包括已建立、等待关闭等状态):
  netstat -antp
  

a=显示所有连接和监听端口,不限于 LISTEN。这样可以发现当前有哪些客户端连接到了服务器,连接的本地/远端地址和端口,以及连接所处的状态(ESTABLISHED、TIME_WAIT 等)。

  • 只看某个端口的占用情况:
  netstat -tunlp | grep :80
  
  • 统计各类 TCP 连接状态数量(常用于检查 TIME_WAIT 堆积):
  netstat -ant | awk '{print $6}' | sort | uniq -c | sort -rn
  

2. ss:更强更快的新一代工具
ss(socket statistics)是 netstat 的替代品,由 iproute2 套件提供。它直接从内核空间获取套接字信息,速度远快于 netstat(后者在连接数巨大时通过 /proc 文件系统遍历,速度明显变慢),并且支持更丰富的过滤功能。

基本用法与参数与 netstat 非常相似,容易迁移:

  • 查看所有监听端口的进程:
  ss -tunlp
  

选项含义完全一致。输出格式类似,但通常更紧凑。

  • 查看所有 TCP 连接:
  ss -antp
  

同样可以使用 -p 显示进程,-n 禁用名称解析。

  • ss 独有的强大过滤功能。例如,只显示目标端口为 80 的连接:
  ss -antp dst :80
  

或者只显示来自 192.168.1.0/24 网段的 SSH 连接:

  ss -tn state established src 192.168.1.0/24 '( dport = :22 or sport = :22 )'
  
  • 按 TCP 状态筛选:
  ss -t state time-wait
  

可用的状态包括 establishedlistentime-waitclosed 等,非常适合排查连接泄露或短连接过多的问题。

3. 实际排查场景

  • 端口被占用,服务无法绑定

启动 nginx 报错 bind() to 0.0.0.0:80 failed (98: Address already in use)
立即执行:

  ss -tunlp | grep :80
  

找出占用端口的进程 PID,然后通过 kill 或调整配置处理。

  • 服务监听在 localhost,外网无法访问

netstat -tunlpss -tunlp 查看该服务的 Local Address 列:
若是 127.0.0.1:8080,则只有本机可访问;若是 0.0.0.0:8080::*:8080,则监听所有接口。发现问题后修改服务配置(例如 listen 0.0.0.0:8080;)并重载。

  • TIME_WAIT 堆积

短连接高并发场景下,大量套接字滞留在 TIME_WAIT 状态,可能导致端口号耗尽。用 ss -ant | awk '{print $1}' | sort | uniq -c 统计各状态数量,如果 TIME_WAIT 非常多,需要调整系统内核参数(如启用 tcp_tw_reuse)或优化应用连接池。

  • 定位某个连接的远程 IP 和对应进程

当发现异常网络流量,可以通过 ss -antp | grep ESTAB 查看所有已建立连接,找到可疑的远程 IP,并立即看到是哪个进程发起的连接,从而判断是否被植入木马或后门。

总结:日常诊断用 ss -tunlp 已足够解决 90% 的端口占用和监听问题;遇到连接追踪或状态统计时,善用 ss 的过滤和 netstat 的兼容性,可以让你对系统网络连接状态一目了然。