让我们使用OSS来分析NetFlow!使用ElastiFlow

首先

操作系统的准备工作

ubuntu 22.04.2 64位

确认尺寸

flows/sec(v)CPUsMemoryDisk (30-days)ES JVM HeapLS JVM Heap250432 GB512 GB12 GB4 GB500648 GB1 TB16 GB4 GB1000864 GB2 TB24 GB6 GB15001296 GB3 TB31 GB6 GB

如果可能的话,请尽量不要使用巨大的Java Heap。为了保持整个Elasticsearch使用的最大工作集大小,应该设置所需大小的Heap(理想情况下为机器内存的一半以下)。这样剩余的(希望是相当大的)RAM就可以用于操作系统管理的IO缓存。请确保操作系统不会将Java进程交换出去。

引自Elasticsearch索引创建的性能考虑事项。

ES JVM Heap + LS JVM Heap = 内存容量的一半是一个参考值。

安装Java

如果先前安装了其他版本的JDK,请先卸载它们,因为它们无法在JDK8上运行。

$ sudo apt install openjdk-8-jdk
$ java -version
$ dirname $(readlink $(readlink $(which java)))

当你运行dirname命令时,我认为会输出类似于/usr/lib/jvm/java-8-openjdk-amd64/jre/bin的结果。

由于这是Java的路径,因此我们将按照以下方式追加设置并添加路径。

$ sudo vi /etc/profile
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export LS_JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export PATH=$PATH:$JAVA_HOME/bin

追記完成后保存并退出编辑器,确保环境变量已设置正确。

$ source /etc/profile
$ sudo echo $JAVA_HOME
$ sudo echo $LS_JAVA_HOME
$ sudo echo $PATH

安装Elasticsearch。

由于ElastiFlow的开发已被冻结,并且ELK堆栈的支持版本停留在7.8.1,因此需要指定版本进行安装。

$ wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elasticsearch-keyring.gpg
$ sudo apt install apt-transport-https
$ echo "deb [signed-by=/usr/share/keyrings/elasticsearch-keyring.gpg] https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-7.x.list
$ sudo apt update
$ sudo apt install elasticsearch=7.8.1
$ sudo apt-mark hold elasticsearch

我会在下方追加内容。

$ sudo vi /etc/elasticsearch/elasticsearch.yml
network.host: localhost
http.port: 9200
indices.query.bool.max_clause_count: 8192
search.max_buckets: 250000

根据确认的大小信息,需要将Elasticsearch设置为每秒250个流并保留12GB的内存。

$ sudo vi /etc/elasticsearch/jvm.options
-Xms12g
-Xmx12g

设定完成后将启动。

$ sudo systemctl start elasticsearch
$ systemctl status elasticsearch
$ sudo systemctl enable elasticsearch
$ curl "http://localhost:9200/"

当curl返回的结果以JSON格式返回时,表示成功。需要花费一些时间(大约1分钟)。

Kibana的安装

在安装的同时,将GUI界面进行日语化。

$ sudo apt install kibana=7.8.1
$ sudo apt-mark hold kibana

我将在下面进行补充。

$ sudo vi /etc/kibana/kibana.yml
server.port: 5601
server.host: 0.0.0.0
elasticsearch.hosts: ["http://localhost:9200"]
i18n.locale: "ja-JP"

当设置完成后,将启动。

$ sudo systemctl start kibana
$ systemctl status kibana
$ sudo systemctl enable kibana

Logstash的安装

$ sudo apt install logstash

当确认säizing信息时,根据Elasticsearch需要250个Flows/s和4GB的内存进行设置和保证。
※即使Flow数量很少,也至少需要分配4GB才能正常运行。

$ sudo vi /etc/logstash/jvm.options
-Xms4g
-Xmx4g

为了防止数据包丢失,我们将提高Logstash的优先级。
如果忘记这一点,处理速度将会变得非常缓慢。

$ sudo vi /etc/systemd/system/logstash.service
Nice=0

