流量指纹识别技术调研报告
- Published on
目录
1. 引言
随着互联网技术的快速发展和网络安全威胁的日益增加,网络流量分析和指纹提取技术已成为网络安全、流量管理和用户行为分析等领域的关键研究方向。本报告旨在全面调研当前网络流量指纹提取技术的最新进展,包括研究方向、技术方法、应用场景以及未来发展趋势。
网络流量指纹提取技术是指通过分析网络数据包的各种特征,生成能够唯一标识特定网络活动、应用程序或设备的数字签名。这种技术在网络安全、流量分类、用户身份识别等方面具有广泛的应用前景。
本报告将重点关注以下几个方面:
- 指纹提取的关键技术和算法
- 机器学习和深度学习在指纹提取中的应用
- 大规模网络流量处理技术
2. 网络流量指纹概述
2.1 定义
网络流量指纹是指通过分析网络数据包的特征,生成一个能够唯一标识特定网络活动、应用程序或设备的数字签名。这个签名通常由一系列特征或参数组成,可以用于识别和分类网络流量。流量指纹识别基于这样一个假设:不同的网络应用、协议或用户会产生具有独特特征的网络流量模式。这些特征可能包括:
- 数据包大小和顺序
- 数据包间时间间隔
- 协议特征
- 流量统计特征
- 加密特征
通过分析这些特征,可以构建"指纹",用于识别和分类网络流量。
2.2 应用场景
网络流量指纹技术在多个领域有广泛应用:
- 网络安全:检测恶意软件、识别网络攻击、异常行为检测
- 流量分类:识别和分类不同类型的网络应用和协议
- 用户行为分析:了解用户的网络使用模式和偏好
- 网络管理:优化网络性能,进行流量调度和质量保证(QoS)
- 隐私保护:检测匿名通信,识别VPN流量
- 法律取证:协助网络犯罪调查和证据收集
- 市场研究:分析用户群体的网络使用趋势和偏好
2.3 指纹提取的基本流程
- 数据捕获:使用网络嗅探工具捕获原始网络数据包
- 预处理:清洗数据,去除无关信息,处理缺失值和异常值
- 特征提取:从数据包中提取关键特征,如包大小、时间间隔、协议特征等
- 特征选择:选择最具区分度的特征子集,降低维度
- 指纹生成:基于提取的特征生成唯一的指纹,可能涉及机器学习模型的训练
- 分类/识别:将生成的指纹与已知指纹进行比对,进行分类或识别
- 结果验证和优化:评估指纹提取的准确性,并根据需要进行优化
3. 数据捕获
3.1 工具简介
3.1.1 基于人工智能的网络嗅探工具
Deep Packet Inspection (DPI):
- 描述:DPI工具使用机器学习算法来分析数据包内容,并识别应用程序、协议和其他网络活动。
- 优势:能够自动捕获与特定应用程序或协议相关的原始数据包,即使它们被加密或混淆。
- 示例产品:Apcon IntellaTap, Palo Alto Networks Next-Generation Firewall
网络流量行为分析 (NBTA):
- 描述:NBTA工具使用统计学和机器学习技术来分析网络流量模式,并识别异常或可疑活动。
- 优势:能够自动捕获与潜在安全威胁相关的原始数据包。
- 示例产品:
- McAfee Nitro Security:McAfee Nitro Security 是一款商业 NBTA 工具可用于检测和阻止网络威胁。它使用机器学习和行为分析来分析网络流量,并提供多种功能来识别恶意软件、僵尸网络和其他威胁。
- Cisco Stealthwatch: Cisco Stealthwatch 是一款商业 NBTA 工具可用于检测和阻止网络威胁。它使用机器学习和行为分析来分析网络流量,并提供多种功能来识别恶意软件、僵尸网络和其他威胁。
- Deepwatch Network Traffic Analytics:Deepwatch Network Traffic Analytics 是一款商业 NBTA 工具可用于检测和阻止网络威胁。它使用机器学习和行为分析来分析网络流量,并提供多种功能来识别恶意软件、僵尸网络和其他威胁。
- Netskope Threat Intelligence:Netskope Threat Intelligence 是一款商业 NBTA 工具可用于检测和阻止云应用程序威胁。它使用机器学习和行为分析来分析云应用程序流量,并提供多种功能来识别恶意软件、僵尸网络和其他威胁。
- VeloCloud DeepWatch:VeloCloud DeepWatch 是一款商业 NBTA 工具可用于检测和阻止 SD-WAN 网络威胁。它使用机器学习和行为分析来分析 SD-WAN 流量,并提供多种功能来识别恶意软件、僵尸网络和其他威胁。
3.1.2 分布式网络嗅探系统
- Zeek (formerly Bro):
- 描述:Zeek(也称为 Bro)是一个开源的网络流量分析平台,用于大规模捕获和分析原始数据包。它使用可扩展的管道架构和多种分析引擎来处理来自多个网络设备的大量数据。Zeek 擅长检测网络威胁,例如恶意软件、僵尸网络和数据泄露。
- 特点:
- 使用可扩展的管道架构和多种分析引擎
- 支持深度数据包检测 (DPI)和网络流量行为分析 (NBTA)
- 高度可扩展,可处理来自多个网络设备的大量数据
- 使用脚本语言定义灵活的分析规则
- 应用:网络安全监控、威胁检测、性能分析
3.1.3 云端网络嗅探服务
Amazon VPC Traffic Mirroring:
- 描述:允许将VPC内部的网络流量复制到外部位置,如Amazon S3存储桶或Kinesis数据流。
- 优势:利用云端工具和服务进行大规模数据捕获和分析。
Cisco Cloud Extender:
- 描述:将网络流量路由到Cisco云安全平台。
- 优势:利用Cisco的安全工具和服务进行数据捕获和分析。
3.1.4 本地网络嗅探工具
Wireshark:
- 描述:Wireshark 是最流行的网络协议分析器之一。它是一款免费且开源的工具,可用于捕获和分析网络流量。
- 特点:
- 捕获网络流量: Wireshark 可以捕获各种网络接口上的网络流量,包括以太网、Wi-Fi 和 USB。
- 分析网络流量: Wireshark 可以分析捕获的流量并显示有关每个数据包的详细信息,包括源和目标地址、协议类型、数据包大小和数据包内容。
- 过滤网络流量: Wireshark 可用于过滤网络流量,以便仅查看您感兴趣的数据包。这对于缩小分析范围和查找特定类型的信息非常有用。
- 以多种格式导出数据: Wireshark 可以将捕获的数据导出为多种格式,包括 pcap、csv 和 tsv。
Tshark:
- 描述:Tshark 是 Wireshark 的命令行接口 (CLI)。它是一种用于捕获和分析网络流量的免费且开源工具。Tshark 与 Wireshark 共享相同的底层捕获引擎和分析功能,但它旨在从命令行而不是图形用户界面 (GUI) 使用。
- 优势:
- 从脚本或自动化程序中捕获或分析流量: Tshark 可用于从脚本或自动化程序中捕获或分析流量。这使其成为需要将网络流量捕获或分析集成到现有工作流程中的用户的理想选择。
- 在受限的环境中分析流量: Tshark 可用于在受限的环境中分析流量,例如没有图形显示能力的服务器或虚拟机。
- 执行比 GUI 更快的操作: Tshark 通常比 Wireshark GUI 更快地执行某些操作,例如过滤和分析大量数据包。
tcpdump:
描述:tcpdump 是一款用于在网络层截取和分析网络数据包的免费且开源的命令行工具。它运行在 Linux、macOS 和 BSD 等操作系统上。tcpdump 是网络故障排除、网络安全和网络性能分析的常用工具。tcpdump 可以捕获各种网络接口上的网络流量,包括以太网、Wi-Fi 和 USB。它可以捕获所有类型的 IP 流量,包括 TCP、UDP、ICMP 和 IPv6。tcpdump 还支持过滤和分析捕获的数据包,这使得它成为网络问题的诊断和解决的宝贵工具。
特点:
- 轻量级,适合在资源受限的环境中使用
- 支持复杂的过滤规则
- 广泛用于网络故障排除和安全分析
tcpdump 的基本语法如下:
tcpdump [选项] [表达式]
Fiddler:
- 描述:Fiddler 是一款免费的网络调试代理工具,用于监测本地计算机和Internet之间所有的HTTP通讯。它可以记录客户端和服务器之间的所有请求,可以针对特定的请求,分析请求数据、设置断点、调试web应用、修改请求的数据,甚至可以修改服务器返回的数据,功能非常强大,是web调试的利器。Fiddler只能捕获本地计算机和Internet之间的HTTP通讯。
- 特点:
- 可记录客户端和服务器之间的所有HTTP(S)请求
- 支持请求数据的分析、修改和重放
- 提供断点调试功能
3.2 实例操作
3.2.1 使用Python和Scapy库捕获流量
import scapy.all as scapy
import time
def capture_and_save_traffic(interface, filename):
"""
使用 Scapy 捕获网络流量并将流量保存到文件中
参数:
interface: 要捕获流量的网络接口名称
filename: 要保存捕获流量的 pcap 文件名
"""
# 创建一个 PcapWriter 对象来保存捕获的流量
pcap_writer = scapy.all.PcapWriter(filename)
# 使用 Scapy 捕获流量
with scapy.all.sniff(iface=interface, store=False, prn=lambda pkt: pcap_writer.write(pkt)):
# 捕获 10 秒钟的流量
time.sleep(10)
# 关闭 PcapWriter 对象
pcap_writer.close()
if __name__ == "__main__":
"""
主函数
"""
# 设置要捕获流量的网络接口
interface = "en0" # 以太网接口 en0,请根据您的实际情况进行更改
# 设置要保存捕获流量的 pcap 文件名
filename = "traffic.pcap"
# 捕获并保存流量
capture_and_save_traffic(interface, filename)
3.2.2 使用Tshark命令行工具捕获流量
import scapy.all as scapy
import time
def capture_traffic(interface, filename):
"""
使用 Tshark 实时收集网络流量并将其存储为 pcap 文件
参数:
interface: 要捕获流量的网络接口名称
filename: 要保存捕获流量的 pcap 文件名
"""
# 使用 Tshark 命令捕获流量并将其保存到文件中
command = f"tshark -i {interface} -w {filename}"
subprocess.call(command, shell=True)
def main():
"""
主函数
"""
# 设置要捕获流量的网络接口
interface = "en0" # 以太网接口 en0,请根据您的实际情况进行更改
# 设置要保存捕获流量的 pcap 文件名
filename = "traffic.pcap"
# 开始捕获流量
print(f"开始捕获网络流量到 {filename}...")
capture_traffic(interface, filename)
# 捕获 10 秒钟的流量
time.sleep(10)
# 停止捕获流量
print("停止捕获网络流量...")
subprocess.call(["pkill", "-9", "tshark"], shell=True)
if __name__ == "__main__":
main()
3.2.3 使用dpkt进行实时流量分析
import dpkt
import socket
def main():
"""
使用 dpkt 实时分析网络流量
"""
# 创建一个套接字来捕获流量
sock = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_RAW)
sock.bind(("0.0.0.0", 0))
sock.setsockopt(socket.SOL_SOCKET, socket.SO_RECVBUF, 0)
while True:
# 接收数据包
data = sock.recvfrom(65535)
# 解析数据包
ethernet = dpkt.ethernet.Ethernet(data[0])
# 如果是 IP 数据包,则分析 IP 头
if isinstance(ethernet.data, dpkt.ip.IP):
ip = ethernet.data
# 分析源和目标 IP 地址
src_ip = socket.inet_ntoa(ip.src)
dst_ip = socket.inet_ntoa(ip.dst)
# 分析协议类型
if ip.p == dpkt.ip.IPPROTO_TCP:
protocol = "TCP"
elif ip.p == dpkt.ip.IPPROTO_UDP:
protocol = "UDP"
else:
protocol = "UNKNOWN"
# 打印有关数据包的信息
print(f"[*] {src_ip} -> {dst_ip}: {protocol}")
if __name__ == "__main__":
main()
这些示例展示了如何使用不同的工具和库来捕获和分析网络流量。在实际应用中,可能需要根据具体需求进行更复杂的配置和分析。
3.2.4 使用wireshark提供的 api进行实时流量分析
#include <tshark.h>
#include <wiretap.h>
int main() {
// 初始化 TShark API
tshark_instance *tshark = tshark_init();
if (tshark == NULL) {
fprintf(stderr, "错误:初始化 TShark API 失败\n");
return 1;
}
// 配置捕获参数
// -i en0: 指定要捕获流量的网络接口,这里是 "en0" 以太网接口
// -f 'tcp': 指定要捕获的协议,这里是 TCP 协议
// capture.pcap: 指定保存捕获数据的 pcap 文件名
int ret = tshark_capture(tshark, "en0", "-f 'tcp'", "capture.pcap");
if (ret != 0) {
fprintf(stderr, "错误:捕获流量失败:%s\n", tshark_errstr(tshark));
tshark_cleanup(tshark);
return 1;
}
// 停止捕获流量
tshark_stop_capture(tshark);
// 清理 TShark API 资源
tshark_cleanup(tshark);
return 0;
}
3.3 网络流量实时快速实时抓取实现
工具库
flowcontainer 库:flowcontainer是基于python3的网络流量基本信息提取库,以方便完成网络流量的分析任务。给定pcap文件,该库会提取pcap所有的流的相关信息,其中流信息包括:流的源端口、源IP、目的IP、目的端口、IP数据包的长度序列、IP数据集的到达时间序列、有效载荷序列以及相应有效载荷的到达时间序列、等扩展信息。库会对IP数据包做过滤,那些tcp/udp载荷不为0的数据包会统计到有效载荷序列里面。工具简单易用,扩展性和复用性高。
首先安装
python3.8
及以上的版本安装与网络流量抓取有关的包
pip install scapy flowcontainer sqlite3 pandas
以管理员权限允许该脚本
import flowcontainer import time import threading import sqlite3 from datetime import datetime import pandas as pd import subprocess from scapy.all import sniff class TrafficAnalyzer: def __init__(self, update_interval=5, db_file='traffic_data.db', enable_db=False, filters=None): self.update_interval = update_interval self.db_file = db_file self.enable_db = enable_db self.filters = filters or {} self.temp_pcap = 'temp_capture.pcap' self.lock = threading.Lock() if self.enable_db: self.init_db() def init_db(self): conn = sqlite3.connect(self.db_file) c = conn.cursor() c.execute('''CREATE TABLE IF NOT EXISTS traffic_data (timestamp TEXT, src_ip TEXT, dst_ip TEXT, src_port INTEGER, dst_port INTEGER, protocol TEXT, packet_count INTEGER, total_bytes INTEGER, duration REAL)''') conn.commit() conn.close() def apply_filters(self, flow): if not self.filters: return True if 'src_ip' in self.filters and flow.src_ip != self.filters['src_ip']: return False if 'dst_ip' in self.filters and flow.dst_ip != self.filters['dst_ip']: return False if 'protocol' in self.filters and flow.protocol != self.filters['protocol']: return False if 'src_port' in self.filters and flow.src_port != self.filters['src_port']: return False if 'dst_port' in self.filters and flow.dst_port != self.filters['dst_port']: return False return True def capture_packets(self, interface): def packet_callback(packet): pass # We don't need to do anything here, just capture packets sniff(iface=interface, prn=packet_callback, store=0) def analyze_traffic(self): while True: time.sleep(self.update_interval) with self.lock: # Stop the capture and save to pcap file subprocess.run(['tcpdump', '-i', self.interface, '-w', self.temp_pcap, '-c', '1000']) # Load the pcap file flows = flowcontainer.load_pcap(self.temp_pcap) # Filter flows filtered_flows = [flow for flow in flows if self.apply_filters(flow)] print(f"\n--- Traffic Stats (Last {self.update_interval} seconds) ---") print(f"Total flows: {len(filtered_flows)}") print(f"Total packets: {sum(flow.packets for flow in filtered_flows)}") print(f"Total bytes: {sum(flow.bytes for flow in filtered_flows)}") print("\nTop 5 Flows:") top_flows = sorted(filtered_flows, key=lambda x: x.bytes, reverse=True)[:5] for flow in top_flows: print(f"{flow.src_ip}:{flow.src_port} -> {flow.dst_ip}:{flow.dst_port} ({flow.protocol})") print(f" Packets: {flow.packets}, Bytes: {flow.bytes}, Duration: {flow.duration:.2f}s") if self.enable_db: self.save_to_db(filtered_flows) def save_to_db(self, flows): conn = sqlite3.connect(self.db_file) c = conn.cursor() timestamp = datetime.now().isoformat() for flow in flows: c.execute('''INSERT INTO traffic_data VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)''', (timestamp, flow.src_ip, flow.dst_ip, flow.src_port, flow.dst_port, flow.protocol, flow.packets, flow.bytes, flow.duration)) conn.commit() conn.close() def capture_and_analyze_realtime(interface="eth0", enable_db=False, filters=None): analyzer = TrafficAnalyzer(enable_db=enable_db, filters=filters) analyzer.interface = interface # Start the packet capture thread capture_thread = threading.Thread(target=analyzer.capture_packets, args=(interface,), daemon=True) capture_thread.start() # Start the analysis thread analysis_thread = threading.Thread(target=analyzer.analyze_traffic, daemon=True) analysis_thread.start() print(f"Starting real-time capture on {interface}. Press Ctrl+C to stop.") try: while True: time.sleep(1) except KeyboardInterrupt: print("\nCapture stopped by user.") if __name__ == "__main__": # Example usage with database enabled and a filter for TCP traffic only capture_and_analyze_realtime( interface="eth0", enable_db=True, filters={'protocol': 'TCP'} )
默认监听"eth0"接口,可以在调用
capture_and_analyze_realtime()
时指定其他接口flowspot工具:目前支持基于深度学习和机器学习的加密流量分类方法
4. 指纹提取技术
4.1 基于端口的识别
基于端口的识别是最基本的流量识别方法之一,但仍然是许多网络管理和安全工具中的重要组成部分。
4.1.1 原理
基于端口的识别利用了不同应用程序和服务通常使用特定的网络端口这一事实。例如,HTTP通常使用80端口,HTTPS使用443端口,SSH使用22端口等。
4.1.2 优缺点
优点:
- 实现简单,计算开销低
- 对于使用标准端口的应用程序,识别准确率高
缺点:
- 无法识别使用动态端口或非标准端口的应用
- 容易被规避(如通过改变端口号)
- 无法识别加密流量的内容
4.1.3 实现方法
- 使用
Python
和Scapy
库:
import scapy.all as scapy
from collections import Counter
def analyze_ports(packets, top_n=10):
ports = []
for packet in packets:
if packet.haslayer(scapy.TCP):
ports.append(packet[scapy.TCP].dport)
elif packet.haslayer(scapy.UDP):
ports.append(packet[scapy.UDP].dport)
port_counter = Counter(ports)
return port_counter.most_common(top_n)
def capture_and_analyze(interface, packet_count=1000):
print(f"捕获 {packet_count} 个数据包进行分析...")
packets = scapy.sniff(iface=interface, count=packet_count)
top_ports = analyze_ports(packets)
print("\n最常见的端口:")
for port, count in top_ports:
print(f"端口 {port}: {count} 个数据包")
if __name__ == "__main__":
interface = "en0" # 根据实际情况修改接口名称
capture_and_analyze(interface)
使用Wireshark的端口过滤器:
- 在Wireshark的过滤器栏中输入
tcp.port == 80
或udp.port == 53
来快速识别特定端口的流量。
- 在Wireshark的过滤器栏中输入
nmap端口扫描: nmap是一个广泛使用的网络扫描和安全审计工具。它可以用来扫描目标主机的开放端口,从而推断运行的服务。例如:
nmap -sV target_ip
可以扫描并尝试确定服务版本。netstat命令: 在大多数操作系统中,netstat命令可以用来查看当前系统的网络连接状态,包括使用的端口号。例如:
netstat -tuln
可以显示所有正在监听的TCP和UDP端口。使用tshark进行命令行分析: tshark是Wireshark的命令行版本,可以用于快速分析网络流量。例如:
tshark -Y "tcp.port == 80" -T fields -e ip.src -e tcp.srcport
可以显示所有访问80端口的源IP和源端口。
4.2 深度包检测(DPI)
深度包检测(Deep Packet Inspection, DPI)是一种更高级的网络流量分析技术,它通过分析数据包的有效载荷来识别特定的应用程序、协议或行为。
4.2.1 原理
DPI技术通过检查数据包的内容(包括头部和有效载荷),寻找特定的字符串、模式或特征。这些特征可能是协议签名、应用程序特定的数据结构或其他独特的标识符。
4.2.2 优缺点
优点:
- 能够识别使用非标准端口的应用程序
- 可以检测复杂的网络行为和协议
- 能够进行内容过滤和应用层控制
缺点:
- 计算开销较大,可能影响网络性能
- 对加密流量的效果有限
- 可能引发隐私问题
4.2.3 实现方法和工具
开源工具
a. nDPI
- 描述:一个开源的DPI库,可以识别数百种协议。
- 特点:轻量级,易于集成,支持实时流量分类。
- 用途:适合集成到其他网络应用中。
- 示例代码:
#include "ndpi_api.h" void process_packet(const struct pcap_pkthdr *header, const u_char *packet) { struct ndpi_detection_module_struct *ndpi_struct = ndpi_init_detection_module(); struct ndpi_flow_struct *flow = ndpi_flow_malloc(NDPI_PROTOCOL_SIZE); ndpi_protocol protocol = ndpi_detection_process_packet(ndpi_struct, flow, packet, header->len, header->ts.tv_sec); printf("Detected protocol: %s\n", ndpi_get_proto_name(ndpi_struct, protocol.app_protocol)); ndpi_free_flow(flow); ndpi_exit_detection_module(ndpi_struct); }
b. Zeek (formerly Bro)
- 描述:一个强大的网络分析框架,提供深度包检测功能。
- 特点:高度可定制,支持复杂的脚本编写。
- 用途:网络安全监控、取证分析。
- 示例脚本 (Zeek脚本语言):
event http_request(c: connection, method: string, original_uri: string, unescaped_uri: string, version: string) { print fmt("HTTP request: %s %s", method, original_uri); }
c. Suricata
- 描述:高性能的网络IDS、IPS和网络安全监控引擎。
- 特点:支持多线程,可以处理高速网络流量。
- 用途:入侵检测、安全监控。
- 示例规则:
alert http $HOME_NET any -> $EXTERNAL_NET any (msg:"Potential SQL Injection"; content:"UNION SELECT"; nocase; sid:1000001; rev:1;)
商业解决方案
a. Palo Alto Networks Next-Generation Firewall
- 特点:集成了应用层DPI,可以识别和控制应用。
- 用途:企业级网络安全。
b. Cisco's Next-Generation Firewalls
- 特点:提供基于应用的策略控制和威胁防护。
- 用途:大型企业和服务提供商网络。
c. Check Point's DPI Solutions
- 特点:提供实时的应用控制和威胁预防。
- 用途:全面的网络安全管理。
DPI开发框架
a. DPDK (Data Plane Development Kit)
描述:一套用于快速数据包处理的库和驱动程序。
用途:可用于构建高性能的DPI应用。
示例代码:
#include <rte_eal.h> #include <rte_ethdev.h> #include <rte_mbuf.h> int main(int argc, char **argv) { int ret = rte_eal_init(argc, argv); if (ret < 0) rte_exit(EXIT_FAILURE, "Error with EAL initialization\n"); unsigned nb_ports = rte_eth_dev_count_avail(); printf("Number of ports available: %u\n", nb_ports); return 0; }
b. Scapy
描述:Python的数据包操作库。
用途:快速原型开发和测试DPI算法。
示例代码:
from scapy.all import * def packet_callback(packet): if packet.haslayer(HTTP): print(f"HTTP Request: {packet[HTTP].Method} {packet[HTTP].Path}") sniff(filter="tcp port 80", prn=packet_callback, store=0)
4.3 基于机器学习的方法
机器学习方法在网络流量指纹提取中越来越受欢迎,因为它们能够自动学习复杂的模式和特征,适应不断变化的网络环境。
4.3.1 主要方法
支持向量机 (SVM)
- 原理:在高维特征空间中构建超平面,将不同类别的数据分开。
- 优点:对高维数据效果好,可以处理非线性分类问题。
- 缺点:训练时间较长,对大规模数据集不太适用。
随机森林
- 原理:构建多个决策树,通过投票或平均来做出最终决策。
- 优点:抗噪能力强,不易过拟合,可以处理高维数据。
- 缺点:模型解释性较差,对非平衡数据集效果不佳。
深度学习
- 原理:使用多层神经网络自动学习数据的层次特征。
- 优点:可以学习复杂的非线性关系,适合处理大规模数据。
- 缺点:需要大量训练数据,计算资源要求高。
4.3.2 实现示例
以下是使用Python和scikit-learn库实现基于机器学习的网络流量分类的示例代码:
import numpy as np
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
import scapy.all as scapy
def extract_features(packet):
features = []
if scapy.IP in packet:
features.append(packet[scapy.IP].len)
features.append(packet[scapy.IP].ttl)
if scapy.TCP in packet:
features.append(packet[scapy.TCP].sport)
features.append(packet[scapy.TCP].dport)
features.append(len(packet[scapy.TCP].payload))
return features
def prepare_dataset(pcap_file):
packets = scapy.rdpcap(pcap_file)
X = []
y = []
for packet in packets:
features = extract_features(packet)
if len(features) == 5: # 确保特征数量一致
X.append(features)
# 这里假设我们知道每个数据包的标签,实际中可能需要更复杂的标记方法
y.append(determine_label(packet))
return np.array(X), np.array(y)
def train_model(X, y):
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
clf = RandomForestClassifier(n_estimators=100, random_state=42)
clf.fit(X_train, y_train)
y_pred = clf.predict(X_test)
print(classification_report(y_test, y_pred))
return clf
def determine_label(packet):
# 这里需要根据实际情况定义如何标记数据包
# 例如,可以根据端口号或payload内容来判断
if scapy.TCP in packet and packet[scapy.TCP].dport == 80:
return "HTTP"
elif scapy.TCP in packet and packet[scapy.TCP].dport == 443:
return "HTTPS"
else:
return "Other"
if __name__ == "__main__":
pcap_file = "captured_traffic.pcap"
X, y = prepare_dataset(pcap_file)
model = train_model(X, y)
这个示例展示了如何使用随机森林算法对网络流量进行分类。在实际应用中,可能需要更复杂的特征工程和模型选择过程。
4.4 启发式方法
启发式方法是基于专家知识和经验规则的流量识别技术。这些方法通常结合了多种简单的判断标准来做出决策。
4.4.1 主要技术
规则匹配
- 描述:基于预定义的规则集来识别流量。
- 优点:直观,易于实现和调整。
- 缺点:需要持续更新规则,可能无法识别新型应用。
统计特征分析
- 描述:分析流量的统计特征,如包大小分布、流持续时间等。
- 优点:对加密流量也有效,不依赖于包内容。
- 缺点:可能受到网络条件变化的影响。
行为模式识别
- 描述:分析应用程序或协议的典型行为模式。
- 优点:可以识别复杂的应用行为。
- 缺点:需要深入了解各种应用的行为特征。
4.4.2 实现示例
以下是一个简单的Python脚本,展示了如何使用启发式方法进行基本的流量分类:
import scapy.all as scapy
def classify_traffic(packet):
if scapy.TCP in packet:
if packet[scapy.TCP].dport == 80 or packet[scapy.TCP].sport == 80:
return "HTTP"
elif packet[scapy.TCP].dport == 443 or packet[scapy.TCP].sport == 443:
return "HTTPS"
elif packet[scapy.TCP].dport == 22 or packet[scapy.TCP].sport == 22:
return "SSH"
elif scapy.UDP in packet:
if packet[scapy.UDP].dport == 53 or packet[scapy.UDP].sport == 53:
return "DNS"
# 分析包大小
if scapy.IP in packet:
if packet[scapy.IP].len < 100:
return "Small Packet (possibly control traffic)"
elif packet[scapy.IP].len > 1400:
return "Large Packet (possibly file transfer)"
return "Unknown"
def analyze_pcap(pcap_file):
packets = scapy.rdpcap(pcap_file)
classifications = {}
for packet in packets:
classification = classify_traffic(packet)
if classification in classifications:
classifications[classification] += 1
else:
classifications[classification] = 1
print("Traffic Classification Results:")
for classification, count in classifications.items():
print(f"{classification}: {count} packets")
if __name__ == "__main__":
pcap_file = "captured_traffic.pcap"
analyze_pcap(pcap_file)
这个脚本展示了如何使用简单的规则和统计特征来分类网络流量。在实际应用中,可能需要更复杂的规则和更多的统计特征。
4.5 论文算法对应的特征值
算法 | 所需特征 | 参考论文 | 总结 |
---|---|---|---|
1. 基于统计的方法 | - 流量大小 - 包数量 - 流持续时间 - 平均包大小 - 包到达间隔 | Lakhina, A., Crovella, M., & Diot, C. (2004). Diagnosing network-wide traffic anomalies. ACM SIGCOMM Computer Communication Review, 34(4), 219-230. | 利用统计学原理分析网络流量特征的分布和变化,可以有效检测出与正常模式显著偏离的异常行为。这种方法计算简单,易于实施,但可能对微小或渐进式的异常不够敏感。 |
2. 基于机器学习的方法(如SVM, 随机森林) | - 源IP地址 - 目的IP地址 - 源端口 - 目的端口 - 协议类型 - 流量大小 - 包数量 - TCP标志 | Mukherjee, S., & Sharma, N. (2012). Intrusion detection using naive Bayes classifier with feature reduction. Procedia Technology, 4, 119-128. | 通过学习正常和异常流量的特征,构建分类模型来识别新的异常。这类方法可以处理复杂的非线性关系,具有较好的泛化能力,但需要大量标记数据进行训练。 |
3. 深度学习方法(如CNN, LSTM) | - 原始包数据 - 流量时间序列 - 包头信息 - 包负载(可选) | Wang, W., Zhu, M., Zeng, X., Ye, X., & Sheng, Y. (2017). Malware traffic classification using convolutional neural network for representation learning. In 2017 International Conference on Information Networking (ICOIN) (pp. 712-717). IEEE. | 利用深度神经网络自动学习流量的高级特征表示,可以捕捉到复杂的时间和空间模式。这种方法在处理大规模、高维数据时表现优异,但需要大量计算资源和训练数据。 |
4. 基于聚类的方法(如K-means, DBSCAN) | - 流量大小 - 包数量 - 流持续时间 - 源IP地址 - 目的IP地址 | Erman, J., Arlitt, M., & Mahanti, A. (2006). Traffic classification using clustering algorithms. In Proceedings of the 2006 SIGCOMM workshop on Mining network data (pp. 281-286). | 通过将相似的流量模式分组,可以识别出不属于任何主要群集的异常流量。这种无监督学习方法不需要标记数据,适合发现未知类型的异常,但可能难以确定最佳的聚类数量。 |
5. 基于关联规则挖掘的方法 | - 源IP地址 - 目的IP地址 - 源端口 - 目的端口 - 协议类型 - 时间戳 | Mahoney, M. V., & Chan, P. K. (2003). Learning rules for anomaly detection of hostile network traffic. In Third IEEE International Conference on Data Mining (pp. 601-604). IEEE. | 通过发现网络流量中的频繁模式和关联规则,可以检测出违反这些规则的异常行为。这种方法可以提供可解释的结果,有助于理解异常的本质,但可能会产生大量的规则,需要进一步筛选和优化。 |
6. 基于主成分分析(PCA)的方法 | - 流量矩阵(不同OD对之间的流量) | Lakhina, A., Crovella, M., & Diot, C. (2004). Diagnosing network-wide traffic anomalies. ACM SIGCOMM Computer Communication Review, 34(4), 219-230. | 通过将高维流量数据投影到低维空间,可以分离出正常流量的主要模式和异常流量。这种方法可以有效减少数据维度,提高计算效率,但可能对参数选择比较敏感。 |
7. 基于信息熵的方法 | - 源IP地址 - 目的IP地址 - 源端口 - 目的端口 - 包大小分布 | Nychis, G., Sekar, V., Andersen, D. G., Kim, H., & Zhang, H. (2008). An empirical evaluation of entropy-based traffic anomaly detection. In Proceedings of the 8th ACM SIGCOMM conference on Internet measurement (pp. 151-156). | 利用信息理论中的熵概念来度量流量特征的不确定性,异常流量通常会导致熵值的显著变化。这种方法对分布变化敏感,可以检测多种类型的异常,但可能受到流量噪声的影响。 |
8. 基于图的方法 | - 源IP地址 - 目的IP地址 - 边权重(如流量大小) | Ding, Q., Katenka, N., Barford, P., Kolaczyk, E., & Crovella, M. (2012). Intrusion as (anti) social communication: characterization and detection. In Proceedings of the 18th ACM SIGKDD international conference on Knowledge discovery and data mining (pp. 886-894). | 将网络流量建模为图结构,利用图理论和网络科学的方法来分析异常。这种方法可以捕捉到复杂的网络拓扑和交互模式,特别适合检测分布式攻击,但可能在大规模网络中计算复杂度较高。 |
9. 基于自编码器的方法 | - 流量特征向量(可包含多种上述特征) | Mirsky, Y., Doitshman, T., Elovici, Y., & Shabtai, A. (2018). Kitsune: an ensemble of autoencoders for online network intrusion detection. In Network and Distributed System Security Symposium 2018 (NDSS'18). | 使用自编码器学习正常流量的压缩表示,异常流量在重构时会产生较大误差。这种方法可以自动学习特征,适合在线学习和检测,但可能需要careful调参以平衡检测率和误报率。 |
10. 基于时间序列分析的方法 | - 流量时间序列 - 包到达时间序列 | Brutlag, J. D. (2000). Aberrant behavior detection in time series for network monitoring. In Proceedings of the 14th USENIX conference on System administration (pp. 139-146). | 将网络流量视为时间序列,使用各种时间序列分析技术(如ARIMA, 小波分析等)来检测异常模式。这种方法可以捕捉到流量的时间动态性和周期性模式,适合检测持续性攻击,但可能对突发性、短暂的异常不够敏感。 |
11. 基于异构图神经网络的方法 (HGNNIAD) | - 节点特征(如IP地址、端口号) - 边特征(如协议类型、流量大小) - 时间信息 - 网络拓扑结构 | Zeqi Huang, Yonghao Gu, and Qing Zhao. 2022. One-Class Directed Heterogeneous Graph Neural Network for Intrusion Detection. In Proceedings of the 2022 6th International Conference on Innovation in Artificial Intelligence (ICIAI '22). | 利用异构图神经网络来建模复杂的网络交互,同时考虑节点特征、边特征和时间动态性。这种方法可以捕捉到多种实体间的复杂关系和时间演化模式,具有较强的表达能力和灵活性,但可能需要较高的计算资源和精心设计的图结构。 |
5 开源数据集下载
CAIDA数据集 描述:包含各种网络流量数据,如DDoS攻击、匿名化的互联网流量等。 链接:https://www.caida.org/data/overview/
DARPA Intrusion Detection数据集 描述:用于入侵检测系统研究的经典数据集。 链接:https://www.ll.mit.edu/r-d/datasets/1998-darpa-intrusion-detection-evaluation-dataset
KDD Cup 1999数据集 描述:基于DARPA数据集处理得到的,用于网络入侵检测的数据集。 链接:http://kdd.ics.uci.edu/databases/kddcup99/kddcup99.html
UNB ISCX 2012入侵检测评估数据集 描述:包含正常和恶意网络流量的数据集。 链接:https://www.unb.ca/cic/datasets/ids.html
UNSW-NB15数据集 描述:包含现代正常和攻击行为的网络流量数据集。 链接:https://research.unsw.edu.au/projects/unsw-nb15-dataset
CTU-13数据集 描述:包含僵尸网络流量的数据集。 链接:https://www.stratosphereips.org/datasets-ctu13
CICIDS2017数据集 描述:包含最新常见攻击场景的入侵检测和入侵防御数据集。 链接:https://www.unb.ca/cic/datasets/ids-2017.html
CICIDS2018数据集 描述:CICIDS2017的更新版本,包含更多攻击类型。 链接:https://www.unb.ca/cic/datasets/ids-2018.html
NDSec-1数据集 描述:专注于网络安全的数据集,包含各种网络攻击。 链接:https://www2.hs-fulda.de/NDSec/NDSec-1/Files/
CSECICIDS2018数据集 描述:包含七种不同攻击场景的网络流量数据。 链接:https://registry.opendata.aws/cse-cic-ids2018/
USTC-TFC2016数据集 描述:包含加密流量分类的数据集。 链接:https://github.com/yungshenglu/USTC-TFC2016
CIC DoS数据集 描述:专注于各种DoS攻击类型的数据集。 链接:https://www.unb.ca/cic/datasets/dos-dataset.html
马萨诸塞大学系列:http://traces.cs.umass.edu/index.php/Network/Network这个网站提供了该学院很多数据集,这些数据集是他们发表论文时提取的,然后公开出来。
WebIdent 2 Traces 数据集描述:A collection of traces of web requests and responses over an encrypted SSH tunnel. The collection spans traces of connections to 2000 sites, collected four times a day over several months from February 2006 through April 2006. Each connection was encrypted; the traces include only the TCP headers, and not the payload.
2000个网站的SSH隧道上SSL连接的流量,只有TCP 头,PCAP大约2.5G 。 这个数据集是标注好了的。label: website。
地址:http://skuld.cs.umass.edu/traces/network/README-webident2
WIDE Project项目
该项目是日本和美国的合作项目,该项目会按照不同的时间周期(如每天的某分钟,每个月)采集从日本到美国的某条骨干网络的网络流量,里面一共涉及了7个采样点,其中C-D采样点采集的是IPv6的数据包。时间跨度特别大:从2001年到2018 都有。
网络流量做了数据脱敏,里面的IP地址是经过处理的,而且只有IP包头。当然这个数据集更适合做测量,因为它是没有标注过的。
Youtube 加密视频流量标题识别数据集
数据集地址:https://netsg.cs.sfu.ca/youtubedata/
数据集描述: 作者采集了10000个Youtube视频流量,其中包含100个视频,每个视频观看100次。然后每个pcap,都有标注好对应的视频标题。pcap都没做数据脱敏,就是原始的pcap数据包。同时作者该采集了一些带延时和丢包的数据包用来作为测试集。作者的工作就是建立模型识别加密视频流量对应的视频标题。
流量分析对抗实验数据集:这个数据集需要自己根据源码自己生成: https://github.com/kpdyer/website-fingerprinting 源码生成的结果是会访问2000个 website 和775个SSH的Sockets代理的website的流量,里面的还有11个流量混淆的方法(包括包长填充等)可供选择,里面还有11个流量分类器。
网络防御比赛的数据集:里面有SSL的数据包,尚未标注好的。可以作为协议格式自动化推断的数据包。https://www.netresec.com/?page=MACCDC
Tor流量A:一般来说Tor上面的加密流量分类叫做
webfingerprint attack
,这个领域有很多公开的数据集,但是这个领域的很多数据集一般只给出cell的方向序列。例如: [-1,1,1,-1,-1,…] 是-1的序列。正负号表示cell是Outgoing还是ingoing。每个cell的实际大小一般是512,因此可以根据cell的方向序列推断出cell的大小序列,只需要乘以512即可。 常见的数据集有:AWF模型
https://github.com/jmhIcoding/DLWF?organization=jmhIcoding&organization=jmhIcoding
里面有 Closed World ,Open World ,Concept drift 等流量。有100,200,500,900个类别的分梯度的标注数据,每个类别有2500条数据。这个数据集还是很大的!
Deep fingerping数据集
https://github.com/deep-fingerprinting/df
这个是深度学习的一个数据集,里面有95个类别。训练集有75000多个样本,测试集和验证集还各有9500条样本。
Andrubis 数据集
介绍: 这个数据集超大,包含了103万个Android APP的带标注的流量数据,而且是pcap原始数据包。这个数据集包括了正常APP和恶意APP,是否正常是通过VirusTotal来判断的。 每个APP在Android模拟器里面跑4分钟。
地址:https://drive.google.com/drive/folders/1IXa3IJS9zJS4vggpyU7yda8f7jZjz4gB
Browser 数据集
介绍:在三星Note4 安卓6.0.1设备上使用Chrome,Firefox,三星自带流量和UC浏览器访问Alexa Top 1000的站点。 每个站点访问15秒。 这里是为了分类不同的浏览器。
地址:https://drive.google.com/open?id=1wOdrfazbrcMDrL0NfA4GLoWegtPqkPj3
Cross Platform数据集
介绍:https://www.ndss-symposium.org/wp-content/uploads/2018/03/NDSS2018_05B-2_Ren_Slides.pdf 这个数据集做了相同APP不同版本之间的分析。这个数据集有pcap文件。数据集有大约8个G
地址:https://drive.google.com/drive/folders/1cmG_5FIAh1DOGPI9el1K5WD9fUIpfw-x
ReCon dataset
介绍:https://recon.meddle.mobi/appversions/
数据下载地址:https://recon.meddle.mobi/appversions/raw_data.tar.gz
CIC数据集
https://www.unb.ca/cic/datasets/ 这个网站上面的数据集特别多,主要是一些入侵检测、恶意软件的数据集。
Stratosphere IPS数据集
https://www.stratosphereips.org/datasets-overview 这个IPS有提供比较多的数据集,更多是僵尸网络的数据集。
mirage数据集:这个数据集包含了20个移动应用的数据,主要有如下一些字段:每条流前30个包的:包长序列、到达时间序列;以及整条流的一些统计信息。因为这个数据集只分享了前30个IP数据包的长度,因此不适合做包长序列的模型,但是它暴露了前30个包的载荷。适合做以载荷为主要输入的模型。
相关论文
调研有关的论文: