核心概念:Linux 网络连接状态
在深入工具之前,先理解几个关键概念:

- 套接字:这是网络通信的基本单元,无论是 TCP 还是 UDP 通信,最终都会表现为一个或多个套接字,查看网络连接,本质上就是查看系统中的套接字状态。
- TCP 状态:TCP 是面向连接的协议,其连接有明确的生命周期,如
ESTABLISHED(已建立)、TIME_WAIT(等待结束)、CLOSE_WAIT(等待关闭) 等,这些状态对于排查连接问题至关重要。 /proc文件系统:Linux 内核将许多信息,包括网络连接,暴露在/proc文件系统中,用户空间的工具通过读取这些文件来获取信息。- Netfilter/iptables:Linux 内核的防火墙框架,所有经过网络数据包都会经过它,因此它记录了所有网络连接的详细信息,这些信息被称为“连接跟踪表”(Conntrack Table)。
经典且强大的命令行工具
这些是系统管理员和开发者最常使用的工具。
ss - Socket Statistics (推荐首选)
ss 是 netstat 的现代替代品,速度更快,功能更强大,它直接从内核的 netlink 套接字获取信息,而不是像 netstat 那样解析 /proc 文件,因此在处理大量连接时效率极高。
基本用法:
# 显示所有 TCP 和 UDP 连接 (默认显示已建立的) sudo ss # 显示所有类型的连接,包括监听端口 sudo ss -a # 只显示 TCP 连接 sudo ss -t # 只显示 UDP 连接 sudo ss -u # 只显示监听 的连接 sudo ss -l # 同时显示监听和已建立的连接 sudo ss -ltp
高级和常用选项:

-n:以数字形式显示地址和端口,不进行 DNS 反向解析,速度更快。-p:显示进程 ID (PID) 和进程名称,非常有助于排查哪个程序在占用端口。-t, -u, -w, -x:分别对应 TCP, UDP, RAW, Unix-domain sockets。-4, -6:分别显示 IPv4 和 IPv6 连接。-s:显示摘要信息,如总连接数、TCP 各状态的数量。state:过滤特定状态的连接。
示例:
# 显示所有监听的 TCP 连接,并显示对应的进程 sudo ss -tlnp # 显示所有处于 TIME_WAIT 状态的 TCP 连接 sudo ss -t state time-wait # 显示所有与 80 端口相关的连接 sudo ss -t 'sport = :80 or dport = :80' # 显示网络连接的摘要统计 sudo ss -s
netstat - Network Statistics (传统工具)
netstat 是一个历史悠久且功能全面的工具,在大多数系统上仍然可用,尽管 ss 更快,但 netstat 的选项和输出格式为许多人所熟知。
基本用法:
# 显示所有网络连接 sudo netstat -a # 只显示 TCP 连接 sudo netstat -t # 只显示 UDP 连接 sudo netstat -u # 只显示监听端口 sudo netstat -l # 以数字形式显示 sudo netstat -n # 显示 PID 和程序名 sudo netstat -p
高级选项:

