golang高性能可扩展的IPFIX/sFlow/Netflow采集器插件vFlow的使用

以下是关于Golang高性能可扩展的IPFIX/sFlow/Netflow采集器插件vFlow的使用内容:

vFlow简介

vFlow logo

vFlow是一个高性能、可扩展且可靠的IPFIX、sFlow和Netflow采集器,用纯Golang编写。

主要特性

  • IPFIX RFC7011采集器
  • sFlow v5原始头/计数器采集器
  • Netflow v5采集器
  • Netflow v9采集器
  • 解码sFlow原始头L2/L3/L4
  • 支持输出到Apache Kafka、NSQ、NATS
  • 支持IPv4和IPv6
  • Prometheus和RESTful API监控

解码数据示例

IPFIX数据

{
  "AgentID":"192.168.21.15",
  "Header":{
    "Version":10,
    "Length":420,
    "ExportTime":1483484642,
    "SequenceNo":1434533677,
    "DomainID":32771
  },
  "DataSets":[[
    {"I":8,"V":"192.16.28.217"},
    {"I":12,"V":"180.10.210.240"},
    {"I":5,"V":2},
    {"I":4,"V":6},
    {"I":7,"V":443},
    {"I":11,"V":64381},
    {"I":32,"V":0},
    {"I":10,"V":811},
    {"I":58,"V":0},
    {"I":9,"V":24},
    {"I":13,"V":20},
    {"I":16,"V":4200000000},
    {"I":17,"V":27747},
    {"I":15,"V":"180.105.10.210"},
    {"I":6,"V":"0x10"},
    {"I":14,"V":1113},
    {"I":1,"V":22500},
    {"I":2,"V":15},
    {"I":52,"V":63},
    {"I":53,"V":63},
    {"I":152,"V":1483484581770},
    {"I":153,"V":1483484622384},
    {"I":136,"V":2},
    {"I":243,"V":0},
    {"I":245,"V":0}
  ]]
}

sFlow数据

{
  "Version":5,
  "IPVersion":1,
  "AgentSubID":5,
  "SequenceNo":37591,
  "SysUpTime":3287084017,
  "SamplesNo":1,
  "Samples":[{
    "SequenceNo":1530345639,
    "SourceID":0,
    "SamplingRate":4096,
    "SamplePool":1938456576,
    "Drops":0,
    "Input":536,
    "Output":728,
    "RecordsNo":3,
    "Records":{
      "ExtRouter":{
        "NextHop":"115.131.251.90",
        "SrcMask":24,
        "DstMask":14
      },
      "ExtSwitch":{
        "SrcVlan":0,
        "SrcPriority":0,
        "DstVlan":0,
        "DstPriority":0
      },
      "RawHeader":{
        "L2":{
          "SrcMAC":"58:00:bb:e7:57:6f",
          "DstMAC":"f4:a7:39:44:a8:27",
          "Vlan":0,
          "EtherType":2048
        },
        "L3":{
          "Version":4,
          "TOS":0,
          "TotalLen":1452,
          "ID":13515,
          "Flags":0,
          "FragOff":0,
          "TTL":62,
          "Protocol":6,
          "Checksum":8564,
          "Src":"10.1.8.5",
          "Dst":"161.140.24.181"
        },
        "L4":{
          "SrcPort":443,
          "DstPort":56521,
          "DataOffset":5,
          "Reserved":0,
          "Flags":16
        }
      }
    }
  }],
  "IPAddress":"192.168.10.0",
  "ColTime":1646157296
}

安装与使用

构建

go get github.com/EdgeCast/vflow/vflow
cd $GOPATH/src/github.com/EdgeCast/vflow
make build
# 或者
cd vflow; go build

配置

安装后需要配置以下文件:

/etc/vflow/vflow.conf
/etc/vflow/mq.conf

启动服务

service vflow start

Docker运行示例

docker run -d -p 2181:2181 -p 9092:9092 spotify/kafka
docker run -d -p 4739:4739 -p 4729:4729 -p 6343:6343 -p 8081:8081 -e VFLOW_KAFKA_BROKERS="172.17.0.1:9092" mehrdadrad/vflow

Kubernetes部署

kubectl apply -f https://github.com/EdgeCast/vflow/blob/master/kubernetes/deploy.yaml

支持的平台

  • Linux
  • Windows

许可证

Apache License, Version 2.0

贡献指南

欢迎任何形式的贡献:

  1. 在GitHub上fork项目
  2. 创建新分支
  3. 提交更改到新分支
  4. 发送pull request

