Skip to main content

一个用于解析pcap文件的python库

Project description

pypcaptools

pypcaptools 是一个用于解析 pcap 文件中 TCP 流量,并将 trace、flow、resource 级特征写入 MySQL 的 Python 库。它主要面向网络流量指纹分析、网站访问流量分析和机器学习特征提取场景。

这个库可以按两种方式使用:

  • 在本地直接解析 pcap 文件,读取 trace 和 flow 序列。
  • pcap 文件,以及可选的资源元数据 JSON 文件,导入规范化的 MySQL 表结构。

功能特性

  • 基于 dpkt 的轻量级 pcap 解析。
  • 提取 trace 级包序列:时间戳、payload 大小、方向、包数量和捕获时间。
  • 按 TCP 五元组聚合 flow,并保留每条 flow 的包序列和 trace 包索引。
  • 支持从外部 JSON 元数据映射 resource 级信息,例如 HTTP/2 解码器输出。
  • MySQL 表结构采用 Trace -> Flow -> Resource 三层关系。
  • flow 和 resource 数据支持批量写入。
  • 提供 trace、flow、resource 的查询辅助接口,便于后续特征提取。

环境要求

  • Python 3.8+
  • 使用数据库导入和查询接口时,需要 MySQL 8.0+
  • 当前支持的链路层格式:Ethernet、Linux cooked capture v1
  • 当前解析范围:IPv4 上的 TCP 流量

安装

pip install pypcaptools

安装指定版本:

pip install pypcaptools==2.6

从源码进行本地开发:

pip install -e .

快速开始

不连接数据库,直接解析一个 pcap 文件:

from pypcaptools import PcapHandler

handler = PcapHandler("captures/example.pcap")

trace = handler.get_trace_sequence()
flows = handler.get_flow_sequences()

print(trace["total_packet_count"])
print(len(flows))

for flow_key, flow in flows.items():
    print(flow_key, flow["source_ip"], flow["destination_ip"], len(flow["payload_seq"]))

pcap 文件导入 MySQL:

from pypcaptools import PcapToDatabaseHandler, initialize_database_schema

db_config = {
    "host": "localhost",
    "port": 3306,
    "user": "root",
    "password": "your_password",
    "database": "traffic",
}

base_table_name = "direct_traffic"

initialize_database_schema(db_config, base_table_name)

handler = PcapToDatabaseHandler(
    db_config=db_config,
    base_table_name=base_table_name,
    input_pcap_file="captures/example.pcap",
    input_json_file="captures/example.json",
    protocol="HTTPS",
    accessed_website="example.com",
    site_id="example",
    collection_machine="local-dev",
)

if not handler.pcap_to_database():
    raise RuntimeError("PCAP 数据导入失败")

如果只有 pcap 文件,可以省略 input_json_file。导入器仍会创建 trace 和 flow 记录,并跳过 resource 记录。

数据库表结构

initialize_database_schema(db_config, base_table_name) 会创建三张关联表:

  • {base_table_name}_trace:每个捕获文件对应一条记录。
  • {base_table_name}_flow:每条 TCP flow 对应一条记录,通过 trace_id 关联 trace。
  • {base_table_name}_resource:每个应用层资源对应一条记录,通过 flow_id 关联 flow。

主要序列字段以 MySQL JSON 类型存储:

  • timestamps_seq:相对于 trace 或 flow 起始时间的包时间戳。
  • payload_seq:TCP payload 大小序列。
  • direction_seq:包方向,1 表示出站,-1 表示入站。
  • trace_packet_indices:当前 flow 或 resource 涉及的 trace 级 TCP-only 包索引。

Resource 级特征

