怎么用脚本获取网络流量统计

wen 实用脚本 1

从入门到精通的完整指南

目录导读

  1. 为什么需要脚本统计网络流量?
  2. 核心工作原理:流量数据的来源与抓取
  3. 主流脚本方案对比(Python/Bash/Perl)
  4. 实战:用Python脚本捕获实时流量
  5. 企业级方案:流量统计的自动化与可视化
  6. 常见问题与错误排查
  7. SEO优化与性能建议

为什么需要脚本统计网络流量?

问:手动查看路由器的流量统计不够用吗?

怎么用脚本获取网络流量统计

答:路由器的Web界面只能提供简单的总量数据,无法满足以下需求:

  • 实时监控:脚本可以实现秒级抓取,而网页刷新通常有5-10秒延迟
  • 多维度分析:按IP、端口、协议(TCP/UDP)、应用层(HTTP/DNS)进行分类统计
  • 自动化告警:流量突增时自动触发脚本执行安全策略(如临时封禁IP)
  • 长期存储:将数据写进数据库(MySQL/InfluxDB),便于月报生成
  • 跨平台整合:同一套脚本可运行在Linux、Windows、macOS甚至路由器(OpenWrt)上

据统计,使用脚本进行流量分析后,企业网络异常发现时间平均缩短78%(来源:NANOG网络运营组2023年报告)。


核心工作原理:流量数据的来源与抓取

问:脚本到底从哪里拿到流量数据?

答:主要依赖以下系统接口:

1 /proc/net/dev(Linux核心方法)

Inter-|   Receive                  |  Transmit
 face |bytes packets errs drop  …  |bytes packets errs drop
eth0: 123456  789   0    0       654321  456   0    0
  • 脚本读取此文件,解析每行数据(接口名、接收/发送字节数)
  • 关键点bytes是累计值,需定期采样并计算差值(如每5秒读取一次)

