核心命令:ss 和 netstat
这两个命令是查看网络连接状态的主力。ss 是 netstat 的现代替代品,速度更快,信息更全,是新版本 Linux 系统中的首选。

ss - Socket Statistics (推荐)
ss 命令功能强大,语法与 netstat 类似,但效率更高。
基本用法
查看所有 TCP 和 UDP 连接:
# -a: 显示所有套接字 (all) # -t: TCP # -u: UDP # -n: 以数字形式显示地址和端口,不进行 DNS 解析,速度更快 # -p: 显示进程ID (PID) 和进程名 (program name) ss -atunp
输出解释:
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=1234,fd=3))
ESTAB 0 0 192.168.1.100:22 192.168.1.50:54321 users:(("sshd",pid=1235,fd=3))
TIME-WAIT 0 0 192.168.1.100:22 192.168.1.50:54322 users:(("sshd",pid=1235,fd=3))
State: 连接状态 (如LISTEN,ESTABLISHED,TIME-WAIT等)。Local Address:Port: 本地 IP 地址和监听/连接的端口。Peer Address:Port: 对端 IP 地址和端口。users:(("program",pid=fd)): 关键信息!显示哪个进程 (program),进程ID (pid),文件描述符 (fd) 拥有这个连接。
常用选项组合
-
只查看监听中的端口:
(图片来源网络,侵删)ss -lunp # -l: 只显示监听中的套接字
-
查看指定端口的连接:
# 查看 80 端口的连接 ss -tunp 'sport = :80' # 或者使用 grep ss -tunp | grep :80
-
查看与某个 IP 相关的连接:
# 查看 192.168.1.50 的所有连接 ss -tunp 'src 192.168.1.50'
-
查看 TCP 连接:
ss -tunp # -t: TCP
-
查看 UDP 连接:
(图片来源网络,侵删)ss -unp # -u: UDP
netstat - Network Statistics (传统)
虽然 ss 是首选,但很多系统上仍然有 netstat,了解它也很有用。
基本用法
查看所有 TCP 和 UDP 连接:
# -a: all # -t: TCP # -u: UDP # -n: numeric # -p: program netstat -atunp
查看监听中的端口:
netstat -lunp
netstat 的输出格式和选项与 ss 非常相似,但它底层使用不同的数据结构,所以在连接数非常多时,ss 的性能优势会非常明显。
更强大的工具:lsof - List Open Files
lsof (List Open Files) 是一个“瑞士军刀”式的工具,在 Linux 中,“一切皆文件”,网络连接(套接字)也被视为文件。lsof 可以列出所有被进程打开的文件,当然也包括网络连接。
基本用法
查看某个进程的网络连接: 假设你想查看 Nginx 进程的网络活动,首先找到它的 PID:
# 假设 Nginx 的主进程 PID 是 5678 lsof -i -p 5678
-i: 只列出网络文件 (Internet)。-p <PID>: 指定进程 ID。
查看指定端口的占用情况:
# 查看 80 端口被哪个进程占用 lsof -i :80
查看某个 IP 地址的所有连接:
# 查看 192.168.1.100 的所有活动 lsof -i @192.168.1.100
查看所有 TCP 连接:
lsof -i tcp
查看所有 UDP 连接:
lsof -i udp
终极可视化工具:nethogs
ss 和 lsof 告诉你“谁在连接”,而 nethogs 告诉你“谁在占用带宽”,它会按进程实时显示网络流量下载和上传的速度。
安装 (通常需要单独安装)
# Debian/Ubuntu sudo apt-get install nethogs # CentOS/RHEL/Fedora sudo yum install nethogs
使用方法
# 直接运行,默认监控所有网络接口 sudo nethogs # 指定监控的网络接口,如 eth0 sudo nethogs eth0
输出示例:
PID User Program Sent Recv
----------------------------------------
1234 root sshd 0.23 1.15KB
5678 www-data nginx 0 8.73KB
9999 myuser chrome 1024 45.6KB
你可以清楚地看到哪个进程在发送和接收多少数据。
实战场景与总结
| 场景 | 推荐命令 | 命令示例 |
|---|---|---|
| 快速查看所有网络连接 | ss |
ss -tunp |
| 查看哪个进程在监听80端口 | ss 或 lsof |
ss -lunp \| grep :80 或 lsof -i :80 |
| 发现一个可疑的外部IP连接 | ss |
ss -tunp \| grep 1.2.3.4 |
| 诊断为什么网站访问很慢 | nethogs |
sudo nethogs (查看哪个进程在疯狂占网) |
| 查找所有与 MySQL 相关的网络活动 | lsof |
lsof -i -c mysql (-c 按进程名过滤) |
| 查看所有 TIME_WAIT 状态的连接 | ss |
ss -tan state TIME-WAIT |
- 首选
ss:对于绝大多数查看网络连接的需求,ss -tunp是最快速、最直接的选择,它提供了进程信息,并且性能优异。 - 使用
lsof作为补充:当你需要更灵活的过滤方式(比如按进程名-c、按用户-u)或者从“文件”的角度理解网络连接时,lsof是不二之选。 - 用
nethogs分析流量:当问题不是“连接是否存在”,而是“连接太慢”时,nethogs能让你直观地看到每个进程的带宽占用情况。
掌握这几个工具,你就能应对绝大多数 Linux 环境下的进程网络排查工作了。
