Project Icon

pktvisor

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

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

pktvisor

构建状态 CodeQL CodeCov

简介  •   开始使用  •   文档  •   构建  •   贡献  •   联系我们

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 文件中找到相关条款和条件。

项目侧边栏1项目侧边栏2
推荐项目
Project Cover

豆包MarsCode

豆包 MarsCode 是一款革命性的编程助手,通过AI技术提供代码补全、单测生成、代码解释和智能问答等功能,支持100+编程语言,与主流编辑器无缝集成,显著提升开发效率和代码质量。

Project Cover

AI写歌

Suno AI是一个革命性的AI音乐创作平台,能在短短30秒内帮助用户创作出一首完整的歌曲。无论是寻找创作灵感还是需要快速制作音乐,Suno AI都是音乐爱好者和专业人士的理想选择。

Project Cover

有言AI

有言平台提供一站式AIGC视频创作解决方案,通过智能技术简化视频制作流程。无论是企业宣传还是个人分享,有言都能帮助用户快速、轻松地制作出专业级别的视频内容。

Project Cover

Kimi

Kimi AI助手提供多语言对话支持,能够阅读和理解用户上传的文件内容,解析网页信息,并结合搜索结果为用户提供详尽的答案。无论是日常咨询还是专业问题,Kimi都能以友好、专业的方式提供帮助。

Project Cover

阿里绘蛙

绘蛙是阿里巴巴集团推出的革命性AI电商营销平台。利用尖端人工智能技术,为商家提供一键生成商品图和营销文案的服务,显著提升内容创作效率和营销效果。适用于淘宝、天猫等电商平台,让商品第一时间被种草。

Project Cover

吐司

探索Tensor.Art平台的独特AI模型,免费访问各种图像生成与AI训练工具,从Stable Diffusion等基础模型开始,轻松实现创新图像生成。体验前沿的AI技术,推动个人和企业的创新发展。

Project Cover

SubCat字幕猫

SubCat字幕猫APP是一款创新的视频播放器,它将改变您观看视频的方式!SubCat结合了先进的人工智能技术,为您提供即时视频字幕翻译,无论是本地视频还是网络流媒体,让您轻松享受各种语言的内容。

Project Cover

美间AI

美间AI创意设计平台,利用前沿AI技术,为设计师和营销人员提供一站式设计解决方案。从智能海报到3D效果图,再到文案生成,美间让创意设计更简单、更高效。

Project Cover

AIWritePaper论文写作

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

投诉举报邮箱: service@vectorlightyear.com
@2024 懂AI·鲁ICP备2024100362号-6·鲁公网安备37021002001498号