完成设置后,启动系统。

$ sudo /usr/share/logstash/bin/system-install
$ sudo systemctl start logstash
$ systemctl status logstash
$ sudo systemctl enable logstash

安装ElastiFlow

$ sudo /usr/share/logstash/bin/logstash-plugin install logstash-codec-sflow
$ sudo /usr/share/logstash/bin/logstash-plugin update
$ git clone https://github.com/robcowart/elastiflow.git
$ sudo cp -r ./elastiflow/logstash/elastiflow/ /etc/logstash/
$ cd /etc/logstash/elastiflow/conf.d

由于不使用除了NetFlow以外的选项,我们会添加“.disabled”来禁用它们。

$ sudo mv 10_input_ipfix_ipv4.logstash.conf 10_input_ipfix_ipv4.logstash.conf.disabled
$ sudo mv 10_input_sflow_ipv4.logstash.conf 10_input_sflow_ipv4.logstash.conf.disabled
$ sudo mv 20_filter_30_ipfix.logstash.conf 20_filter_30_ipfix.logstash.conf.disabled
$ sudo mv 20_filter_40_sflow.logstash.conf 20_filter_40_sflow.logstash.conf.disabled

我们将根据环境进行设置更改。

$ sudo vi 30_output_10_single.logstash.conf
hosts => [ "${ELASTIFLOW_ES_HOST:localhost:9200}" ]

如果等待在9995端口上。

$ sudo vi 10_input_netflow_ipv4.logstash.conf
host => "${ELASTIFLOW_NETFLOW_IPV4_HOST:0.0.0.0}"
port => "${ELASTIFLOW_NETFLOW_IPV4_PORT:9995}"

将其复制到systemd中。

