睿诚科技协会

Linux如何查看进程的网络连接?

核心命令:ssnetstat

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

Linux如何查看进程的网络连接?-图1
(图片来源网络,侵删)

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) 拥有这个连接。

常用选项组合

  • 只查看监听中的端口:

    Linux如何查看进程的网络连接?-图2
    (图片来源网络,侵删)
    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 连接:

    Linux如何查看进程的网络连接?-图3
    (图片来源网络,侵删)
    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

sslsof 告诉你“谁在连接”,而 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端口 sslsof ss -lunp \| grep :80lsof -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
  1. 首选 ss:对于绝大多数查看网络连接的需求,ss -tunp 是最快速、最直接的选择,它提供了进程信息,并且性能优异。
  2. 使用 lsof 作为补充:当你需要更灵活的过滤方式(比如按进程名 -c、按用户 -u)或者从“文件”的角度理解网络连接时,lsof 是不二之选。
  3. nethogs 分析流量:当问题不是“连接是否存在”,而是“连接太慢”时,nethogs 能让你直观地看到每个进程的带宽占用情况。

掌握这几个工具,你就能应对绝大多数 Linux 环境下的进程网络排查工作了。

分享:
扫描分享到社交APP
上一篇
下一篇