通过elk搭建syslog和sflow收集与分析

背景介绍

ELK是由Elasticsearch、Logstash和Kibana三部分组件组成。

ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。

Logstash是一个接收,处理,转发日志的工具。支持系统日志,webserver日志,错误日志,应用日志,总之包括所有可以抛出来的日志类型。

kibana 是一个开源和免费的工具,它可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助您汇总、分析和搜索重要数据日志。

注意:本文中所用服务器ip为10.6.2.18,可以根据自己实际情况进行修改,本文服务器操作系统使用的是centos6.8

Elasticsearch的安装与配置

  • ElasticSearch和Logstash依赖于JDK,所以需要安装JDK:

    1
    2
    3
    4
    # yum -y install java-1.8.0-openjdk*
    # java -version
    # javac -version
    查看两个版本是否一致
  • 按照如下步骤进行下载安装Elasticsearch,如果wget的链接出错,就去官网下载最新的版本就行

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # mkdir /elk
    # cd /elk
    # wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.2.2.zip
    # unzip elasticsearch-5.2.2.zip
    # groupadd elsearch
    # useradd elsearch -g elsearch -p elasticsearch
    # chown -R elsearch:elsearch elasticsearch-5.2.2
    # chown -R elsearch:elsearch /elk
    # cd elasticsearch-5.2.2
    # su elsearch
    $ ./bin/elasticsearch

    一执行就会报错,所以需要修改一下配置文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    $ vim config/elasticsearch.yml
    添加如下内容:
    network.host: 10.6.2.18(你服务器的ip地址,不添加默认是本机127.0.0.1)
    http.port: 9200
    bootstrap.system_call_filter: false

    退出elsearch用户,使用root用户
    # vim /etc/security/limits.conf
    在该文件最后的几行,修改配置如下:
    # End of file
    * soft core unlimited
    * hard core unlimited
    * soft nofile 65536
    * hard nofile 131072
    * soft nproc 2048
    * hard nproc 4096

    # vim /etc/sysctl.conf
    在最下面添加如下内容:
    vm.max_map_count=655360

    切回elsearch用户,执行程序
    # su elsearch
    $ ./bin/elasticsearch -d

    我们可以随便去一台服务器上,也可以本机上测试一下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     # curl 10.6.2.18:9200
    会出现如下信息,说明elasticsearch安装成功了
    {
    "name" : "sc3N8pA",
    "cluster_name" : "elasticsearch",
    "cluster_uuid" : "O5Wz2-34R9Gi1XTLSoLnjA",
    "version" : {
    "number" : "5.2.2",
    "build_hash" : "f9d9b74",
    "build_date" : "2017-02-24T17:26:45.835Z",
    "build_snapshot" : false,
    "lucene_version" : "6.4.1"
    },
    "tagline" : "You Know, for Search"
    }

Logstash的安装与配置

  • 按照如下步骤进行下载安装Logstash,如果wget的链接出错,就去官网下载,这里建议下载All Plugins的版本,这样不用再安装插件,插件都能用,我们会用到netflow和sflow的插件,来获取sflow的报文数据

    sFlow技术是一种以设备端口为基本单元的数据流随机采样的流量监控技术,不仅可以提供完整的第二层到第四层甚至全网范围内的实时流量信息,而且可以适应超大网络流量(如大于10Gbit/s)环境下的流量分析,让用户详细、实时地分析网络传输流的性能、趋势和存在的问题。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    切换回root账户
    # cd /elk
    # wget https://download.elastic.co/logstash/logstash/logstash-all-plugins-2.4.0.tar.gz
    # tar -zxvf logstash-all-plugins-2.4.0.tar.gz
    # cd logstash-2.4.0
    这里先介绍netflow的配置
    # vim netflow.conf 添加如下内容:
    input {
    udp {
    host => localhost
    port => 9996
    codec => netflow {
    versions => [5, 9]
    }
    type => netflow
    }
    }

    output {
    elasticsearch {
    hosts => ["10.6.2.18:9200"]
    index => "logstash_netflow-%{+YYYY.MM.dd}"
    }
    }
  • 交换机配置sflow,服务器将sflow转换为netflow数据

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    博主以n9k为例,交换机配置如下:
    feature sflow
    sflow collector-ip 10.6.2.18 vrf default
    sflow collector-port 9995
    sflow agent-ip 10.2.1.252
    sflow data-source interface port-channel5
    配置意思是将port-channel15口的数据采集sflow发给10.6.2.18的9995端口

    在服务器上下载配置sflowtool如下:
    # cd /elk
    # git clone https://github.com/sflow/sflowtool
    # cd sflowtool/
    # ./boot.sh
    # ./configure
    # make
    # sudo make install
    # nohup sflowtool -p 9995 -c 127.0.0.1 -d 9996 &

    tcpdump查看是否有数据
    # tcpdump -i lo port 9996

    启动logstash服务
    # cd /elk/logstash-2.4.0
    # ./bin/logstash -f netflow.conf
    如果要停止进程,ps -ef | grep logstash ,kill 掉进程号就行

