python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python网络流量监控

基于Python实现网络流量监控的方法详解

作者:zkic1

本文主要介绍了一种使用Python和psutil库在KaliLinux环境下监控网络流量的方法,包括接收速率、发送速率、吞吐量和丢包率的计算,旨在提升网络性能和稳定性,通过实时监控并根据结果进行调整,确保网络高效运行,希望对大家有所帮助

一、目的

分析最近一段时间内的网络流量情况,以便更好地理解网络使用情况、识别潜在问题并提出改进建议。网络流量监控对于保障网络稳定性、优化资源分配和提高性能具有重要意义。

二、监控指标

1.接收速率

接收速率是指单位时间内接收数据的速度,通常以 Mbps(兆位每秒)或 KB/s(千字节每秒)表示。

2.发送速率

发送速率是指单位时间内发送数据的速度,通常以 Mbps(兆位每秒)或 KB/s(千字节每秒)表示。

3.吞吐量

吞吐量是指网络传输数据的总量,通常以 Mbps(兆位每秒)或 GB(千兆字节)为单位。

4.丢包率

丢包率是指在传输过程中丢失的数据包的比例,通常以百分比或千分比表示。

当然也根据自己的需求获取更加精准的数据,以便更好知道自己电脑的网络是否安全。

三、实验环境

 操作系统:kali Linux z 6.5.0-kali3-amd64

语言版本:Python 3.11.8 (main, Feb  7 2024, 21:52:08) [GCC 13.2.0] on linux

四、功能实现

具体的思路如下:

1. 必要用到的库:我们使用psutil库来获取网络流量和系统信息,使用imet库来计算时间间隔。

2. 设置初始值:记录开始时间、初始接收字节数、初始发送字节数以及初始丢包数。

3. 进入监控循环:使用`while True`进入一个无限循环,每次循环都会执行以下步骤:

4. 主程序入口:使用monitor_network_traffic()来确保脚本在直接运行时才执行监控函数。

#安装pip pip是安装python的第三方库 
apt-get install python3-pip
pip install psutil   //安装第三方库
具体代码 : 
   import psutil
   import time
def monitor_network_traffic(interval=1):
    start_time = time.time()
    start_io = psutil.net_io_counters()
    start_rx = start_io.bytes_recv
    start_tx = start_io.bytes_sent
    start_drop = start_io.dropin  # 接收端的丢包数
    while True:
        time.sleep(interval)
        end_io = psutil.net_io_counters()
        end_rx = end_io.bytes_recv
        end_tx = end_io.bytes_sent
        end_drop = end_io.dropin  # 接收端的丢包数
        duration = time.time() - start_time
        rx_speed = (end_rx - start_rx) / duration
        tx_speed = (end_tx - start_tx) / duration
        packet_loss = (end_drop - start_drop) / 100  # 丢包率(100包)
        print(f"每秒接收速率: {rx_speed:.2f} bytes/s")
        print(f"每秒发送速率: {tx_speed:.2f} bytes/s")
        print(f"吞吐量: {(rx_speed + tx_speed):.2f} bytes/s")
        print(f"丢包率(100包): {packet_loss:.2%}")
        start_rx = end_rx
        start_tx = end_tx
        start_drop = end_drop
monitor_network_traffic()

五、方法补充

网络流量监控是系统运维、安全分析和应用调试的重要手段。Python 凭借丰富的第三方库,可以灵活实现从系统级统计到数据包级别的深度分析。本文将介绍四种主流的实现方法,并给出完整的代码示例和适用场景。

1.使用 psutil 获取系统网络 I/O 统计

适用场景:实时监控本机网络流量总量(上传/下载速度、累计字节数),无需解析数据包内容。

原理psutil 读取 /proc/net/dev(Linux)或性能计数器(Windows),返回每个网卡的累计收发字节数、包数等。

安装

pip install psutil

示例代码:实时显示所有网卡的流量速率

import psutil
import time
def get_net_io():
    """获取网络I/O统计"""
    net_io = psutil.net_io_counters(pernic=True)
    return net_io
def format_speed(bytes_per_sec):
    """将字节/秒格式化为可读单位"""
    for unit in ['B', 'KB', 'MB', 'GB']:
        if bytes_per_sec < 1024:
            return f"{bytes_per_sec:.2f} {unit}/s"
        bytes_per_sec /= 1024
    return f"{bytes_per_sec:.2f} TB/s"
