本文目录导读:

- 使用 tcpdump + 脚本分析(最通用)
- Python + Scapy 库(最灵活)
- 实时流量统计(基于 /proc 文件系统)
- 使用 nethogs 按进程统计(需要安装)
- 高级:Python + PyShark(基于Wireshark)
- 安装依赖
- 实战建议
要使用脚本获取网络数据包统计,有几种主流方法,我按从简单专业到底层自定义的顺序给你介绍:
使用 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
实战建议
- 需要root权限:大多数抓包操作需要
sudo - 性能考虑:大量捕获时使用
store=False(Scapy)或-w 文件(tcpdump) - 精确统计:结合
iptables的统计功能长期监测 - 可视化:将数据输出到 InfluxDB + Grafana
最简单的入门是从 tcpdump 开始,逐步过渡到 Python 脚本处理复杂逻辑,需要我针对某个具体场景(如HTTP请求分析、DDoS检测)给示例吗?