更多关于golang高性能可扩展的IPFIX/sFlow/Netflow采集器插件vFlow的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang高性能可扩展的IPFIX/sFlow/Netflow采集器插件vFlow的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


vFlow: 高性能可扩展的IPFIX/sFlow/Netflow采集器插件

vFlow是一个用Go语言编写的高性能网络流数据(IPFIX/sFlow/Netflow)采集器,具有高度可扩展性和模块化设计。下面我将详细介绍vFlow的特点、架构和使用方法。

vFlow主要特点

  1. 高性能:采用零拷贝技术和高并发处理
  2. 多协议支持:支持NetFlow v5/v9, IPFIX和sFlow
  3. 可扩展架构:模块化设计,易于扩展
  4. 多种输出:支持Kafka、InfluxDB、Elasticsearch等
  5. 低资源消耗:内存占用小,CPU利用率高

架构概述

vFlow采用生产者-消费者模型,主要包含以下组件:

  1. 接收器(Receiver):负责接收原始流数据
  2. 解码器(Decoder):将原始数据解码为结构化格式
  3. 处理器(Processor):对解码后的数据进行处理
  4. 发布器(Publisher):将处理后的数据发送到目标系统

安装vFlow

# 从源码安装
go get github.com/VerizonDigital/vflow

# 或使用预编译二进制
wget https://github.com/VerizonDigital/vflow/releases/download/v0.9.4/vflow-linux-amd64
chmod +x vflow-linux-amd64

基本配置示例

创建配置文件config.yml:

system:
  pid: "./vflow.pid"
  log: "stdout"
  log-level: "info"

netflow:
  enabled: true
  port: 2055
  workers: 4
  queue-size: 100000
  msize: 8192
  verbose: false

ipfix:
  enabled: true
  port: 4739
  workers: 4
  queue-size: 100000
  msize: 8192
  verbose: false

sflow:
  enabled: true
  port: 6343
  workers: 4
  queue-size: 100000
  msize: 8192
  verbose: false

kafka:
  enabled: true
  brokers: ["localhost:9092"]
  topic: "vflow"
  required-acks: 1
  compression: "none"
  max-retry: 3
  flush-frequency: 5s
  batch-size: 1000
  batch-timeout: 60s
  tls-enabled: false

基本使用示例

package main

import (
	"log"
	"time"

	"github.com/VerizonDigital/vflow"
)

func main() {
	// 加载配置
	cfg, err := vflow.LoadConfig("config.yml")
	if err != nil {
		log.Fatal(err)
	}

	// 创建vFlow实例
	vf := vflow.New(cfg)

	// 启动vFlow
	if err := vf.Start(); err != nil {
		log.Fatal(err)
	}

	// 运行10分钟后关闭
	time.Sleep(10 * time.Minute)
	vf.Shutdown()
}

自定义处理器示例

vFlow允许添加自定义处理器来处理流数据:

package main

import (
	"log"
	"time"

	"github.com/VerizonDigital/vflow"
	"github.com/VerizonDigital/vflow/processor"
)

// 自定义处理器
type MyProcessor struct{}

func (p *MyProcessor) Process(msg *processor.Message) {
	log.Printf("Received flow: %+v", msg)
}

func main() {
	cfg, err := vflow.LoadConfig("config.yml")
	if err != nil {
		log.Fatal(err)
	}

	vf := vflow.New(cfg)
	
	// 注册自定义处理器
	vf.RegisterProcessor("netflow", &MyProcessor{})
	vf.RegisterProcessor("ipfix", &MyProcessor{})
	vf.RegisterProcessor("sflow", &MyProcessor{})

	if err := vf.Start(); err != nil {
		log.Fatal(err)
	}

	time.Sleep(10 * time.Minute)
	vf.Shutdown()
}

性能优化建议

  1. 调整工作线程数:根据CPU核心数设置workers参数
  2. 合理设置队列大小queue-size应根据流量大小调整
  3. 批量处理:对于Kafka等输出,合理设置batch-sizebatch-timeout
  4. 内存优化:调整msize参数以适应最大预期的数据包大小

监控与管理

vFlow支持通过HTTP接口进行监控:

# 获取运行状态
curl http://localhost:8081/stats

# 获取版本信息
curl http://localhost:8081/version

总结

vFlow是一个功能强大且灵活的网络流数据采集解决方案,特别适合需要处理高流量网络环境的场景。其模块化设计使得它能够轻松集成到现有的监控和分析系统中。通过合理的配置和扩展,可以满足各种规模的网络流量分析需求。

回到顶部