-i:显示网络接口的统计信息。-r:显示路由表。-c:持续输出,每隔一秒刷新一次,适合实时监控。
示例:
# 持续监控 TCP 连接 sudo netstat -ctn # 显示所有监听的 TCP 连接及进程 sudo netstat -tlnp
注意:在连接数非常多的服务器上,netstat 可能会变得很慢,此时应优先使用 ss。
lsof - List Open Files
lsof 的字面意思是“列出打开的文件”,在 Linux 中,一切皆文件,网络连接(套接字)也不例外。lsof 也可以用来查看网络连接。
用法:
# 列出所有网络连接 sudo lsof -i # 列出所有监听的网络连接 sudo lsof -i -sTCP:LISTEN # 找出正在使用特定端口的进程 sudo lsof -i :80 # 找出某个 PID 打开的所有网络连接 sudo lsof -i -p <PID>
优点:非常灵活,可以从进程、端口、文件等多个角度查看。
缺点:对于单纯的网络连接查看,ss 和 netstat 更直接。
内核视角和防火墙视角
/proc/net 目录
这是内核直接暴露的原始数据,工具如 ss 和 netstat 会解析这些文件。
/proc/net/tcp:显示所有 TCP 套接字。/proc/net/udp:显示所有 UDP 套接字。/proc/net/tcp6和/proc/net/udp6:IPv6 版本。
直接查看示例:
# 查看 TCP 连接,格式化输出(列名从第一行获取) cat /proc/net/tcp | column -t
输出中的 st 列表示状态,local_address 和 rem_address 是十六进制表示的 IP 和端口。
conntrack - 连接跟踪表
如果你的服务器启用了防火墙(iptables 或 nftables),那么所有网络连接的状态都会被记录在连接跟踪表中。conntrack 工具用于查看和管理这个表。
安装:
# Debian/Ubuntu sudo apt-get install conntrack # RHEL/CentOS sudo yum install conntrack
用法:
# 显示所有连接跟踪条目 sudo conntrack -L # 显示所有 TCP 连接 sudo conntrack -L -t tcp # 显示与特定 IP 相关的连接 sudo conntrack -L --src <IP_ADDRESS> # 显示处于 ESTABLISHED 状态的连接 sudo conntrack -L --state ESTABLISHED # 删除一个特定的连接跟踪条目(用于调试) sudo conntrack -D --orig-src <IP> --orig-dst <IP>
conntrack 对于排查防火墙规则、NAT 转发问题以及理解内核如何处理连接状态非常有价值。
图形化工具
如果你不习惯命令行,可以使用图形界面工具。
nethogs
nethogs 不是一个连接状态查看器,而是一个进程级网络带宽监控器,它能实时显示哪个进程正在消耗网络流量,非常直观。
安装和使用:
# 安装 sudo apt-get install nethogs # Debian/Ubuntu sudo yum install nethogs # RHEL/CentOS # 运行,按流量大小排序 sudo nethogs
gnome-system-monitor (GNOME 桌面环境)
如果你在使用 GNOME 桌面,自带的“系统监视器”非常强大,在“资源”选项卡中,可以查看每个进程的网络接收和发送速度。
iftop
iftop 是一个基于终端的实时网络带宽监控工具,它显示哪个主机正在与你的服务器通信,以及通信的带宽占用情况。
安装和使用:
# 安装 sudo apt-get install iftop # Debian/Ubuntu sudo yum install iftop # RHEL/CentOS # 运行 sudo iftop
总结与选择建议
| 工具名称 | 主要用途 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
ss |
查看套接字/连接状态 | 速度快,功能新,信息全面 | 部分旧系统可能未预装 | 首选和日常使用,尤其在高并发服务器 |
netstat |
查看套接字/连接状态 | 功能全面,历史悠久 | 速度慢,解析 /proc |
兼容旧系统,或习惯其输出的用户 |
lsof |
列出打开的文件(包括连接) | 灵活,可从进程/端口切入 | 对纯连接查看不够直接 | 需要将连接与特定文件/进程关联时 |
/proc/net |
查看内核原始数据 | 最直接,无工具依赖 | 格式原始,不易读 | 调试、底层分析或编写脚本 |
conntrack |
查看/管理防火墙连接跟踪 | 深入内核防火墙逻辑 | 仅在启用防火墙时有意义 | 排查防火墙/NAT问题,理解连接生命周期 |
nethogs/iftop |
监控网络带宽使用 | 实时直观,显示流量 | 不显示连接状态细节 | 快速定位哪个进程/主机在消耗流量 |
- 日常快速查看连接:用
sudo ss -tlnp。 - 排查哪个程序在用端口:用
sudo ss -tlnp或sudo lsof -i :<port>。 - 监控实时网络流量:用
iftop或nethogs。 - 深入防火墙或内核问题:用
conntrack或直接看/proc/net。
