golang高性能可扩展的IPFIX/sFlow/Netflow采集器插件vFlow的使用
以下是关于Golang高性能可扩展的IPFIX/sFlow/Netflow采集器插件vFlow的使用内容:
vFlow简介
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
贡献指南
欢迎任何形式的贡献:
- 在GitHub上fork项目
- 创建新分支
- 提交更改到新分支
- 发送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主要特点
- 高性能:采用零拷贝技术和高并发处理
- 多协议支持:支持NetFlow v5/v9, IPFIX和sFlow
- 可扩展架构:模块化设计,易于扩展
- 多种输出:支持Kafka、InfluxDB、Elasticsearch等
- 低资源消耗:内存占用小,CPU利用率高
架构概述
vFlow采用生产者-消费者模型,主要包含以下组件:
- 接收器(Receiver):负责接收原始流数据
- 解码器(Decoder):将原始数据解码为结构化格式
- 处理器(Processor):对解码后的数据进行处理
- 发布器(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()
}
性能优化建议
- 调整工作线程数:根据CPU核心数设置
workers
参数 - 合理设置队列大小:
queue-size
应根据流量大小调整 - 批量处理:对于Kafka等输出,合理设置
batch-size
和batch-timeout
- 内存优化:调整
msize
参数以适应最大预期的数据包大小
监控与管理
vFlow支持通过HTTP接口进行监控:
# 获取运行状态
curl http://localhost:8081/stats
# 获取版本信息
curl http://localhost:8081/version
总结
vFlow是一个功能强大且灵活的网络流数据采集解决方案,特别适合需要处理高流量网络环境的场景。其模块化设计使得它能够轻松集成到现有的监控和分析系统中。通过合理的配置和扩展,可以满足各种规模的网络流量分析需求。