老树新芽:Windump与大数据工具结合做流量统计分析

老树新芽:Windump与大数据工具结合做流量统计分析

作者:糖果

1.背景与需求介绍

抓取流量最流行的工具就是Wireshark,在Windows上Wireshark的GUI界面很酷,但对于在linux和mac用惯了tcpdump用户来说,用命令行的tcpdump更直接便捷,Windows上有没有类似tcpdump的抓包工具呢?答案是有的,就是windump,底层是基于winpcap库的命令行工具。

大体的背景是这样的,有Windows服务器运行了一个较定制化的闭源的认证服务,因为这是一个历史遗留下来的服务,并没完备的日志输出机制,无法从现有的日志统计出用户流量数据,在服务压力大到什么程度会出现问题,从现掌握的数据中无法更好的识别异常,统计出流量分布,估算出预警的峰值,也无法可视化当前服务的状态,随着外部的关联服务的增加,服务的压力不段加大。

根据目前的现状整理出以下需求:

1.1可在不入侵代码的前题下,量化监听流量。

1.2可将流量日志数据传到大数据平台,进行非实时的统计,找出预警的阀值。

1.3.用基于winpcap自主开发的监听工具代替windump,做实时的数据分析,阀值预警、可视化负载状态。

本文侧重点是用windump和大数据graylog配合,做到前2点,第3点后继做介绍。所以,下面开始我们要接触几个软件,但不会触及到太多代码问题,软件分别windump,sidercar,nxlog,而graylog的安装使用不做具体介绍。

windump相当于linux和mac上的tcpdump,有些场景在windows平台上使用windump要比wireshark方便一些,wireshark是GUI形式的,还支持lua插件,有机会我们介绍wireshark的lua插件,windump是一个分析tcp/udp/icmp等协议数据的一个好工具,简单介绍一下使用,后期我们就是使用windump.exe这个命令行工具,分析我们应用服务器,分析我们的服务器承受压力的极限,通过压力测试脚本,分析出阀值。

2.Windump下载与使用:

我们需要先面简单的介绍一下windump是如何使用的。

 2.1. windump.exe -D

显示出所以的网卡设备。-D可以列出本机所有的网卡设备,包括VPN或是虚拟机建立的虚拟网卡。

2.2 windump.exe -i 1

监听指定网卡。-i 后面紧跟数字序号,表示本地网卡对应的序号,用 -D显示出来的序号。 -i 的后面跟的数字,就是本机网卡的序号名。

2.3 windump.exe -i 1 udp

监听指定协议数据。udp的字样是我们指定监控udp协议的流量。

 2.4. windump.exe -i 1 udp port 9999

监听指定端口数据。指定端口后就只监听流过这个端口的流量数据。

2.5. windump.exe -i 1 udp port 1234 and host192.168.0.3

监听指定主机的数据。指定IP只监听本机上和这个IP有关的数据包。

2.6.windump.exe -w cap.log -i 1 udp port 1234 and host 192.168.0.3

写流量记录到文件中。我们把监听的数据包存起来,便于以后分析。

2.7. windump.exe -f cap.log

读取文本件的流量信息。-w存起来的数据不是明文的,需要用-f显示出正常的ACSII码,让人能看懂。

下载和官方文档:

https://www.winpcap.org/windump/docs/manual.htm

3.Sidercar与Nxlog大数据工具部署

3.1.去github上下载sidecar.

collector_sidecar_installer.exe

3.2.配置sidecar的配置文件。

update_interval: 10
tls_skip_verify: false
send_status: true
list_log_files:
node_id: graylog-collector-sidecar
collector_id: file:C:\ProgramFiles\graylog\collector-sidecar\collector-id
cache_path: C:\ProgramFiles\graylog\collector-sidecar\cache
log_path: C:\ProgramFiles\graylog\collector-sidecar\logs
log_rotation_time: 86400
log_max_age: 604800
tags: [windows, iis]
backends:
    -name: nxlog
     enabled: false
     binary_path: C:\Program Files (x86)\nxlog\nxlog.exe
     configuration_path: C:\ProgramFiles\graylog\collector-sidecar\generated\nxlog.conf
server_url: http://192.168.0.3:9100/api

3.3安装后,设置服务并启动。

$ "C:\ProgramFiles\graylog\collector-sidecar\graylog-collector-sidecar.exe" -serviceinstall$ "C:\ProgramFiles\graylog\collector-sidecar\graylog-collector-sidecar.exe" -servicestart

3.4.安装nxlog。

3.5.配置nxlog.conf文件。

nxlog的配置文件存在一种配对关系,定义Input节、Output节、Route节,下面的配置文件只定义了一个Input,Output的路由对应关系,nxlog是模块化的设计,我们在in这个Input节中,用了im_file这个模块,告诉nxlog去那里读取本地日志文件,我们这定义日志文件放到c:\rlog\下的所有.log文件。

<Extension _syslog>
Module      xm_syslog
</Extension>
<Input in>
   Module    im_file 
   file    'C:\\rlog\\*.log'
   SavePos    TRUE
</Input>
 <Output out>
   Module      om_udp
   Host        192.168.1.3
   Port        521
   Exec parse_syslog(); 
</Output>
 <Route 1>
   Path        in => out
</Route>

名out的Output节定义的是输出才用什么协议,并解析成什么形式,使用om_udp模块,将本的日志文件以udp传输协议,输出成syslog形式,到指定的服务器,syslog服务器或是graylog的数据接收端口。

3.6 nxlog服务使用

