Linux iftop与nethogs命令分析

iftop 和 nethogs 是Linux网络流量分析的互补工具:iftop用于宏观查看网卡流量,识别高带宽的IP通信对;nethogs则从微观定位具体消耗带宽的进程。排查时先用iftop发现异常IP,再用nethogs锁定对应进程,结合使用可高效定位带宽占用根源。

Linux iftop与nethogs命令分析

在Linux系统里,当我们面对网络流量的迷雾,想知道到底是谁在“吃”带宽时,iftop 和 nethogs 这两个小工具简直是我们的左膀右臂。简单来说,iftop 像个总览者,告诉你网卡上哪个IP地址对的流量最大,而 nethogs 则更像个侦探,直接揪出是哪个进程在搞事情。它们一个看宏观,一个看微观,搭配使用,网络问题往往无所遁形。

解决方案

要深入分析Linux系统的网络流量,iftop 和 nethogs 是不可或缺的工具。它们各自以独特的方式提供洞察,帮助我们快速定位带宽消耗的根源。

iftop 的使用与解读:

iftop 主要用于实时监控网络接口的带宽使用情况,并按流量大小列出连接到该接口的源IP和目标IP。

  1. 安装:

    # Debian/Ubuntu sudo apt install iftop # CentOS/RHEL sudo yum install epel-release -y sudo yum install iftop -y
  2. 基本用法:

    sudo iftop -i eth0 # 监控 eth0 接口

    运行后,你会看到一个类似 top 命令的界面,显示了:

    • TX/RX: 发送和接收的实时带宽。
    • Total/Cum: 累计总流量。
    • Host列表: 哪些IP地址在通信,以及它们之间的流量。
    • 流量柱状图: 直观展示带宽使用率。

    交互式操作:

    • p: 切换显示端口信息。
    • s: 切换显示源IP。
    • d: 切换显示目标IP。
    • t: 切换显示文本输出格式。
    • q: 退出。

    分析思路: 当服务器出现网络慢、带宽跑满的情况时,我通常会先用 iftop 快速扫一眼。如果看到某个外部IP地址或内部服务IP(比如数据库、文件服务器)占据了绝大部分流量,那问题就缩小了范围。比如,我曾遇到过生产环境某个内部服务突然访问量暴增,iftop 一看,某个IP地址的流量突然飙升,结合业务日志,很快就定位到是某次不合理的压测导致。

nethogs 的使用与解读:

nethogs 则专注于识别是哪个进程在使用网络带宽。这在 iftop 告诉你某个IP流量大,但你不知道是哪个应用在产生这些流量时,就显得尤为关键。

  1. 安装:

    # Debian/Ubuntu sudo apt install nethogs # CentOS/RHEL sudo yum install epel-release -y sudo yum install nethogs -y
  2. 基本用法:

    sudo nethogs -d 3 eth0 # 监控 eth0 接口,每3秒刷新一次

    运行后,你会看到:

    • PID: 进程ID。
    • User: 运行该进程的用户。
    • Program: 进程的完整路径或名称。
    • DEV: 接口名称。
    • SENT/RECEIVED: 该进程发送和接收的带宽。

    交互式操作:

    • m: 切换不同的单位(KB/s, MB/s, GB/s)。
    • r: 按接收流量排序。
    • s: 按发送流量排序。
    • q: 退出。

    分析思路: nethogs 的价值在于它直接指向“责任人”。比如,iftop 告诉我服务器与某个外部IP有大量流量,但我不知道是 nginxmysql 还是某个后台脚本在产生。这时 nethogs 就能直接告诉我,哦,原来是 java 进程在疯狂上传数据,或者 curl 命令在下载大文件。有一次,发现服务器夜间带宽异常,nethogs 一跑,赫然发现一个不认识的 python 脚本在持续对外发送数据,这通常就是安全隐患了。

iftop 和 nethogs 各自擅长解决哪些网络问题?

iftop 和 nethogs 虽然都是网络监控工具,但它们的侧重点和擅长解决的问题类型却截然不同,这在实际工作中是需要明确区分的。

iftop 更像一个“交通指挥官”,它能让你站在全局视角,快速了解当前网络接口上“谁和谁”之间的数据流最大。它擅长解决的问题包括:

  • 快速发现外部攻击或异常连接: 如果服务器突然流量暴增,iftop 能迅速显示是哪个外部IP地址在与你的服务器进行大量通信,这可能是DDoS攻击、端口扫描或者其他恶意行为的迹象。
  • 定位网络瓶颈: 当整个网络链路出现拥堵时,iftop 可以帮助你识别是哪个主要的IP对(例如,你的服务器与某个客户机、或者与某个CDN节点)占据了大部分带宽,从而判断瓶颈是否发生在服务器自身或特定连接上。
  • 验证服务连接性与流量分布: 部署新服务后,可以通过 iftop 观察服务与客户端之间的流量是否符合预期,比如一个高并发的服务是否真的产生了大量的网络交互。
  • 排查DNS解析问题: 如果看到大量与特定DNS服务器的UDP流量,可能暗示着DNS解析存在频繁查询或缓存失效的问题。

