基于Docker搭建ElastiFlow,接入网络设备的sflow和log

0、架构图
image.png
1、宿主机环境准备
  • 基础环境配置
# 关闭selinux
setenforce 0    # 临时关闭
sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config    # 永久关闭

# 关闭并禁用防火墙
systemctl stop firewalld.service
systemctl disable firewalld.service
  • rsyslog配置
# rsyslog配置文件
[root@testhost mnt]# grep -v "^#\|^$" /etc/rsyslog.conf
$ModLoad imuxsock # provides support for local system logging (e.g. via logger command)
$ModLoad imjournal # provides access to the systemd journal
$ModLoad imudp
$UDPServerRun 514
$ModLoad imtcp
$InputTCPServerRun 514
$WorkDirectory /var/lib/rsyslog
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
$IncludeConfig /etc/rsyslog.d/*.conf
$OmitLocalLogging on
$IMJournalStateFile imjournal.state
*.info;mail.none;authpriv.none;cron.none;local6.none                /var/log/messages
$template h3c,"/apps/logs/h3c_log/%FROMHOST-IP%.log"      # 交换机日志路径和文件名格式
local6.* ?h3c
authpriv.*                                              /var/log/secure
mail.*                                                  -/var/log/maillog
cron.*                                                  /var/log/cron
*.emerg                                                 :omusrmsg:*
uucp,news.crit                                          /var/log/spooler
local7.*                                                /var/log/boot.log

# 重启rsyslog服务
systemctl restart rsyslog.service

# 检查514端口是否正常监听
netstat -antupl |grep syslog

# 创建交换机日志存放目录
mkdir -p /apps/logs/h3c_log/
2、交换机配置(h3c为例)
<H3C>dis curr | inc info-center
 undo info-center logfile enable
 info-center loghost source Vlan-interface3
 info-center loghost 192.168.10.100 facility local6      # 192.168.10.100为rsyslog的地址

远程ssh登录或退出交换机的命令行触发产生日志后可在rsyslog服务器上看到对应的日志

ls -alF /apps/logs/h3c_log/
3、docker相关环境准备
# 安装docker
curl https://download.docker.com/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker.repo
yum install docker-ce -y

# 全局修改docker配置
vi /etc/docker/daemon.json
{
    "registry-mirrors": ["https://registry.docker-cn.com","http://hub-mirror.c.163.com"],      # 修改镜像仓库源
    "log-driver": "json-file",      # 指定日志驱动为json文件
    "log-opts": {
        "max-size" : "100m",      # 指定日志文件最大为100M
        "max-file": "10",       # 指定保存最多10个日志文件
        "compress": "true"      # 开启切割后的日志压缩
    }
}

# 启用docker服务
systemctl daemon-reload
systemctl start docker
systemctl enable docker

# 安装docker-compose
sudo curl -L "https://github.com/docker/compose/releases/download/1.28.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

# 修改响应时间(解决docker-compose启动容器超时问题)
vi /etc/profile
export COMPOSE_HTTP_TIMEOUT=500
export DOCKER_CLIENT_TIMEOUT=500
# 使配置生效
source /etc/profile

# 新建目录
mkdir -p /apps/elastiflow    # 脚本及配置文件目录
mkdir /elastiflow_data && chown -R 1000:1000 /elastiflow_data    # 宿主机上es持久化数据目录
4、应用配置
  • filebeat配置文件:filebeat.yml
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /var/log/networklogs/*.log      # 日志文件路径列表,可用通配符,不递归
  tags: ["h3c"]      # 标记tag,可用于分组
  include_lines: ['LOGIN','Failed','failed','error','ERROR','\bDOWN\b','\bdown\b','\bUP\b','\bup\b']      # 只输出匹配行
output.logstash:      # output到logstash
  hosts: ["127.0.0.1:5044"]
processors:
  - add_host_metadata: ~
  - add_cloud_metadata: ~
  • logstash配置文件:logstash_networklog.conf
input {
  beats {
    port => 5044
  }
}
filter {
  if "huawei" in [tags] {
    grok{      # 解析文本构造
      match => {"message" => "%{SYSLOGTIMESTAMP:time} %{DATA:hostname} %{GREEDYDATA:info}"}
        }
  }
   else if "h3c" in [tags] {
    grok{
      match => {"message" => "%{SYSLOGTIMESTAMP:time} %{YEAR:year} %{DATA:hostname} %{GREEDYDATA:info}"}
        }
  }
mutate {      # 对字段做处理 重命名、删除、替换和修改字段
      remove_field => ["message","time","year","offset","tags","path","host","@version","[log]","[prospector]","[beat]","[input][type]","[source]"]
    }
}
output{
stdout {codec => rubydebug}
elasticsearch {
    index => "networklogs-%{+YYYY.MM.dd}"
    hosts => ["127.0.0.1:9200"]
    sniffing => false
    }
}
  • logstash管道配置文件:logstash_pipelines.yml
- pipeline.id: main
  path.config: "/etc/logstash/conf.d/*.conf"      # 加载networklog.conf配置
- pipeline.id: elastiflow
  path.config: "/etc/logstash/elastiflow/conf.d/*.conf"      # 加载elastiflow配置(sflow使用)
  • docker-compose.yml
version: '3'

services:
  elastiflow-elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.8.1
    container_name: elastiflow-elasticsearch
    restart: 'no'
    ulimits:
      memlock:
        soft: -1
        hard: -1
      nofile:
        soft: 131072
        hard: 131072
      nproc: 8192
      fsize: -1
    network_mode: host
    volumes:
      - /elastiflow_data:/usr/share/elasticsearch/data       # 持久化数据目录
    environment:
      ES_JAVA_OPTS: '-Xms8g -Xmx8g'
      cluster.name: elastiflow
      bootstrap.memory_lock: 'true'
      network.host: 0.0.0.0
      http.port: 9200
      discovery.type: 'single-node'
      indices.query.bool.max_clause_count: 8192
      search.max_buckets: 250000
      action.destructive_requires_name: 'true'

  elastiflow-kibana:
    image: docker.elastic.co/kibana/kibana:7.8.1
    container_name: elastiflow-kibana
    restart: 'no'
    depends_on:
      - elastiflow-elasticsearch
    network_mode: host
    environment:
      SERVER_HOST: 0.0.0.0
      SERVER_PORT: 5601
      SERVER_MAXPAYLOADBYTES: 8388608
      ELASTICSEARCH_HOSTS: "http://127.0.0.1:9200"
      ELASTICSEARCH_REQUESTTIMEOUT: 132000
      ELASTICSEARCH_SHARDTIMEOUT: 120000
      KIBANA_DEFAULTAPPID: "dashboard/653cf1e0-2fd2-11e7-99ed-49759aed30f5"
      KIBANA_AUTOCOMPLETETIMEOUT: 3000
      KIBANA_AUTOCOMPLETETERMINATEAFTER: 2500000
      LOGGING_DEST: stdout
      LOGGING_QUIET: 'false'
      I18N_LOCALE: zh-CN

  elastiflow-logstash:
    image: robcowart/elastiflow-logstash:4.0.1
    container_name: elastiflow-logstash
    restart: 'no'
    depends_on:
      - elastiflow-elasticsearch
    network_mode: host
    volumes:
      - /apps/elastiflow/logstash_networklog.conf:/etc/logstash/conf.d/networklog.conf
      - /apps/elastiflow/logstash_pipelines.yml:/usr/share/logstash/config/pipelines.yml
    environment:
      # JVM Heap size - this MUST be at least 3GB (4GB preferred)
      LS_JAVA_OPTS: '-Xms4g -Xmx4g'

      # ElastiFlow global configuration
      ELASTIFLOW_AGENT_ID: elastiflow
      ELASTIFLOW_GEOIP_CACHE_SIZE: 16384
      ELASTIFLOW_GEOIP_LOOKUP: 'true'
      ELASTIFLOW_ASN_LOOKUP: 'true'
      ELASTIFLOW_OUI_LOOKUP: 'false'
      ELASTIFLOW_POPULATE_LOGS: 'true'
      ELASTIFLOW_KEEP_ORIG_DATA: 'true'
      ELASTIFLOW_DEFAULT_APPID_SRCTYPE: '__UNKNOWN'

      # Name resolution option
      ELASTIFLOW_RESOLVE_IP2HOST: 'false'
      ELASTIFLOW_NAMESERVER: '127.0.0.1'
      ELASTIFLOW_DNS_HIT_CACHE_SIZE: 25000
      ELASTIFLOW_DNS_HIT_CACHE_TTL: 900
      ELASTIFLOW_DNS_FAILED_CACHE_SIZE: 75000
      ELASTIFLOW_DNS_FAILED_CACHE_TTL: 3600
      ELASTIFLOW_ES_HOST: '127.0.0.1:9200'
      #ELASTIFLOW_ES_USER: 'elastic'
      #ELASTIFLOW_ES_PASSWD: 'changeme'
      ELASTIFLOW_NETFLOW_IPV4_PORT: 2055
      ELASTIFLOW_NETFLOW_UDP_WORKERS: 2
      ELASTIFLOW_NETFLOW_UDP_QUEUE_SIZE: 4096
      ELASTIFLOW_NETFLOW_UDP_RCV_BUFF: 2000000
      ELASTIFLOW_SFLOW_IPV4_PORT: 6343
      ELASTIFLOW_SFLOW_UDP_WORKERS: 2
      ELASTIFLOW_SFLOW_UDP_QUEUE_SIZE: 4096
      ELASTIFLOW_SFLOW_UDP_RCV_BUFF: 2000000
      ELASTIFLOW_IPFIX_UDP_IPV4_PORT: 4739
      ELASTIFLOW_IPFIX_UDP_WORKERS: 2
      ELASTIFLOW_IPFIX_UDP_QUEUE_SIZE: 4096
      ELASTIFLOW_IPFIX_UDP_RCV_BUFF: 2000000

  elastiflow-filebeat:
    user: root
    container_name: elastiflow-filebeat
    restart: 'no'
    image: docker.elastic.co/beats/filebeat:7.8.1
    depends_on:
      - elastiflow-logstash
    network_mode: host
    volumes:
#      - /var/run/docker.sock:/var/run/docker.sock
#      - /var/log/remote_log:/usr/share/filebeat/remote_log  #use your log file location to update this line
      - /apps/logs/h3c_log/:/var/log/networklogs/
      - /apps/elastiflow/filebeat.yml:/usr/share/filebeat/filebeat.yml
5、启动容器
docker-compose up -d
6、验证和测试
  • docker验证
docker ps -a    # docker运行情况
journalctl -u docker.service     # docker 引擎日志
docker logs -f xxxxx     # docker日志
  • 相关端口
netstat -antupl | grep 9200      # es端口
netstat -antupl | grep 6343      # sflow端口
netstat -antupl | grep 5044      # logstash端口
netstat -antupl | grep 5601      # kibana端口
  • filebeat测试
docker exec -it elastiflow-filebeat /bin/bash
filebeat test config    # 测试配置文件
filebeat test output    # 测试连接logstash 5044端口是否正常
7、页面配置-sflow

http://x.x.x.x:5601打开kibana页面
Management -> Stack Management -> Kibana Saved Objects 导入模板文件elastiflow.kibana.7.8.x.json(该文件从github中获取 https://github.com/robcowart/elastiflow/tree/master/kibana
效果图如下

image.png

8、页面配置-交换机log

浏览器打开http://x.x.x.x:5601
打开管理页面:Home --> Management --> Stack Management

image.png

image.png

image.png

image.png

image.png

image.png

image.png

9、es管理

查看es集群健康状态curl -XGET 'http://127.0.0.1:9200/_cluster/health?pretty'

[root@testhost]# curl -XGET 'http://127.0.0.1:9200/_cluster/health?pretty'
{
  "cluster_name" : "elastiflow",
  "status" : "yellow",    # 集群状态
  "timed_out" : false,
  "number_of_nodes" : 1,    # 集群中节点数量
  "number_of_data_nodes" : 1,    # 集群中存放数据的节点总数
  "active_primary_shards" : 17,    # 集群中全部索引的主分片总数
  "active_shards" : 17,    # 集群中全部索引的所有分片(包括主分片和副本分片)总数
  "relocating_shards" : 0,    # 当下正在多个节点间移动的分片数量
  "initializing_shards" : 0,    # 新创建的分片数量
  "unassigned_shards" : 11,    # 集群中定义的,却未能发现的分片数量(此项非0的话集群状态为yellow)
  "delayed_unassigned_shards" : 0,
  "number_of_pending_tasks" : 0,
  "number_of_in_flight_fetch" : 0,
  "task_max_waiting_in_queue_millis" : 0,
  "active_shards_percent_as_number" : 60.71428571428571
}

说明:单点部署的 Elasticsearch,默认分片的副本数为 1,而相同的分片不能在同一个节点上,所以就出现上面 unsigned shards 非0的问题,最简单的解决方案是增加es的节点。
参考链接:
https://github.com/robcowart/elastiflow

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,258评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,335评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,225评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,126评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,140评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,098评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,018评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,857评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,298评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,518评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,400评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,993评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,638评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,661评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容