3.6.1安装服务

nxlog -i

3.6.2停止服务

nxlog -s

3.6.3启动监听

nxlog -f  

看一下默认的位置nxlog的启动log。文件位置:C:\Program Files (x86)\nxlog\data

正常启动nxlog会显示下面的字样:

2017-08-16 17:02:15 INFO nxlog-ce-2.9.1716started

老树新芽:Windump与大数据工具结合做流量统计分析

如果出现这样的字段就OK了,如有其它警告和提示,可能是配置文件写错了。

4.监控与流量分析

安装这些工具后,我们就可以来监控流量了,并在graylog端做简单的可视化分析。

4.1.运行windump,监听指定IP的测试流量。

windump.exe -i 1 udp port 9999 and 192.168.0.3

老树新芽:Windump与大数据工具结合做流量统计分析

我们的测试脚本运行的IP是:192.168.0.3,所以我们要监控所有和这个IP有关的,本地9999通过的流量数据,我们要分析出源IP的总占比,这个用例IP基本就是只有一个IP的流量监控过了,如果把IP地址去掉,监控的就是本机所有均衡负载过的radius流量,我们可以从中分析出日常业务中,那些应用的服务的请求压力大,那些应用的请求总是被radius服务reject,是否存在异常的请求流量, 一般request和accept的量,达到多少时,服务的压力就过大了,需要报警邮件。

4.2.将windump输出的日志文件,重定向到指定文件目录。

老树新芽:Windump与大数据工具结合做流量统计分析

windump.exe   -i 1 udp port 9999 and192.168.0.3 > c:\rlog\cap.log

我们直接将日志文件通过管道生成到指定目录。

4.3.启运压力测试脚本,查看日志生成结果。

老树新芽:Windump与大数据工具结合做流量统计分析

生成的流量日志被生成到了指定位置,并传到了graylog的ES集群,或是syslog服务器上。

4.4.停止监控后,查看graylog日志结果,做分析。

老树新芽:Windump与大数据工具结合做流量统计分析

我们可以在Graylog看到,那台老的windows server的流量监控数据,被发现大数据ES集群中,之后我们就要对字段IP进行分词,也可能将大数据统计的流量状态通过REST API给前段,投到大屏幕上。

5.定制化流量收集代理

我们知道很多的抓包工具底层用的都是libpcap,在mac、windows、linux上都有支持,如果我们需要在流量的收集端,定制过滤流量,只过滤需要特定的流量,或是将流量通过syslog直接中继到其它的syslog服务器,这样意味着可以不用部署nxlog代理。下面是一个C语言写的例子,C的版本要比Python效率过高,并且可以在C语言中嵌入Lua,用lua来处理流量中过滤规则和发syslog更便利,下面抛砖引玉给出一个C语言实现的libpcap的演示代码,截取本地际80的端口数据,以下:

安装环境依赖:

wget ibpcap-1.5.3.tar.gztar zxvf libpcap-1.5.3.tar.gzcd libpcap-1.5.3./configure  makesudo make installsudoapt-get install libpcap-dev

源代码:

#include <pcap.h> 
#include <time.h>  
#include <stdlib.h>  
#include <stdio.h>  
void getPacket(u_char * arg, const structpcap_pkthdr * pkthdr, const u_char * packet) 
{  
  int* id = (int *)arg;  
 printf("id: %d\n", ++(*id)); 
 printf("Packet length: %d\n", pkthdr->len);  
 printf("Number of bytes: %d\n", pkthdr->caplen);  
 printf("Recieved time: %s", ctime((const time_t*)&pkthdr->ts.tv_sec));   
  inti;  
 for(i=0; i<pkthdr->len; ++i) 
 {   
   printf(" %c", packet[i]); 
   if( (i + 1) % 16 == 0 )   
   {   
       //printf("\n");  
   }   
 }   
  printf("\n\n");  
}  
int main() 
{  
 char errBuf[PCAP_ERRBUF_SIZE], * devStr; 
 devStr = "eth1";
 if(devStr)  
 {   
   printf("success: device: %s\n", devStr);  
 }   
 else  
 {   
   printf("error: %s\n", errBuf); 
   exit(1);  
 }   
pcap_t * device = pcap_open_live(devStr,65535, 1, 0, errBuf);  
 if(!device)  
 {   
   printf("error: pcap_open_live(): %s\n", errBuf);
   exit(1);

  }
 struct bpf_program filter;
 pcap_compile(device, &filter, "dst port 80", 1, 0);
 pcap_setfilter(device, &filter);
  intid = 0;
 pcap_loop(device, -1, getPacket, (u_char*)&id);
 pcap_close(device);
 return 0;
}

编译:

gcc test.c -lpcap -o test

以上程序的功能等同于:

tcpdump -i eth1 dst port 80    -l -s 0 -w-  | strings

如果我们在主事件循环中加入Lua的调用即可过滤处理流理包,鉴于篇幅之后介绍。

6.结语

本文图片去掉了一些真实的测试IP信息。关于Graylog分词与数据可视统计与alert报警,基于Windpcap库的监听代码使用后在后期给出。一般情况下,我们都是直接查看某台机器的流量都是使用IDS相关设备,或是设备直接读出的Syslog,因为某些设备和系统的特殊环境,要想监控其流量直能采取直接深入的办法,比如些文提到的情况,这样我们就可以很灵活的将老的设备监控起来,将其服务状态数据接入到大数据平台集中管理起来,让老的设备软件,老树开新芽。

Tags: