因工做须要对Netflow v9协议进行了一些分析,其灵活的模板机制使人印象深入。本着无代码无真相的原则,使用libpcap库作了一个简单的demo示例,其中对Netflow v9中须要获取的信息作了以下定义: node
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发送。
(不能添加附件??...:-(...) ui