$ cd ~/
$ sudo cp -r ./elastiflow/sysctl.d/* /etc/sysctl.d/
$ sudo cp -r ./elastiflow/logstash.service.d/ /etc/systemd/system/

NAMESERVER是在逆向查找主机IP地址时参考的DNS服务器。
ELASTIFLOW_RESOLVE_IP2HOST默认为false,可以选择exporters(仅解析流量导出器的IP)、endpoints(仅解析端点的IP,源/目标)或者true(两者都解析),或者选择false。

$ sudo vi /etc/systemd/system/logstash.service.d/elastiflow.conf
Environment="ELASTIFLOW_RESOLVE_IP2HOST=endpoints"
Environment="ELASTIFLOW_NAMESERVER=1.1.1.1"
Environment="ELASTIFLOW_ES_HOST=localhost:9200"
Environment="ELASTIFLOW_NETFLOW_IPV4_HOST=0.0.0.0"
Environment="ELASTIFLOW_NETFLOW_IPV4_PORT=9995"

如果设备是Cisco、Fortinet或Velocloud之一,则在ElastiFlow上设置IP地址后,将显示应用程序名称。

$ sudo vi /etc/logstash/elastiflow/user_settings/app_id.srctype.yml
"192.0.2.1": "cisco_nbar2"
"192.0.2.2": "fortinet"
"192.0.2.3": "velocloud"

如果正在進行取樣,請設定取樣的比例。

$ sudo vi /etc/logstash/elastiflow/user_settings/sampling_interval.yml
"192.0.2.1": 1024
"192.0.2.2": 512

如果您知道接口的MIB ID,请设定它,它将以该名称记录下来。

$ sudo vi /etc/logstash/elastiflow/user_settings/ifName.yml
"192.0.2.1::ifName.0": "eth0"

我会加载Logstash的Elastiflow配置。

$ sudo vi /etc/logstash/pipelines.yml
- pipeline.id: elastiflow
  path.config: "/etc/logstash/elastiflow/conf.d/*.conf"

設定完成後,我們將啟動。

$ sudo systemctl daemon-reload
$ sudo systemctl restart logstash
$ tail -f /var/log/logstash/logstash-plain.log

如果确认日志中没有发生错误,那应该是没问题的。

让Kibana加载模板

import.png

插件更新。

如果升级了Elasticsearch,还需要更新相关的插件。如果事先准备了shell脚本,就会变得轻松方便。

$ vi plugin-update.sh

#!/bin/bash
sudo /usr/share/logstash/bin/logstash-plugin install logstash-codec-sflow
sudo /usr/share/logstash/bin/logstash-plugin update
sudo systemctl daemon-reload
sudo systemctl restart logstash

$ chmod +x plugin-update.sh

数据库的更新

ASN和GeoIP利用MaxMind公司的GeoLite2免费可下载数据库。我们也准备了更新脚本。数据库每周二(美国时间)进行更新。因为有人在GitHub上分享了最新数据,所以我们会使用那份数据。

$ vi db-update.sh

#!/bin/bash
cd /etc/logstash/elastiflow/geoipdbs/
sudo wget https://github.com/P3TERX/GeoLite.mmdb/raw/download/GeoLite2-ASN.mmdb -O GeoLite2-ASN.mmdb
sudo wget https://github.com/P3TERX/GeoLite.mmdb/raw/download/GeoLite2-City.mmdb -O GeoLite2-City.mmdb
sudo systemctl daemon-reload
sudo systemctl restart logstash

$ chmod +x db-update.sh

设定生命周期。

为了避免磁盘容量不足,我们将设定定期删除的生命周期,以便持续收集流量信息。请在codec和mapping之间添加lifecycle。

$ sudo vi /etc/logstash/elastiflow/templates/elastiflow.template.json
      "codec": "best_compression",
      "lifecycle": {
        "name": "elastiflow"
      },
      "mapping": {

$ sudo systemctl daemon-reload
$ sudo systemctl restart logstash

错误处理

在logstash7.4.0及以后版本中,接收netflow模板时发生错误。
根据情况看,7.3.2版本没有发生错误,因此将固定在7.3.2版本。
※确认在2020/02/14的7.6.0版本中已修复该错误。

$ wget https://artifacts.elastic.co/downloads/logstash/logstash-7.3.2.deb
$ sudo dpkg -i logstash-7.3.2.deb
$ sudo apt-mark hold logstash
#7.4.0以降でエラー修正が行われたら、下記コマンドでバージョン固定を解除します。
#sudo apt-mark unhold logstash

确认在这里。

$ dpkg --get-selections | grep hold
logstash                                        hold

Elasticsearch性能调优

如果物理内存足够,避免交换出页面(请参考大小确定)将提高性能。
要避免交换出页面,可以首先禁用操作系统的交换功能,或者通过更改Elasticsearch的设置来确保其不使用交换。如果禁用操作系统的交换功能,当内存不足时,操作系统可能会出现故障,因此应通过Elasticsearch的设置来处理。

$ sudo vi /etc/elasticsearch/elasticsearch.yml
bootstrap.memory_lock: true

$ sudo mkdir /etc/systemd/system/elasticsearch.service.d
$ sudo vi /etc/systemd/system/elasticsearch.service.d/override.conf
[Service]
LimitMEMLOCK=infinity

$ sudo systemctl daemon-reload
$ sudo systemctl restart elasticsearch

这样的设置完毕了。
让我们确认设置是否生效。

$ curl http://localhost:9200/_nodes/process?pretty

如果“mlockall”为true则可以。

如果存储介质是硬盘驱动器的话

由於默認設置是針對固態硬碟(SSD)進行定制的,所以需要將其修改為適用於硬碟驅動器(HDD)。
在”settings”下面添加”index.merge.scheduler.max_thread_count”: 1。

$ sudo vi /etc/logstash/elastiflow/templates/elastiflow.template.json
  "settings": {
    "index.merge.scheduler.max_thread_count": 1,
    "index": {

$ sudo systemctl daemon-reload
$ sudo systemctl restart logstash
广告
将在 10 秒后关闭
bannerAds