pktvisor

pktvisor

网络数据流分析与实时观测代理

pktvisor是一个针对高容量网络数据流的观测代理。它从网络边缘提取洞察,并与现代可观测性系统集成。采用模块化设计,支持实时API和YAML策略控制,可动态加载输入和分析模块。pktvisor提供命令行界面和中央化收集功能,支持多种输入流如数据包捕获、dnstap、sFlow和Netflow/IPFIX。它进行应用层分析,输出计数器、直方图和重要项目等多种指标。

pktvisor网络观测数据流分析性能监控开源软件Github开源项目

pktvisor

构建状态 CodeQL CodeCov

<p align="left"> <strong> <a href="#what-is-pktvisor">简介</a>&nbsp;&nbsp;&bull;&nbsp;&nbsp; <a href="#get-started">开始使用</a>&nbsp;&nbsp;&bull;&nbsp;&nbsp; <a href="#docs">文档</a>&nbsp;&nbsp;&bull;&nbsp;&nbsp; <a href="#build">构建</a>&nbsp;&nbsp;&bull;&nbsp;&nbsp; <a href="#contribute">贡献</a>&nbsp;&nbsp;&bull;&nbsp;&nbsp; <a href="#contact-us">联系我们</a> </strong> </p>

pktvisor是什么?

pktvisor(发音为"packet visor")是一个可观测性代理,用于分析高容量、信息密集的网络数据流,并直接从边缘提取可操作的洞察,同时紧密集成现代可观测性堆栈。

它资源高效,从头开始设计为模块化,并可通过API和YAML策略实时动态控制。输入和分析器模块可在运行时动态加载。指标输出可通过命令行UI在节点上使用和可视化(用于本地化、超实时操作),也可集中收集到行业标准的可观测性堆栈中,如Prometheus和Grafana。

输入流系统旨在_采集_数据流。目前支持数据包捕获dnstapsFlowNetflow/IPFIX,不久将支持其他采集方式,如envoy tapseBPF

流分析系统包括完整的应用层分析,并高效地汇总为:

  • 计数器
  • 直方图和分位数
  • 计时器和速率
  • 重点项/频繁项/Top N
  • 集合基数
  • GeoIP/ASN

请查看当前指标列表或示例指标输出

pktvisor起源于对关键互联网基础设施的可观测性支持,用于DDoS保护、流量工程和持续运营。

这些截图展示了命令行集中式视图网络DNS流处理器,以及提供的摘要信息类型:

命令行UI图像 Grafana仪表板图像1 Grafana仪表板图像2

开始使用

Docker

开始使用pktvisor的最简单方法之一是使用公共docker镜像。该镜像包含收集器代理(pktvisord)、命令行UI(pktvisor-cli)和pcap和dnstap文件分析器(pktvisor-reader)。运行容器时,您需要指定要运行的工具。

  1. 拉取容器
docker pull orbcommunity/pktvisor

或使用orbcommunity/pktvisor:latest-develop获取最新的开发版本。

  1. 启动收集器代理

这将在后台启动并保持运行。注意最后两个参数选择pktvisord代理和eth0以太网接口进行数据包捕获。您可以将eth0替换为设备上任何已知的接口。 _注意,此步骤需要docker主机网络_以观察容器外的流量,并且目前只有Linux支持主机网络

docker run --net=host -d orbcommunity/pktvisor pktvisord eth0

如果容器无法保持运行,请检查docker logs输出。

  1. 运行命令行UI

代理运行后,您可以使用包含的命令行UI在本地观察结果。此命令将在前台运行UI(pktvisor-cli),按Ctrl-C时退出。它使用内置的REST API在本地连接到运行中的代理。

docker run -it --rm --net=host orbcommunity/pktvisor pktvisor-cli

Linux 静态二进制文件 (AppImage, x86_64)

您也可以使用 Linux 的一体化二进制文件,它是用 AppImage 构建的,可以在发布页面下载。它设计用于在所有现代 Linux 发行版上运行,无需安装或任何其他依赖项。

curl -L http://pktvisor.com/download -o pktvisor-x86_64.AppImage chmod +x pktvisor-x86_64.AppImage ./pktvisor-x86_64.AppImage pktvisord -h

例如,要在以太网接口 eth0 上运行代理:

