怎么用脚本获取网络数据包统计

wen 实用脚本 2

本文目录导读:

怎么用脚本获取网络数据包统计

  1. 使用 tcpdump + 脚本分析(最通用)
  2. Python + Scapy 库(最灵活)
  3. 实时流量统计(基于 /proc 文件系统)
  4. 使用 nethogs 按进程统计(需要安装)
  5. 高级:Python + PyShark(基于Wireshark)
  6. 安装依赖
  7. 实战建议

要使用脚本获取网络数据包统计,有几种主流方法,我按从简单专业到底层自定义的顺序给你介绍:

使用 tcpdump + 脚本分析(最通用)

Bash 脚本示例:

#!/bin/bash
# 捕获100个包,统计协议分布
tcpdump -i eth0 -c 100 -nn -t 2>/dev/null | \
awk '{ 
    # 统计IP协议
    if ($2 ~ /IP/) proto[$7]++
    # 统计端口(HTTP/HTTPS)
    if ($3 ~ /\.80$|\.443$/) http_count++
} END {
    print "协议统计:"
    for (p in proto) print p, proto[p]
    print "\nHTTP/HTTPS 包数:", http_count
}'

Python + Scapy 库(最灵活)

#!/usr/bin/env python3
from scapy.all import *
from collections import Counter
def packet_stats(pkt):
    stats['total'] += 1
    if IP in pkt:
        stats['protocol'][pkt[IP].proto] += 1
        stats['src_ip'][pkt[IP].src] += 1
        stats['dst_ip'][pkt[IP].dst] += 1
        # 统计端口
        if TCP in pkt:
            stats['tcp_ports'][pkt[TCP].sport] += 1
            stats['tcp_ports'][pkt[TCP].dport] += 1
        elif UDP in pkt:
            stats['udp_ports'][pkt[UDP].sport] += 1
def stop_filter(pkt):
    # 捕获100个包后停止
    return stats['total'] >= 100
stats = {
    'total': 0,
    'protocol': Counter(),
    'src_ip': Counter(),
    'dst_ip': Counter(),
    'tcp_ports': Counter(),
    'udp_ports': Counter()
}
# 开始捕获(需要root权限)
sniff(iface="eth0", prn=packet_stats, stop_filter=stop_filter, store=False)
print(f"总包数: {stats['total']}")
print(f"协议分布: {dict(stats['protocol'])}")
print(f"Top 5 源IP: {stats['src_ip'].most_common(5)}")
print(f"Top 5 目标端口: {stats['tcp_ports'].most_common(5)}")

实时流量统计(基于 /proc 文件系统)

#!/bin/bash
# 从 /proc/net/dev 读取实时网卡统计
interface="eth0"
# 初始值
rx_bytes_old=$(awk -v iface=" $interface:" '$1 == iface {print $2}' /proc/net/dev)
tx_bytes_old=$(awk -v iface=" $interface:" '$1 == iface {print $10}' /proc/net/dev)
sleep 1
# 1秒后
rx_bytes_new=$(awk -v iface=" $interface:" '$1 == iface {print $2}' /proc/net/dev)
tx_bytes_new=$(awk -v iface=" $interface:" '$1 == iface {print $10}' /proc/net/dev)
rx_rate=$(( (rx_bytes_new - rx_bytes_old) * 8 / 1000 )) # kb/s
tx_rate=$(( (tx_bytes_new - tx_bytes_old) * 8 / 1000 ))
echo "接收速度: ${rx_rate} kbps"
echo "发送速度: ${tx_rate} kbps"

使用 nethogs 按进程统计(需要安装)

#!/bin/bash
# 实时按进程显示流量
nethogs -t 2>/dev/null | \
awk '{
    if ($0 ~ /MB|KB/) {
        print strftime("%H:%M:%S"), $0
        # 简单统计
        total_rx[$2] += $3
        total_tx[$2] += $4
    }
} END {
    print "\n=== 汇总 ==="
    for (proc in total_rx) {
        printf "%-30s 接收: %.2f MB  发送: %.2f MB\n", 
               proc, total_rx[proc], total_tx[proc]
    }
}'

高级:Python + PyShark(基于Wireshark)

import pyshark
cap = pyshark.LiveCapture(interface='eth0', bpf_filter='tcp port 80 or tcp port 443')
print("捕获HTTP/HTTPS流量统计(10秒)...")
http_count = 0
https_count = 0
for packet in cap.sniff_continuously(packet_count=100):
    if 'HTTP' in packet:
        print(f"HTTP请求: {packet.http.request_method} {packet.http.host}")
        http_count += 1
    elif 'TLS' in packet:
        https_count += 1
print(f"\nHTTP包: {http_count}, HTTPS包: {https_count}")

安装依赖

# Debian/Ubuntu
sudo apt-get install tcpdump nethogs python3-pip
pip3 install scapy pyshark
# RedHat/CentOS
sudo yum install tcpdump nethogs python3-pip
pip3 install scapy pyshark

实战建议

  1. 需要root权限:大多数抓包操作需要 sudo
  2. 性能考虑:大量捕获时使用 store=False(Scapy)或 -w 文件(tcpdump)
  3. 精确统计:结合 iptables 的统计功能长期监测
  4. 可视化:将数据输出到 InfluxDB + Grafana

最简单的入门是从 tcpdump 开始,逐步过渡到 Python 脚本处理复杂逻辑,需要我针对某个具体场景(如HTTP请求分析、DDoS检测)给示例吗?

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