input_json_file 来自兼容解码器,例如 traffic2db.http2decoder 时,resource 表可以保留 HTTP 资源到 TCP 包号的映射:

  • headers_packet_num:请求 headers 所在的 TCP-only 包号。
  • request_packet_nums:请求相关的 TCP-only 包号列表。
  • response_packet_nums:响应相关的 TCP-only 包号列表。
  • headers_flow_packet_num:请求 headers 所在的 flow 内包号。
  • request_flow_packet_nums:请求相关的 flow 内包号列表。
  • response_flow_packet_nums:响应相关的 flow 内包号列表。
  • trace_packet_indices:请求和响应相关包号的合集。
  • request_start_tsresponse_start_tsresponse_end_ts:资源请求和响应时间。
  • request_size_bytesresource_size_bytes:请求体和响应体大小。
  • request_packet_countserver_packet_count:请求包数和响应包数。
  • ttfb_msduration_ms:首包延迟和资源总时长。

这些字段可以和 flow 表中的 timestamps_seqpayload_seqdirection_seqtrace_packet_indices 联合使用,用于构建 packet size、burst、时序和累计流量曲线等特征。

查询示例

读取 flow 的 payload 序列:

from pypcaptools.TrafficInfo import FlowInfo

flow_info = FlowInfo(db_config)
flow_info.use_table("direct_traffic")

payload_sequences = flow_info.get_payload_sequence("transport_protocol == 'TCP'")

读取 resource 记录,并同时 join 对应的 flow 和 trace 特征字段:

from pypcaptools.TrafficInfo import ResourceInfo

resource_info = ResourceInfo(db_config)
resource_info.use_table("direct_traffic")

rows = resource_info.get_feature_inputs("http_status == 200")

条件语法支持简单的 Python 风格比较,例如 field == valuefield != valuefield > value。如果需要复杂过滤,建议直接使用底层数据库类执行 SQL。

示例脚本

examples/ 目录下提供了可以直接运行的示例:

  • examples/inspect_pcap.py:查看 pcap 文件中的 trace 和 flow 序列。
  • examples/pcap_to_database.py:将 pcap 和可选 JSON 元数据导入 MySQL。
  • examples/flow_to_database.py:只导入 pcap,存储 trace 和 flow,不写入 resource。
  • examples/flow_info.py:查询已入库的 flow 数据。
  • examples/trace_info.py:查询已入库的 trace 数据。
  • examples/resource_info.py:查询 resource,并同时读取对应的 flow 和 trace 特征。

开发说明

本项目使用 src/ 目录布局。本地开发时建议使用 editable 安装:

pip install -e .

发布或提交代码前,至少运行:

python -m compileall -q src examples
python -m build

许可证

本项目基于 MIT License 开源。

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pypcaptools-2.6.tar.gz (26.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pypcaptools-2.6-py3-none-any.whl (32.6 kB view details)

Uploaded Python 3

File details

Details for the file pypcaptools-2.6.tar.gz.

File metadata

  • Download URL: pypcaptools-2.6.tar.gz
  • Upload date:
  • Size: 26.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.9.25

File hashes

Hashes for pypcaptools-2.6.tar.gz
Algorithm Hash digest
SHA256 094d70611b103d62ea1881ad72fe5de0ca61125271b686d3e691f4b9e5f4f1c6
MD5 f74045b0cdf42dcb30b00854577a0132
BLAKE2b-256 8053abea1aa375bcd70cdc128f69e51a4940847f99ed1750787470629727b223

See more details on using hashes here.

File details

Details for the file pypcaptools-2.6-py3-none-any.whl.

File metadata

  • Download URL: pypcaptools-2.6-py3-none-any.whl
  • Upload date:
  • Size: 32.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.9.25

File hashes

Hashes for pypcaptools-2.6-py3-none-any.whl
Algorithm Hash digest
SHA256 1996aa4f9f85fb858bafd6755eb34946940033bc1d79c988e297f28da7be90ea
MD5 bee33084c151fb42c444e96c468620aa
BLAKE2b-256 3ef5a29986ff9ecf1db8fa3e3c0f8b22cb584707ca22bb08647e513a394eaedd

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page