./pktvisor-x86_64.AppImage pktvisord eth0

AppImage 包含收集器代理 (pktvisord)、命令行 UI (pktvisor-cli) 和 pcap 和 dnstap 文件分析器 (pktvisor-reader)。您可以通过将其作为第一个参数传递来指定要运行的工具:

例如,要使用 pktvisor 命令行 UI 可视化上面启动的运行代理:

./pktvisor-x86_64.AppImage pktvisor-cli

注意,当运行 AppImage 版本的代理时,您可能需要使用 -d 参数来守护进程(在后台运行),并使用 --log-file--syslog 参数来记录日志。

另请参阅高级代理示例

Linux 静态二进制文件(独立版,x86_64)

最后,pktvisor 还为每个单独的 pktvisor 工具(pktvisord、pktvisor-cli 和 pktvisor-reader)提供静态链接的、无依赖的 Linux 二进制文件。这些是最小、最紧凑的二进制版本。

pktvisord:

curl -L http://pktvisor.com/download/pktvisord -o pktvisord-x86_64 chmod +x pktvisord-x86_64 ./pktvisord-x86_64 -h

pktvisor-cli:

curl -L http://pktvisor.com/download/cli -o pktvisor-cli-x86_64 chmod +x pktvisor-cli-x86_64 ./pktvisor-cli-x86_64 -h

pktvisor-reader:

curl -L http://pktvisor.com/download/reader -o pktvisor-reader-x86_64 chmod +x pktvisor-reader-x86_64 ./pktvisor-reader-x86_64 -h

其他平台

我们正在努力支持更多操作系统、CPU 架构和打包系统。如果您没有看到可用的二进制文件,请参阅下面的构建部分来构建您自己的版本。

如果您有希望看到支持的首选安装方法,请创建一个问题

无需 root 执行 Pktvisord 二进制文件

Pktvisord 使用 libpcap 从所需接口捕获 PCAP。为此,它需要系统网络捕获权限。 您可以仅授权一次这些特定要求,然后就能够无需 sudo 运行二进制文件。

sudo setcap cap_net_raw,cap_net_admin=eip /<full_path>/pktvisord-x86_64

文档

代理使用

当前命令行选项可通过以下方式查看:

docker run --rm orbcommunity/pktvisor pktvisord --help

./pktvisor-x86_64.AppImage pktvisord --help

    用法:
      pktvisord [选项] [IFACE]
      pktvisord (-h | --help)
      pktvisord --version

    pktvisord 汇总数据流并公开 REST API 控制平面用于配置和指标。

    pktvisord 的操作通过 Taps 和 Collection Policies 进行配置。Taps 抽象了"接入"输入流的过程,
    使用模板化配置,而 Policies 使用 Taps 来实例化和配置输入和流处理程序,以分析和汇总流数据,
    然后通过 REST API 提供这些数据供收集。

    可以通过将适当的 YAML 配置文件传递给 --config 来创建 Taps 和 Collection Policies,
    和/或通过启用带有 --admin-api 的管理 REST API 并使用适当的端点。

    或者,对于简单的用例,您可以指定 IFACE,它可以是网络接口、IP 地址(4 或 6)或 "auto"。
    如果指定了这个,将创建"默认"的 Tap 和 Collection Policies,在指定的接口上有一个 "pcap" 输入流,
    并附加内置的 "net"、"dns" 和 "pcap" 流处理程序模块。如果指定 "auto",将选择最常用的以太网接口。
    请注意,此功能可能在未来被弃用。

    更多文档,请参见 https://pktvisor.dev

基础选项: -d 守护进程模式;分叉并在后台继续运行 [默认:否] -h --help 显示此帮助屏幕 -v 详细日志输出 --no-track 不发送轻量级匿名使用指标 --version 显示版本

Web服务器选项: -l 主机 在指定主机或IP上运行Web服务器(默认:localhost) -p 端口 在指定端口上运行Web服务器(默认:10853) --tls 在Web服务器上启用TLS --tls-cert 文件 使用指定的TLS证书。如果启用--tls,则必需。 --tls-key 文件 使用指定的TLS私钥。如果启用--tls,则必需。 --admin-api 启用管理REST API,提供完整的控制平面功能 [默认:否] 未指定时,暴露的API仅提供模块状态和指标的只读访问。 指定时,为所有模块启用写入访问。