而 nethogs 则是一个“内部审计师”,它关注的是服务器内部,具体是“哪个进程”在消耗网络资源。它擅长解决的问题包括:

  • 识别“偷跑”的应用程序: 比如某个开发人员不小心启动了一个大数据量的下载任务,或者某个后台脚本陷入了无限循环导致数据上传,nethogs 能直接显示是哪个进程(及其PID)在占用带宽。
  • 优化应用资源使用: 如果某个应用(例如数据库、Web服务器)的网络IO持续过高,nethogs 可以帮你确认是该应用本身的网络行为异常,还是其内部模块(如某个插件、某个定时任务)导致的问题。
  • 安全审计: 当怀疑服务器被入侵,或者有未知程序在后台运行时,nethogs 能够揭示是否有不应该存在的进程在进行网络通信,这对于发现恶意软件或僵尸进程至关重要。
  • 资源配额与限制: 在多租户或共享资源环境中,通过 nethogs 可以监控特定用户或服务的进程是否超出了其应有的网络资源使用范围。

简而言之,iftop 是帮你回答“谁在和谁通信,流量有多大”,而 nethogs 则是回答“哪个程序在通信,消耗了多少流量”。它们是互补的,而非替代品。

在实际排障中,如何选择 iftop 或 nethogs?

在实际的网络故障排除中,选择 iftop 还是 nethogs,通常取决于你当前的问题焦点和排查的阶段。我个人经验是,这往往是一个从宏观到微观、从现象到本质的渐进过程。

一般而言,我的排障流程会是这样的:

Linux iftop与nethogs命令分析

可图大模型

可图大模型(Kolors)是快手大模型团队自研打造的文生图ai大模型

Linux iftop与nethogs命令分析36

查看详情 Linux iftop与nethogs命令分析

  1. 初步判断:网络整体异常?

    • 如果用户反馈“服务器很卡”、“网站访问慢”,或者监控系统告警网络带宽跑满,我的第一反应通常是先用 iftop。
    • 为什么用 iftop? 它启动快,输出直观,能迅速告诉我当前网卡的总流量以及哪些IP对是主要的流量贡献者。这就像是站在高处俯瞰交通状况,能一眼看出哪个路口车流量最大,或者有没有“不明车辆”混入。
    • 可能的结果:
      • 发现大量外部IP涌入: 这可能意味着DDoS攻击或大规模爬虫,需要考虑防火墙或CDN防护。
      • 发现与某个特定内部服务IP流量巨大: 比如与数据库服务器、NFS存储服务器的流量异常,那么问题可能出在应用层与这些服务的交互上。
      • 发现与某个未知IP有大量通信: 这就非常可疑了,可能是服务器被入侵,正在进行数据外传或C&C通信。
  2. 深入分析:哪个进程在作祟?

    • 当 iftop 告诉我某个IP对流量巨大,或者服务器自身有大量对外/对内流量,但具体是哪个应用程序在产生这些流量时,iftop 就力不从心了。这时,nethogs 就该登场了。
    • 为什么用 nethogs? 它直接将网络流量与进程绑定,能够精准定位到具体的应用程序。这就像是交通警察发现某个路口堵塞,然后走进车流中,找出是哪辆车(哪个进程)导致了拥堵。
    • 可能的结果:
      • 定位到异常进程: 比如一个不应该运行的 python 脚本在疯狂上传数据,或者 mysql 进程的网络IO异常高,那么就找到了直接的“肇事者”。
      • 验证服务行为: 如果是预期内的服务(如 nginx、java 应用),但其流量远超预期,那么需要进一步检查应用的配置、日志或代码,看是否存在逻辑错误或性能瓶颈。
      • 发现僵尸进程或恶意软件: 如果 nethogs 显示有未知用户或名称的进程在进行网络通信,那几乎可以断定是系统安全问题。

总结一下选择策略:

  • 当你需要宏观地查看整个网络接口的流量分布,快速定位高流量的源/目的IP时,选择 iftop。 它适合作为初步排查工具,用于快速发现网络层面的异常现象。
  • 当你已经知道有异常流量,但需要精确到是哪个应用程序或进程在消耗带宽时,选择 nethogs。 它适合作为深入排查工具,用于定位应用层面的具体问题。

