文档章节

Netflow v9示例

a
 alex_wei
发布于 2013/08/05 13:00
字数 380
阅读 128
收藏 0

因工作需要对Netflow v9协议进行了一些分析,其灵活的模板机制令人印象深刻。本着无代码无真相的原则,使用libpcap库做了一个简单的demo示例,其中对Netflow v9中需要获取的信息做了如下定义:

typedef struct _netflow_v9_record {
	u_int8_t ip_ver;
	union {
		u_int32_t v4_srcaddr;
		struct in6_addr v6_srcaddr;
	} srcaddr;
	union {
		u_int32_t v4_dstaddr;
		struct in6_addr v6_dstaddr;
	} dstaddr;
	union {
		u_int32_t v4_nexthop;
		struct in6_addr v6_nexthop;
	} nexthop;
	u_int32_t orig_pkts;
	u_int32_t orig_bytes;
	u_int32_t reply_pkts;
	u_int32_t reply_bytes;
	u_int32_t first;
	u_int32_t last;
	u_int16_t srcport;
	u_int16_t dstport;
	u_int16_t icmp_type;
	u_int16_t src_vlan;
	u_int16_t dst_vlan;
	u_int8_t src_mac[6];
	u_int8_t dst_mac[6];
	u_int8_t prot;
	u_int8_t tos;
} __attribute__((__packed__)) netflow_v9_record;
仿netfilter-conntrack中tuple机制,做链接管理结构如下(未单独提取tuple):
struct link_info_t {
	struct hlist_node link;
	netflow_v9_record record;
	/* there will be something else */
};
static struct link_info_t tmp_link;

static struct hlist_head link_table[TABLE_SIZE];

static inline uint16_t hash_ip_port(struct link_info_t link)
{
	return ((link.record.dstaddr.v4_dstaddr ^ link.record.srcaddr.v4_srcaddr) ^ \
		(link.record.dstport ^ link.record.srcport)) & 0x1ffff;
}
因为没有单独将tuple提取出来,且将ORIGINAL与REPLY做为同一个tuple以标示同一条连接,所以对连接的判断和统计繁琐了一些:
hlist_for_each_entry(cur_link, pos, head, link) {
			if (cur_link->record.srcaddr.v4_srcaddr == tmp_link.record.srcaddr.v4_srcaddr && \
			    cur_link->record.dstaddr.v4_dstaddr == tmp_link.record.dstaddr.v4_dstaddr && \
			    cur_link->record.srcport == tmp_link.record.srcport && \
			    cur_link->record.dstport == tmp_link.record.dstport) {
				cur_link->record.orig_pkts++;
				cur_link->record.orig_bytes += len;
				flag = 1;
				break;
			} else if (cur_link->record.srcaddr.v4_srcaddr == tmp_link.record.dstaddr.v4_dstaddr && \
			    cur_link->record.dstaddr.v4_dstaddr == tmp_link.record.srcaddr.v4_srcaddr && \
			    cur_link->record.srcport == tmp_link.record.dstport && \
			    cur_link->record.dstport == tmp_link.record.srcport) {
				cur_link->record.reply_pkts++;
				cur_link->record.reply_bytes += len;
				flag = 1;
				break;
			}
		}
gen_nfv9模块负责构造、发送数据包,作为示例,仅手工构造了包含两个字段信息的template与数据信息,由lo:9999发送。

(不能添加附件??...:-(...)




© 著作权归作者所有

共有 人打赏支持
a
粉丝 2
博文 6
码字总数 2777
作品 0
海淀
程序员
私信 提问
NFDUMP

netflow的紀錄工具, 可收集netflow資料及紀錄相關過程等, 支援netflow第五及第七版 nfdump is a set of tools to collect and process netflow data. It's fast and has a powerful filter ......

匿名
2009/08/10
2.6K
0
网络监视工具--pmacct

pmacct是一个被动的网络监视工具,用来衡量,帐户,分类,汇总,和导出的IPv4和IPv6流量。可插入的架构使数据收集非常灵活,存储到内存中的表或SQL(MySQL和SQLite的,PostgreSQL)的数据库和...

匿名
2009/12/22
2.7K
0
pmacct 1.5.0 RC2 发布,网络监视工具

pmacct 1.5.0 RC2 发布,pmacct是一个被动的网络监视工具,用来衡量,帐户,分类,汇总,和导出的IPv4和IPv6流量。可插入的架构使数据收集非常灵活,存储到内存中的 表或SQL(MySQL和SQLite的...

oschina
2014/04/18
772
0
pmacct 更新为 0.14.1,网络监视工具

pmacct是一个被动的网络监视工具,用来衡量,帐户,分类,汇总,和导出的IPv4和IPv6流量。可插入的架构使数据收集非常灵活,存储到内存中的 表或SQL(MySQL和SQLite的,PostgreSQL)的数据库...

阿笨哥
2012/10/17
807
3
Logstash 6.5.0 发布,开源服务端数据处理流程

Logstash 6.5.0 已发布,Logstash 是开源的服务器端数据处理管道,能够同时从多个来源采集数据,转换数据,然后将数据发送到你最喜欢的“存储库”中。 更新内容: BUGFIX: Count unused spa...

淡漠悠然
2018/11/15
714
0

没有更多内容

加载失败,请刷新页面

加载更多

如何在 Linux 系统查询机器最近重启时间

在你的 Linux 或类 UNIX 系统中,你是如何查询系统上次重新启动的日期和时间?怎样显示系统关机的日期和时间? last 命令不仅可以按照时间从近到远的顺序列出该会话的特定用户、终端和主机名...

来来来来来
32分钟前
0
0
Redis协议是什么样的

前言 我们用过很多redis的客户端,有没有相过自己撸一个redis客户端? 其实很简单,基于socket,监听6379端口,解析数据就可以了。 redis协议 解析数据的过程主要依赖于redis的协议了。 我们...

春哥大魔王的博客
49分钟前
2
0
乱入Linux界的我是如何学习的

欢迎来到建哥学Linux,咳!咳!咳!开个玩笑哈,我是一个IT男,IT界的入门选手,正在学习Linux。 在之前,一直想进军IT界,学习IT技术,但是苦于没有人指导,也不知道学什么,最开始我自己在...

linuxCool
今天
1
0
携程Apollo统一配置中心的搭建和使用(java)

一.Apollo配置中心介绍 1、What is Apollo 1.1 Apollo简介 Apollo(阿波罗)是携程框架部门研发的开源配置管理中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到...

morpheusWB
今天
1
0
远程获得的有趣的linux命令

使用这些工具从远程了解天气、阅读资料等。 我们即将结束为期 24 天的 Linux 命令行玩具日历。希望你有一直在看,如果没有,请回到开始,从头看过来。你会发现 Linux 终端有很多游戏、消遣和...

Linux就该这么学
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部