地理位置选项: --geo-city 文件 用于IP到地理位置映射的GeoLite2城市数据库 --geo-asn 文件 用于IP到ASN映射的GeoLite2 ASN数据库 --geo-cache-size N GeoLite2 LRU缓存大小,0表示禁用。(默认:10000) --default-geo-city 文件 如果未指定其他数据库,将加载的默认GeoLite2城市数据库 --default-geo-asn 文件 如果未指定其他数据库,将加载的默认GeoLite2 ASN数据库

配置: --config 文件 使用指定的YAML配置文件来配置选项、Taps和收集策略 更多信息请参见 https://pktvisor.dev

Crashpad: --cp-disable 禁用crashpad收集器 --cp-token 令牌 用于远程崩溃报告的Crashpad令牌 --cp-url URL Crashpad服务器URL --cp-custom 用户定义 Crashpad可选的用户自定义字段 --cp-path 路径 Crashpad处理程序二进制文件路径

模块: --module-list 列出所有已加载的模块(内置和动态) --module-dir 目录 设置模块加载路径。此目录中的所有模块都将被加载。

日志选项: --log-file 文件 将日志输出到指定文件 --syslog 将日志输出到系统日志

Prometheus选项: --prometheus 已忽略,Prometheus输出始终启用(保留向后兼容性) --prom-instance ID 可选设置'instance'标签为给定ID

指标丰富选项: --iana-service-port-registry 文件 IANA服务名称和传输协议端口号注册表文件(CSV格式) --default-service-registry 文件 如果未指定其他注册表,将加载的默认IANA服务名称端口号注册表CSV文件

处理程序模块默认值: --max-deep-sample N 深度采样的流不超过N%(0到100之间的整数)(默认:100) --periods P 在内存中保留P个60秒时间段的历史记录(默认:5)

pcap输入模块选项: (仅适用于指定IFACE时的默认策略) -b BPF 使用给定的tcpdump兼容过滤表达式过滤数据包。例如:"port 53" -H 主机规范 指定要视为主机的子网(逗号分隔),采用CIDR格式。在实时捕获中, 这可能会从捕获设备自动检测,但对于pcap文件必须指定。 示例:"10.0.1.0/24,10.0.2.1/32,2001:db8::/64" 为实时捕获指定此项将追加到任何自动检测结果。

使用配置文件

pktvisord可以通过使用--config选项指定YAML配置文件在启动时进行配置。 配置文件可以配置命令行上可用的所有选项, 还可以定义策略Taps。所有部分都是可选的。

请注意,策略和Taps也可以通过REST API实时维护。

version: "1.0" visor: # 可选定义全局配置(参见命令行选项) config: verbose: true # 可选定义taps taps: default_pcap: input_type: pcap config: iface: eth0 filter: bpf: "port 53" unix_dnstap: input_type: dnstap config: socket: "/tmp/dnstap.sock" tcp_dnstap: input_type: dnstap config: tcp: "127.0.0.1:53053" # 可选定义策略 policies: mysocket: kind: collection input: tap: unix_dnstap input_type: dnstap handlers: modules: default_net: type: net default_dns: type: dns config: only_qname_suffix: - ".google.com" - ".ns1.com" mytcp: kind: collection input: tap: tcp_dnstap input_type: dnstap handlers: modules: default_net: type: net default_dns: type: dns

如果在Docker容器中运行,你必须将配置文件挂载到容器中。例如,如果配置文件在主机上的路径为/local/pktvisor/agent.yaml,你可以通过以下命令将其挂载到容器中并使用:

docker run -v /local/pktvisor:/usr/local/pktvisor/ --net=host orbcommunity/pktvisor pktvisord --config /usr/local/pktvisor/agent.yaml --admin-api

命令行UI使用

命令行UI(pktvisor-cli)直接连接到pktvisord代理以可视化实时流摘要,默认为滑动5分钟时间窗口。它还可以连接到远程主机上运行的代理。

docker run --rm orbcommunity/pktvisor pktvisor-cli -h
./pktvisor-x86_64.AppImage pktvisor-cli -h

用法:
  pktvisor-cli [-p 端口] [-H 主机]
  pktvisor-cli -h
  pktvisor-cli --version