2 ifconfig/ip 命令(通用方法)

  • ifconfig eth0 输出中包含 RX bytesTX bytes
  • 脚本执行系统命令并解析文本(注意:MacOS使用netstat -ib

3 tcpdump + libpcap(深度包分析)

  • 捕获原始网络包,按五元组(源IP、目标IP、端口、协议)分类
  • 适合需要分析具体应用流量(如某视频流占用带宽)的场景

4 路由器API(OpenWrt/iKuai等)

  • 通过curl调用路由器的JSON API获取实时流量
  • 示例:curl http://192.168.1.1/cgi-bin/luci/;stok=/admin/status/iface/eth0

主流脚本方案对比

语言 适合场景 性能 跨平台 代码复杂度
Bash 快速查看、简单告警 低(依赖命令) 强(仅POSIX) 极简(20行内)
Python 数据分析、数据库写入 中(依赖psutil/pyshark) 强(需安装包) 中等(50-200行)
Perl 老旧系统维护 中(Net::Pcap模块) 弱(依赖CPAN)
Go 高并发实时监控 高(原生并发) 强(单二进制) 中等

推荐组合:日常监控用Bash+Crontab,深度分析用Python+InfluxDB。


实战:用Python脚本捕获实时流量

步骤1:安装依赖

pip install psutil requests influxdb-client
# psutil:系统状态库(可替代读取/proc)

步骤2:基础版本(每5秒输出一次)

import psutil
import time
def get_net_speed():
    old = psutil.net_io_counters()
    time.sleep(5)
    new = psutil.net_io_counters()
    # 计算速率(字节/秒)
    sent = (new.bytes_sent - old.bytes_sent) / 5
    recv = (new.bytes_recv - old.bytes_recv) / 5
    print(f"上传: {sent/1024:.2f} KB/s | 下载: {recv/1024:.2f} KB/s")
# 无限循环
while True:
    get_net_speed()

步骤3:进阶版本(按进程分组)

import psutil
def get_process_traffic():
    for proc in psutil.process_iter(['pid', 'name', 'connections']):
        try:
            conns = proc.connections()
            if conns:
                # 通过/proc/[pid]/net/dev获取该进程的流量(部分Linux支持)
                total_rx = sum(c.bytes_recv for c in conns if hasattr(c, 'bytes_recv'))
                total_tx = sum(c.bytes_sent for c in conns if hasattr(c, 'bytes_sent'))
                print(f"{proc.name()}(PID:{proc.pid}) 发送:{total_tx} 接收:{total_rx}")
        except:
            pass

注意:按进程统计需要root权限(Linux需psutil使用root模式)。


企业级方案:流量统计的自动化与可视化

1 数据存储到InfluxDB(时间序列数据库)

from influxdb_client import InfluxDBClient
client = InfluxDBClient(url="http://your-server:8086", token="your-token")
write_api = client.write_api()
while True:
    net = psutil.net_io_counters()
    data = f"traffic,host=server1,iface=eth0 sent={net.bytes_sent},recv={net.bytes_recv}"
    write_api.write("bucket_name", "org", data)
    time.sleep(10)

2 Grafana可视化

  • 创建仪表盘,连接InfluxDB数据源
  • 使用SELECT mean("sent") FROM "traffic" WHERE $timeFilter GROUP BY time(5s)
  • 设置阈值告警(下载>50MB/s时发送邮件/钉钉通知)

3 安全增强

  • IP黑白名单:抓取实时IP流量,超过阈值自动添加iptables规则
  • 异常检测:用Python结合机器学习库(如scikit-learn)识别DDoS攻击模式

常见问题与错误排查

Q1:脚本读取的流量数据比路由器显示的小很多?

  • 原因:路由器统计包含广播帧和包头的完整数据,而脚本只采集团包数据(payload)
  • 解决:用ip -s link show eth0查看精确字节数,或忽略此差异(差值通常在3%以内)

Q2:如何在Windows上获取进程级流量?

  • 方案1:使用wmic命令获取NetUseNetStatistics
  • 方案2:第三方库pcapy(需要WinPcap)
  • 方案3:直接读取网卡性能计数器(perfmon

Q3:脚本运行时CPU占用飙升怎么办?

  • 原因:使用纯Python循环轮询,或pyshark深度包解码
  • 优化:改用C语言扩展(如scapy改为dpkt),或降低采样频率(从1秒改到5秒)

Q4:大量历史数据如何清理?

  • 数据库侧:InfluxDB设置retention policy(保留7天)
  • 文件侧:用logrotate或Python脚本删除7天前的CSV文件

SEO优化与性能建议

1 脚本性能黄金准则

  • 避免阻塞:多网口环境使用asyncio并发读取
  • 缓存数据:同一进程内复用psutil.net_io_counters()的中间结果
  • 减少IO:将日志写入本地,而不是每次采样都写数据库(攒10条批处理)

2 内容SEO要点

  • 关键词自然融入、H2、前100字、结尾段落重复“脚本获取网络流量统计”
  • 结构化数据:使用FAQ Schema标记问答部分(见下文)
  • 内部链接:在“企业级可视化”部分链接到Grafana官方文档
  • 外链策略:引用权威来源如psutil官方文档Linux /proc/net/dev手册

3 示例FAQ Schema(JSON-LD)

{
  "@context": "https://schema.org",
  "@type": "FAQPage",
  "mainEntity": [{
    "@type": "Question",
    "name": "脚本如何获取路由器上的流量统计?",
    "acceptedAnswer": {
      "@type": "Answer",
      "text": "通过路由器的SNMP协议(如OpenWrt的luci API)或SSH执行远程命令,示例:curl http://192.168.1.1/cgi-bin/luci/status/iface/eth0 获取JSON数据。"
    }
  }]
}

延伸阅读与资源

  • GitHub开源方案ntopng(C++)、vnstat(AIX/Linux)
  • 商业替代:SolarWinds、PRTG(但脚本方案成本降低90%)
  • 书籍推荐:《网络流量监控与分析方法》(O'Reilly)

最终建议:从最简单的Bash脚本开始,逐步过渡到Python+数据库方案,对于家庭路由器(如梅林固件),可直接使用官方API搭配curl+sed,无需安装额外依赖。

抱歉,评论功能暂时关闭!