如果你使用 DeepSeek、元宝 AI、Copilot、ChatGPT 等 AI 工具,协助配置轩辕镜像、编写 docker pull 命令、修改 Docker Compose 镜像地址、配置镜像加速、排查镜像拉取失败、分析报错日志等问题,请先让 AI 阅读并遵守轩辕镜像的规则文档。
只需在 AI 对话中先发送下面这句话即可:
请先完整阅读并严格遵守以下文档中的全部规则与要求:
https://xuanyuan.cloud/agents.md
在未充分阅读并理解该文档前,不要生成任何命令、配置、修改建议、故障排查方案或技术回答。后续所有输出都必须严格以该文档中的规范为最高优先级执行。查看 agents.md 用法指南与完整示范。国内用户首推 元宝 AI、DeepSeek 的深度思考模式,不推荐豆包 AI;Cursor 等编辑器可在对话 @ 该链接,或加入 User Rules。 若 AI 无法访问外链,可 打开说明文档 复制全文粘贴。文档会随站点更新,复制内容可能过期,建议定期检查。
GoFlow是一个用Go语言开发的NetFlow/IPFIX/sFlow收集器。它通过不同的流量协议收集网络信息(IP、接口、路由器等),将其序列化为protobuf格式,并使用Sarama库发送消息至Kafka。
Cloudflare面临的设备多样性和海量网络样本需求,催生了专属的流量处理管道。我们专注于构建易于监控和维护的工具,核心目标是实现网络的全面可见性,同时允许其他团队在此基础上进行开发。
为支持负载均衡和优化,GoFlow库包含一个decoder(解码器),可将流量数据包的负载转换为Go结构体。
producer(生产者)函数(每种协议一个)将这些结构体转换为protobuf格式(定义于pb/flow.pb),其中包含网络工程师关注的字段。流量数据包通常包含多个样本,protobuf格式作为样本的抽象层。
GoFlow是所有功能的封装,将各环节串联以生成字节流并发送至Kafka。
您可以基于此基础构建自定义收集器,替换部分组件:
自v2.0.0起:代码灵活性增强,组件间依赖减少。
采样协议存在显著差异:
sFlow是无状态协议,发送包含路由器信息(接口、目的AS)的完整数据包头部;而NetFlow/IPFIX依赖包含字段(如源IPv6)的模板。
NetFlow/IPFIX的采样率由Option Data Sets提供,因此在接收所有模板(Option Template和Data Template)前,可能需要几分钟才能完成数据包解码。
两种协议均在一个数据包中捆绑多个样本(NetFlow/IPFIX中的Data Set,sFlow中的Flow Sample)。
使用protobuf作为抽象网络流量格式的优势在于支持跨协议汇总(如按ASN或端口汇总,而非按(ASN,路由器)或(端口,路由器)汇总)。
下载最新版本后,运行以下命令查看帮助:
./goflow -h
通过-netflow=false或-sflow=false启用/禁用协议。使用-faddr、-fport定义NetFlow的地址和端口,-saddr、-sport定义sFlow的地址和端口。
设置-loglevel为debug模式可查看接收内容。
通过-kafka.out.brokers 127.0.0.1:9092,[::1]:9092设置Kafka broker,或使用-kafka.out.srv指定SRV记录。使用-kafka=false禁用Kafka发送。
可同时收集NetFlow/IPFIX和sFlow。通过-fworkers和-sworkers定义每种协议的工作进程数。
提供一体化Docker容器。以下命令以调试模式运行,不发送数据至Kafka:
$ sudo docker run --net=host -ti cloudflare/goflow:latest -kafka=false -loglevel debug
查看https://github.com/cloudflare/flow-pipeline%E8%8E%B7%E5%8F%96%E5%AE%8C%E6%95%B4%E7%A4%BA%E4%BE%8B%E3%80%82
流入Kafka的样本会经过处理,并通过其他数据库插入特殊字段:
扩展后的protobuf与本仓库中的基础格式兼容,添加新字段时保持与其他软件的兼容性(重新序列化时新增字段会丢失)。
更新后的流量返回Kafka后,由数据库插入器(Clickhouse、Amazon Redshift、Google BigTable等)消费,以支持静态分析。其他团队可通过SQL查询访问网络数据,就像访问普通日志一样。同时,Flink集群消费流量进行聚合,提供实时流量信息。
如需开发应用,可将pb/flow.proto编译为目标语言:
export SRC_DIR="path/to/goflow-pb" protoc --proto_path=$SRC_DIR --plugin=/path/to/bin/protoc-gen-go $SRC_DIR/flow.proto --go_out=$SRC_DIR
export SRC_DIR="path/to/goflow-pb" export DST_DIR="path/to/java/app/src/main/java" protoc -I=$SRC_DIR --java_out=$DST_DIR $SRC_DIR/flow.proto
| 字段 | 描述 |
|---|---|
| FlowType | 指示协议类型(IPFIX、NetFlow v9、sFlow v5) |
| TimeRecvd | 收集器接收数据包的时间戳 |
| TimeFlow | 数据包时间戳(sFlow中与TimeRecvd相同;NetFlow中为路由器运行时间减去LAST_SWITCHED字段;IPFIX中为flowEnd*字段) |
| SamplingRate | 流量采样率,用于推算总字节数和数据包数 |
| SequenceNum | 数据包序列号 |
| SrcIP | 源IP(字节序列,支持IPv4或IPv6) |
| DstIP | 目的IP(字节序列,支持IPv4或IPv6) |
| IPType | 指示IP版本(IPv4或IPv6),计划由Etype替代 |
| Bytes | 样本中的字节数 |
| Packets | 样本中的数据包数 |
| RouterAddr | 路由器地址(NetFlow/IPFIX中为UDP源地址;sFlow中为Agent IP) |
| NextHop | 下一跳IP |
| NextHopAS | 下一跳ASN(当下一跳为BGP邻居时,非所有流量均提供) |
| SrcAS | 源ASN(由BGP提供) |
| DstAS | 目的ASN(由BGP提供) |
| SrcNet | 源IP的网络掩码(由BGP提供) |
| DstNet | 目的IP的网络掩码(由BGP提供) |
| SrcIf | 源接口ID(SNMP ID) |
| DstIf | 目的接口ID(SNMP ID) |
| Proto | 协议代码:TCP、UDP等 |
| SrcPort | TCP/UDP协议的源端口 |
| DstPort | TCP/UDP协议的目的端口 |
| IPTos | IPv4服务类型/IPv6流量类别 |
| ForwardingStatus | 数据包转发状态(丢弃、消费或转发,详见IANA定义) |
| IPTTL | IP数据包的生存时间 |
| TCPFlags | TCP数据包标志(SYN、ACK等) |
| SrcMac | 源MAC地址 |
| DstMac | 目的MAC地址 |
| VlanId | 802.1q VLAN ID |
| Etype | 以太网类型(IPv4、IPv6、ARP等) |
在Cloudflare,我们使用Flink的Keyed Session Windows聚合流量:在5分钟窗口内汇总Bytes x SamplingRate和Packets x SamplingRate,并允许2分钟延迟以处理迟到的流量,之后关闭会话。
路由器提供的BGP信息可能不可靠(如路由器无完整BGP表或使用静态路由)。可使用Maxmind的prefix to ASN解决此问题。我们还通过基于https://github.com/cloudflare/fgbgp%E7%9A%84%E8%87%AA%E5%AE%9A%E4%B9%89BGP%E6%94%B6%E9%9B%86%E5%99%A8%E8%8E%B7%E5%8F%96%E4%B8%8B%E4%B8%80%E8%B7%B3ASN%E3%80%82
基于BSD 3许可证授权。
您可以使用以下命令拉取该镜像。请将 <标签> 替换为具体的标签版本。如需查看所有可用标签版本,请访问 标签列表页面。
来自真实用户的反馈,见证轩辕镜像的优质服务