很多时候,我会先用 iftop -i eth0 观察几秒钟,如果发现异常,立刻切换到 nethogs -d 3 eth0 来锁定具体进程。这两个工具的结合使用,能够大大提高网络故障排查的效率和准确性。

除了基本用法,iftop 和 nethogs 还有哪些高级技巧或注意事项?

除了它们的基础功能,iftop 和 nethogs 在实际使用中还有一些值得注意的高级技巧和潜在问题,了解这些能让你在面对复杂场景时更加从容。

iftop 的高级技巧与注意事项:

  1. 过滤显示: iftop 支持多种过滤模式,这在服务器连接数多、流量复杂时非常有用。

    • 按端口过滤: sudo iftop -f “port 80 or port 443” 仅显示HTTP/HTTPS流量。
    • 按IP过滤: sudo iftop -f “host 192.168.1.100” 仅显示与特定IP的通信。
    • 组合过滤: sudo iftop -f “host 192.168.1.100 and port 22″。
    • 注意: 过滤语法遵循 pcap 过滤规则,与 tcpdump 类似。这需要一些熟悉,但一旦掌握,效率极高。
  2. 显示模式调整:

    • iftop -B: 以字节为单位显示带宽,而不是位。在某些场景下,字节单位更直观。
    • iftop -P: 显示端口号,默认是隐藏的。这在分析具体服务流量时很有用。
    • iftop -n: 不进行主机名解析,直接显示IP地址。这可以避免DNS解析带来的延迟,在排查DNS问题时也很有用。
  3. 输出到文件: 虽然 iftop 是交互式的,但有时我们需要记录一段时间的流量数据。可以结合 script 命令:

    script -c "sudo iftop -i eth0" iftop_log.txt

    这会将 iftop 的终端输出保存到 iftop_log.txt,虽然不是结构化数据,但有时也能提供回顾性分析的依据。

  4. 权限问题: iftop 需要直接访问网络接口进行抓包,因此通常需要 root 权限(sudo)。如果遇到权限不足的错误,请检查是否使用了 sudo。

nethogs 的高级技巧与注意事项:

  1. 多接口监控: nethogs 可以同时监控多个接口:

    sudo nethogs eth0 eth1

    这在服务器有多个网卡时非常方便。

  2. 排序和刷新间隔:

    • nethogs -d N: 设置刷新间隔为N秒,例如 nethogs -d 1 每秒刷新一次,有助于捕获瞬时流量峰值。
    • 在交互界面中,r 键按接收流量排序,s 键按发送流量排序,m 键切换单位。
  3. 输出格式:

    • nethogs -v 3: 详细模式,显示更多信息,例如进程路径。
    • nethogs -t: 跟踪模式,只显示新进程。
  4. “Unknown”进程: 有时 nethogs 会显示“Unknown”进程。这通常发生在以下几种情况:

    • 权限不足: nethogs 无法读取 /proc/<pid>/cmdline 文件来获取进程信息。确保以 root 权限运行。
    • 进程退出过快: 某些短生命周期的进程在 nethogs 采样时已经退出,导致无法关联。
    • 内核线程: 某些网络相关的内核线程可能不会被 nethogs 识别为用户进程。
    • 虚拟化环境: 在一些容器或虚拟化环境中,进程信息获取可能存在限制。
  5. 资源消耗: nethogs 本身也需要消耗一定的CPU和内存资源,尤其是在刷新频率高(-d 1)且网络流量巨大的情况下。在资源敏感的生产环境中,需要权衡其对系统性能的影响。通常情况下,它的资源占用并不高,但在极端场景下,比如服务器本身已经处于高负载状态,要留意这一点。

共同注意事项:

  • 网络接口名称: 确保你指定的网络接口名称正确(如 eth0、ens33、enp0s3 等)。可以通过 ip a 或 ifconfig 命令查看。
  • 短暂流量: 它们都是实时监控工具,对于瞬时发生的、持续时间极短的流量可能难以捕捉。对于这类问题,可能需要结合 tcpdump 进行更细致的抓包分析。
  • 数据准确性: 它们提供的数据是基于网络接口的实时统计,可以作为诊断依据,但如果需要精确的计费或审计,可能需要更专业的网络流量分析系统。

掌握这些进阶用法和注意事项,能让你更有效地利用 iftop 和 nethogs,更准确地诊断和解决Linux系统中的网络流量问题。

mysql linux python java centos nginx 防火墙 大数据 字节 端口 ubuntu 工具 Python Java mysql nginx cURL 循环 接口 线程 并发 数据库 http https udp tcpdump linux ddos 虚拟化

上一篇
下一篇