选项:
  -p 端口               在指定端口查询pktvisord指标网络服务器 [默认:10853]
  -H 主机               在指定主机查询pktvisord指标网络服务器 [默认:localhost]
  -P 策略               要查询的pktvisor策略 [默认:default]
  --tls                 使用TLS与pktvisord指标网络服务器通信
  --tls-noverify        不验证TLS证书
  -h                    显示此帮助信息
  --version             显示客户端版本

### 文件分析(pcap和dnstap)

`pktvisor-reader`是一个可以静态分析预先录制的数据包捕获和dnstap文件的工具。

pcap文件可以来自多个源,其中最著名的是[tcpdump](https://www.tcpdump.org/)。Dnstap文件可以由支持dnstap日志记录的大多数DNS服务器软件生成,可以直接生成或使用[golang-dnstap](https://github.com/dnstap/golang-dnstap)等工具生成。

两者都采用与`pktvisord`进行实时捕获相同的许多选项,并进行相同的分析。pcap文件可能包含流量捕获数据。

docker run --rm orbcommunity/pktvisor pktvisor-reader --help


```shell
./pktvisor-x86_64.AppImage pktvisor-reader --help
用法:
  pktvisor-reader [选项] 文件
  pktvisor-reader (-h | --help)
  pktvisor-reader --version

总结网络(pcap、dnstap)文件。结果将以JSON格式写入stdout,而控制台日志将打印到stderr。

选项:
  -i 输入              输入类型(pcap|dnstap|sflow|netflow)。如果未设置,默认为pcap输入
  --max-deep-sample N  深度采样的流量不超过N%(0到100之间的整数)[默认:100]
  --periods P          在内存中保留P个60秒时间段的历史记录。使用1来汇总所有数据。[默认:5]
  -h --help            显示此帮助信息
  --version            显示版本
  -v                   详细日志输出
  -b BPF               使用给定的BPF字符串过滤数据包
  --geo-city 文件      用于IP到地理位置映射的GeoLite2 City数据库(如果启用)
  --geo-asn 文件       用于IP到ASN映射的GeoLite2 ASN数据库(如果启用)
  -H 主机规范          指定要视为主机的子网(逗号分隔),采用CIDR形式。在实时捕获中,这可能会从捕获设备自动检测,
                       但对于pcap文件必须指定。示例:"10.0.1.0/24,10.0.2.1/32,2001:db8::/64"
                       为实时捕获指定此项将追加到任何自动检测结果。

您可以通过传递引用包含pcap文件的目录的卷来使用Docker容器。标准输出将包含JSON摘要输出,您可以捕获或通过管道传递到其他工具,例如:

$ docker run --rm -v /pktvisor/src/tests/fixtures:/pcaps orbcommunity/pktvisor pktvisor-reader /pcaps/dns_ipv4_udp.pcap | jq .

[2021-03-11 18:45:04.572] [pktvisor] [info] 加载输入插件:PcapInputModulePlugin dev.visor.module.input/1.0
[2021-03-11 18:45:04.573] [pktvisor] [info] 加载处理程序插件:DnsHandler dev.visor.module.handler/1.0
[2021-03-11 18:45:04.573] [pktvisor] [info] 加载处理程序插件:NetHandler dev.visor.module.handler/1.0
...
processed 140 packets
{
  "5m": {
    "dns": {
      "cardinality": {
        "qname": 70
      },
      "period": {
        "length": 6,
        "start_ts": 1567706414
      },
      "top_nxdomain": [],
      "top_qname2": [
        {
          "estimate": 140,
          "name": ".test.com"
        }
      ],
...     

AppImage可以像任何普通二进制文件一样访问本地文件:

$ ./pktvisor-x86_64.AppImage pktvisor-reader /pcaps/dns_ipv4_udp.pcap | jq .

[2021-03-11 18:45:04.572] [pktvisor] [info] 加载输入插件:PcapInputModulePlugin dev.visor.module.input/1.0
[2021-03-11 18:45:04.573] [pktvisor] [info] 加载处理程序插件:DnsHandler dev.visor.module.handler/1.0
[2021-03-11 18:45:04.573] [pktvisor] [info] 加载处理程序插件:NetHandler dev.visor.module.handler/1.0
...
processed 140 packets
{
  "5m": {
    "dns": {
      "cardinality": {
        "qname": 70
      },
      "period": {
        "length": 6,
        "start_ts": 1567706414
      },
      "top_nxdomain": [],
      "top_qname2": [
        {
          "estimate": 140,
          "name": ".test.com"
        }
      ],
...     

指标收集

从REST API获取指标

可以通过REST API以JSON格式从代理获取指标。

对于大多数用例,您需要每分钟收集一次最近的完整1分钟桶:

curl localhost:10853/api/v1/metrics/bucket/1

这可以使用telegraf标准HTTP插件等工具完成。 default策略的telegraf配置片段示例: [输入] [[inputs.http]] urls = [ "http://127.0.0.1:10853/api/v1/metrics/bucket/1",] interval = "60s" data_format = "json" json_query = "1m" json_time_key = "period_start_ts" json_time_format = "unix" json_string_fields = [ "dns_", "packets_", "dhcp_", "pcap_", ]

[inputs.http.tags] t = "pktvisor" interval = "60"


#### Prometheus 指标

`pktvisord` 原生支持 Prometheus。可以在标准的 `/metrics` 端点收集 `default` 策略指标,或使用 `/api/v1/policies/__all/metrics/prometheus` 收集所有策略的指标。

```shell
$ ./pktvisor-x86_64.AppImage pktvisord -d eth0
$ curl localhost:10853/metrics
# HELP dns_wire_packets_udp 通过 UDP 接收的 DNS 报文总数(入站和出站)
# TYPE dns_wire_packets_udp gauge
dns_wire_packets_udp{instance="node",policy="default"} 28
# HELP dns_rates_total 所有 DNS 报文的速率(入站和出站合计)每秒
# TYPE dns_rates_total summary
dns_rates_total{instance="node",policy="default",quantile="0.5"} 0
dns_rates_total{instance="node",policy="default",quantile="0.9"} 4
dns_rates_total{instance="node",policy="default",quantile="0.95"} 4
...

您可以通过传递 --prom-instance ID 来设置 instance 标签。

如果您对使用远程写入进行集中收集感兴趣,包括写入云提供商,有一个可用的 docker 镜像可以轻松实现。更多信息请参见 centralized_collection/prometheus

另外,请查看 getorb.io 以了解如何将 pktvisor 代理连接到 Orb 可观测性平台。

REST API

REST API 文档以 OpenAPI 格式提供。

请注意,管理控制平面 API(--admin-api)目前正在进行大量迭代,因此尚未记录。如果您有需要使用管理 API 的用例,请联系我们进行讨论。

高级代理示例

使用 Docker 启动收集器代理,支持 MaxmindDB GeoIP/GeoASN,并使用 Host 选项识别入站和出站流量:

docker run --rm --net=host -d \
    --mount type=bind,source=/opt/geo,target=/geo \
    orbcommunity/pktvisor pktvisord \
    --geo-city /geo/GeoIP2-City.mmdb \
    --geo-asn /geo/GeoIP2-ISP.mmdb \
    -H 192.168.0.54/32,127.0.0.1/32 \
    eth0

使用 AppImage 执行相同的命令并将日志记录到 syslog:

./pktvisor-x86_64.AppImage pktvisord -d --syslog \
    --geo-city /geo/GeoIP2-City.mmdb \
    --geo-asn /geo/GeoIP2-ISP.mmdb \
    -H 192.168.0.54/32,127.0.0.1/32 \
    eth0

更多文档

我们认识到一流文档的价值,正在努力编写更多文档,包括扩展和更新 REST API 文档、面向输入和处理模块开发者的内部文档(以及那些想为 pktvisor 做贡献的人),以及用户手册。

如果您对安装、使用或开发有任何问题,请联系我们

联系我们

我们非常希望听到您的使用案例、功能请求和其他反馈!

构建

主要代码库使用清晰、现代的 C++ 编写。pktvisor-cli 命令行界面使用 Go 编写。构建系统需要 CMake 和 Conan 包管理系统。

pktvisor 遵循语义化版本

pktvisor 在 Linux 和 OSX 上开发和测试。Windows 版本正在开发中。已知 x86_64 和 ARM 架构均可运行。

依赖项

  • Conan 1.X C++ 包管理器
  • CMake >= 3.13 (cmake)
  • 支持 C++17 的 C++ 编译器

有关 conan 包含的包列表,请参见 conanfile.py

构建

一般构建步骤如下:

# 克隆仓库
git clone https://github.com/orb-community/pktvisor.git
cd pktvisor
mkdir build && cd build

# 配置并处理依赖项
cmake -DCMAKE_BUILD_TYPE=Release ..

# 构建并运行测试
make all test

# 二进制文件将位于 build/bin 目录中
bin/pktvisord --help

由于开发环境可能差异很大,请参考 Dockerfile持续集成构建文件

贡献

感谢您考虑贡献!我们将扩展此部分,提供更详细的信息来指导您完成这个过程。 请将拉取请求提交到 develop 分支。如果您考虑进行较大规模的贡献,请联系我们讨论您的设计方案。

有关更多信息,请参阅 NS1 贡献指南

许可证

本代码根据 Mozilla 公共许可证 2.0 发布。您可以在 LICENSE 文件中找到相关条款和条件。

编辑推荐精选

Vora

Vora

免费创建高清无水印Sora视频

Vora是一个免费创建高清无水印Sora视频的AI工具

Refly.AI

Refly.AI

最适合小白的AI自动化工作流平台

无需编码,轻松生成可复用、可变现的AI自动化工作流

酷表ChatExcel

酷表ChatExcel

大模型驱动的Excel数据处理工具

基于大模型交互的表格处理系统,允许用户通过对话方式完成数据整理和可视化分析。系统采用机器学习算法解析用户指令,自动执行排序、公式计算和数据透视等操作,支持多种文件格式导入导出。数据处理响应速度保持在0.8秒以内,支持超过100万行数据的即时分析。

AI工具酷表ChatExcelAI智能客服AI营销产品使用教程
TRAE编程

TRAE编程

AI辅助编程,代码自动修复

Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。

AI工具TraeAI IDE协作生产力转型热门
AIWritePaper论文写作

AIWritePaper论文写作

AI论文写作指导平台

AIWritePaper论文写作是一站式AI论文写作辅助工具,简化了选题、文献检索至论文撰写的整个过程。通过简单设定,平台可快速生成高质量论文大纲和全文,配合图表、参考文献等一应俱全,同时提供开题报告和答辩PPT等增值服务,保障数据安全,有效提升写作效率和论文质量。

AI辅助写作AI工具AI论文工具论文写作智能生成大纲数据安全AI助手热门
博思AIPPT

博思AIPPT

AI一键生成PPT,就用博思AIPPT!

博思AIPPT,新一代的AI生成PPT平台,支持智能生成PPT、AI美化PPT、文本&链接生成PPT、导入Word/PDF/Markdown文档生成PPT等,内置海量精美PPT模板,涵盖商务、教育、科技等不同风格,同时针对每个页面提供多种版式,一键自适应切换,完美适配各种办公场景。

AI办公办公工具AI工具博思AIPPTAI生成PPT智能排版海量精品模板AI创作热门
潮际好麦

潮际好麦

AI赋能电商视觉革命,一站式智能商拍平台

潮际好麦深耕服装行业,是国内AI试衣效果最好的软件。使用先进AIGC能力为电商卖家批量提供优质的、低成本的商拍图。合作品牌有Shein、Lazada、安踏、百丽等65个国内外头部品牌,以及国内10万+淘宝、天猫、京东等主流平台的品牌商家,为卖家节省将近85%的出图成本,提升约3倍出图效率,让品牌能够快速上架。

iTerms

iTerms

企业专属的AI法律顾问

iTerms是法大大集团旗下法律子品牌,基于最先进的大语言模型(LLM)、专业的法律知识库和强大的智能体架构,帮助企业扫清合规障碍,筑牢风控防线,成为您企业专属的AI法律顾问。

SimilarWeb流量提升

SimilarWeb流量提升

稳定高效的流量提升解决方案,助力品牌曝光

稳定高效的流量提升解决方案,助力品牌曝光

Sora2视频免费生成

Sora2视频免费生成

最新版Sora2模型免费使用,一键生成无水印视频

最新版Sora2模型免费使用,一键生成无水印视频

下拉加载更多