Kibana的安装与配置

  • 按照如下步骤进行下载安装Kibana,如果wget的链接出错,就去官网下载

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # wget https://artifacts.elastic.co/downloads/kibana/kibana-5.2.2-linux-x86_64.tar.gz
    # tar zxvf kibana-5.2.2-linux-x86_64.tar.gz
    # cd kibana-5.2.2-linux-x86_64
    # vim config/kibana.yml
    添加如下内容:
    erver.port: 5601
    server.host: "10.6.2.18"
    elasticsearch.url: "http://10.6.2.18:9200"
    kibana.index: ".kibana“

    nohup ./bin/kibana & 启动就行了,如果要停止进程,ps -ef | grep kibana ,kill 掉进程号就行
  • 去web管理界面配置kibana

    打开http://10.6.2.18:5601/
    如下图,在Index name or pattern里面填写logstash_netflow* ,在Time-field name里面选择@timestamp,最后点击create进行创建。这里可以理解一个logstash收集进程一个index pattern,文章最后我会介绍syslog的logstash配置。
    配置kibana

    创建好后,点击右边Discover,选择右边的field可以进行查看关心的信息,比如netflow.ipv4_src_addr 为原地址等,你也可以在search栏目搜索你想找的关心的信息

  • 优化界面展示
    其实大家可以自己根据自己的需要点击右边的Visualize进行各种图表制作和展示。我这边推荐一个现成的netflow展示模版,导入即可用
    百度网盘下载地址

    下载export.json,按照下面步骤倒入进kibana就行了
    倒入
    倒入kibana

    倒入完成后,打开Dashboard,点击上面的open,选择dashboard模版打开即可使用,最后效果如下图所示
    dashboard

后记

  • syslog的logstash配置如下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    # cd /elk/logstash-2.4.0/
    # vim syslog.conf
    添加如下内容:
    input {
    syslog {
    port => "514"
    }
    }
    output {
    elasticsearch {
    hosts => ["10.6.2.18:9200"]
    index => "logstash_syslog-%{+YYYY.MM.dd}"
    }
    }

    # service rsyslog stop 关掉系统原本的syslog服务,不然会占用514端口
    # nohup ./bin/logstash -f syslog.conf

    最后去kibana上的Management上添加一个index pattern名为logstash_syslog* 就能使用啦

科科

和一个朋友沟通后发现也可以直接使用sflow的插件来完成该数据采集,而不需要使用sflowtool来转换数据,具体配置如下:

# cd /elk/logstash-2.4.0/
# vim sflow.conf
添加如下内容:
input {
  udp {
    host => ["10.6.2.18"]
    port => 9995
    codec => sflow {
      versions => [5]
    }
    type => sflow
  }
}

output {
  elasticsearch {
    hosts => ["10.6.2.18:9200"]
    index => "logstash_sflow-%{+YYYY.MM.dd}"
  }
}

# nohup ./bin/logstash -f sflow.conf

最后去kibana上的Management上添加一个index pattern名为logstash_sflow* 就能使用,效果如下:
sflow

感谢您的支持将鼓励我继续创作!