def monitor_bandwidth(interval=1):
    """监控各网卡的实时带宽"""
    print("开始监控网络流量 (按 Ctrl+C 停止)...")
    prev = get_net_io()
    try:
        while True:
            time.sleep(interval)
            curr = get_net_io()
            for nic, curr_stats in curr.items():
                prev_stats = prev.get(nic)
                if not prev_stats:
                    continue
                sent_rate = (curr_stats.bytes_sent - prev_stats.bytes_sent) / interval
                recv_rate = (curr_stats.bytes_recv - prev_stats.bytes_recv) / interval
                print(f"{nic}: 上传 {format_speed(sent_rate)} | 下载 {format_speed(recv_rate)}")
            prev = curr
    except KeyboardInterrupt:
        print("\n监控结束")
if __name__ == "__main__":
    monitor_bandwidth()

关键点

2.使用 scapy 捕获并分析数据包

适用场景:需要解析数据包头部(如 IP、TCP、HTTP)、进行协议分析或自定义过滤。

原理scapy 可以工作在用户态,利用 pcap 或 socket 抓取链路层或网络层数据包,并提供强大的协议解析能力。

安装

pip install scapy

注意:在 Linux 下抓包可能需要 sudo 权限;Windows 需要安装 Npcap 或 WinPcap。

示例代码:捕获并统计 HTTP 请求

from scapy.all import sniff, IP, TCP, Raw
def packet_callback(packet):
    """回调函数,处理每个捕获的数据包"""
    if IP in packet and TCP in packet:
        tcp = packet[TCP]
        # 检查是否是 HTTP 请求(端口 80 或 8080)
        if tcp.dport in [80, 8080] or tcp.sport in [80, 8080]:
            if Raw in packet:
                payload = packet[Raw].load.decode('utf-8', errors='ignore')
                # 简单判断是否为 HTTP 请求行
                if payload.startswith('GET') or payload.startswith('POST'):
                    print(f"HTTP请求: {payload[:100]}...")
                    print(f"源IP: {packet[IP].src}:{tcp.sport} -> 目标IP: {packet[IP].dst}:{tcp.dport}")
# 开始抓包(捕获 100 个数据包,过滤 HTTP 流量)
sniff(filter="tcp port 80 or tcp port 8080", prn=packet_callback, count=100)

关键点

3.使用 pyshark 解析 PCAP 文件(离线分析)

适用场景:已有抓包文件(如 Wireshark 保存的 .pcap),需要自动化分析或提取特征。

原理pyshark 是 Wireshark 的 Python 封装,利用 tshark 命令行解析 PCAP 文件,返回结构化的数据包对象。

安装

pip install pyshark

示例代码:统计 PCAP 文件中的 TCP 连接

import pyshark
def analyze_pcap(pcap_file):
    cap = pyshark.FileCapture(pcap_file, display_filter="tcp")
    connections = set()
    for packet in cap:
        try:
            src = packet.ip.src
            dst = packet.ip.dst
            sport = packet.tcp.srcport
            dport = packet.tcp.dstport
            connections.add((src, sport, dst, dport))
        except AttributeError:
            continue
    cap.close()
    print(f"共发现 {len(connections)} 个 TCP 连接")
    for conn in list(connections)[:10]:
        print(f"{conn[0]}:{conn[1]} -> {conn[2]}:{conn[3]}")
if __name__ == "__main__":
    analyze_pcap("capture.pcap")

关键点

4.使用 pydivert(Windows)进行流量拦截和修改

适用场景:在 Windows 上实现类似防火墙的实时拦截、重定向或修改数据包内容。

原理pydivert 封装了 Windows 的 WinDivert 驱动,可以捕获、过滤、修改和重新注入网络数据包。

安装

pip install pydivert

示例代码:记录所有访问 80 端口的流量并阻止

import pydivert
def block_http():
    with pydivert.WinDivert("tcp.DstPort == 80 or tcp.SrcPort == 80") as w:
        print("开始监控并阻止 HTTP 流量...")
        for packet in w:
            print(f"拦截数据包: {packet.src_addr}:{packet.src_port} -> {packet.dst_addr}:{packet.dst_port}")
            # 直接丢弃数据包(不调用 packet.send())
            # 若想放行,则调用 w.send(packet)
        # 循环持续直到进程终止
if __name__ == "__main__":
    block_http()

关键点

六、总结

网络流量监控对于维护网络稳定性、提高性能和优化资源分配具有重要意义。定期进行网络流量监控,并根据监控结果进行相应的优化和调整,以确保网络的高效运行

到此这篇关于基于Python实现网络流量监控的方法详解的文章就介绍到这了,更多相关Python网络流量监控内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文