本文目录导读:

pmacct 是一个网络流量监控工具,用于收集、聚合和导出网络流量数据(如 NetFlow, sFlow, IPFIX 等)以及数据包细节,它主要由两部分组成:
- pmacctd:数据包采集核心(基于 libpcap / pcap 读取数据包)。
- nfacctd / sfacctd:网络流协议收集器(接收 NetFlow, sFlow, IPFIX 等)。
下面详细介绍 pmacct 收集流量数据的主要机制和步骤。
核心收集机制
pmacct 的流量数据收集主要通过以下两种方式实现:
基于数据包捕获(使用 pmacctd)
这是最直接的收集方式,与 tcpdump 类似,但 pmacctd 能将捕获的数据包转化为聚合的流量统计信息。
- 工作原理:通过 libpcap 库(在 Linux 上常使用
AF_PACKET或PF_RING以提高性能)从网络接口抓取数据包。 - 处理流程:
- 捕获数据包。
- 解析 IP 头部(源、目标 IP、端口、协议等)、VLAN、MPLS 标签等。
- 按定义的聚合键(Aggregate Key)进行分类,按
src_host,dst_host,src_port,dst_port,proto组合成唯一的流量流。 - 累计统计信息:统计该聚合键下的数据包数量、字节数、时间戳等。
- 定期输出:按照设定的
pcap_sampling_rate或pcap_interval间隔,将内存中的聚合数据写入到指定存储(如文件、SQL 数据库、消息队列、内存表等)。
典型配置(pmacctd.conf)示例:
# 指定要监听的接口 interface: eth0 # 聚合的粒度(按源IP、目标IP、源端口、目标端口、协议聚合) aggregate: src_host, dst_host, src_port, dst_port, proto # 数据存储方式(例如输出为 CSV 文件或插入到 MySQL) # 输出到文件(文本格式,便于调试) plugins: print print_output_file: /var/log/pmacct/pmacctd.csv print_refresh_time: 300 # 每5秒输出一次(可选) print_history: 5m # 每5分钟生成一个文件 # 或者输出到 MySQL 数据库(便于分析) # plugins: mysql # sql_host: localhost # sql_user: pmacct # sql_password: password # sql_db: pmacct_db # sql_table_version: 1 # 采样率(性能调整,0表示全量捕获,100表示每100个包采1个) pcap_sampling_rate: 0
接收 NetFlow/sFlow/IPFIX 数据(使用 nfacctd 或 sfacctd)
这是更常见的被动收集方式,适合在核心交换机/路由器上部署,网络设备负责生成流记录,pmacct 负责接收汇总。
- 工作原理:
nfacctd或sfacctd在指定端口上监听 UDP 数据报(NetFlow v5/v9/IPFIX 通常端口 2055 或 9996,sFlow 通常端口 6343)。 - 处理流程:
- 接收设备发来的流记录(内置了 IP、端口、协议、时间戳、字节数、包数等)。
- 解析流格式(NetFlow / sFlow / IPFIX 各有不同字段集)。
- 根据配置文件中的
aggregate指令对接收到的流记录进行再聚合(如果需要,也可以不聚合直接传递原始流记录)。 - 将流数据输出到存储或分析后端。
典型配置(nfacctd.conf)示例:
# 监听端口(默认 NetFlow v5/v9 常用 2055) nfacctd_port: 2055 # 聚合方式(例如按源自制域、目标自制域、下一跳聚合,用于 BGP 流量分析) aggregate: src_as, dst_as, peer_src_as, peer_dst_as # 存储方式:输出到 内存哈希表(便于外部程序读取) plugins: memory memory_table_size: 128000 # 存储方式:同时输出到 MySQL plugins: mysql sql_db: pmacct_netflow sql_table_version: 1 # 如果交换机发送的是 NetFlow v9 或 IPFIX,可以开启模板自动学习 nfacctd_time_new: 300
数据聚合与存储
收集到数据后,pmacct 通过 插件 (plugins) 决定数据去向:
print插件:- 直接以文本或 CSV 格式写入文件。
- 适合测试、简单记录或小型环境。
mysql/pgsql插件:- 定期将聚合后的数据批量插入关系数据库。
- 适合构建流量报表系统、按时间查询历史流量。
memory插件:- 将数据保留在共享内存区。
- 适合需要极低延迟查询(例如实时展示 Top N 流量)的场景。
- 外部程序可以通过
pmacct -s命令或pmaqd(API守护进程)读取共享内存。
amqp/kafka插件:- 直接输出到消息队列(RabbitMQ, Kafka)。
- 适合构建大型实时流处理管道,便于对接 Elasticsearch、Spark 等。
tee插件:将流量数据转发到另一个 pmacct 实例或其他 NetFlow/sFlow 收集器。
高级功能:BGP 与 L4 过滤
- BGP 集成:
- pmacct 可以结合
pmbgpd或通过BGP daemon插件学习路由表。 - 这样,在聚合时不仅能知道 IP,还能知道该 IP 归属于哪个自治域 (AS)、哪个前缀 (prefix) 以及下一跳 (nexthop),这对于区分流量来源(本网流量 vs 互联互通流量)非常有用。
- pmacct 可以结合
- NetFlow v9 / IPFIX 自定义字段:
- 可以配置
nfacctd_aggregate来收集交换机支持的任意流字段(如 MPLS 标签、VXLAN VNI、应用层标识符等)。
- 可以配置
典型工作流程示例
假设您想收集公司出口路由器(启用 NetFlow)的所有流量,并存入数据库:
- 路由器配置:配置 NetFlow 将流导出到 pmacct 服务器 IP 的 2055 端口。
- pmacct 服务端:启动
nfacctd -f /etc/pmacct/nfacctd.conf。 - :
nfacctd_port: 2055aggregate: src_host, dst_host, src_port, dst_port, proto, src_as, dst_as(加上 AS 信息需配置 BGP 连接)plugins: mysqlsql_db: traffic_db
- 数据流向: 路由器 → UDP (2055) → nfacctd → 解析 → 按聚合键分组 → MySQL 插入。
pmacctd:用于直接抓包,适合流量采集(例如在一个服务器网卡上镜像流量)。nfacctd/sfacctd:用于接收网络设备的流,适合在大型网络中对交换机/路由器做集中式流量分析。- 核心能力:强大的聚合功能,灵活多变的输出插件,以及结合BGP实现 AS/前缀级别的流量分析。
根据您的网络环境和数据需求,选择合适的 pmacct 组件和配置文件即可。
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。