NetFlow analysis with Elasticsearch

本指南说明如何在 MikroTik RouterOS 上通过配置从 RouterOS 设备到 Elasticsearch 服务器的数据收集来设置使用 Elasticsearch 进行 NetFlow 分析,包括 Kibana 集成和 Fleet Server 部署,以实现高效的 NetFlow 数据处理和可视化。

使用 Elasticsearch 进行 NetFlow 分析

Elasticsearch 是一种流行的 NoSQL 数据库,可用于存储各种数据,包括 NetFlow 日志。结合 Kibana,您可以创建一个强大的工具来分析来自 RouterOS 设备的 NetFlow 数据。本指南将依赖 Elasticsearch 集成,要使其工作,您需要有一个可用的 Elasticsearch 环境。本指南不会涵盖 Elasticsearch 和 Kibana 的设置说明,但会涵盖设置 NetFlow 日志收集和分析的相关步骤。

使用 Elasticsearch 可以进行许多可能的配置,但为了本指南的完整性,我们将使用以下原则:

  • 一台 RouterOS (10.0.0.1) 设备向运行 NetFlow 集成的服务器 (10.0.0.2) 发送 NetFlow 数据。
  • 运行 NetFlow 集成的服务器 (10.0.0.2) 摄取 NetFlow 数据,处理数据并将其发送到 Fleet Server (10.0.0.3)。
  • Fleet Server (10.0.0.3) 将数据存储在 Elasticsearch (10.0.0.4) 中。
  • Kibana (10.0.0.5) 从 Elasticsearch (10.0.0.4) 检索数据,进行分析并允许您搜索数据。

信息

本指南不会使用 Logstash 作为分析 NetFlow 数据的一部分;它已被 Fleet Server 取代。

Important: 可以在同一台设备上安装 Elasticsearch、Kibana、Fleet Server 和 NetFlow Records 集成。

前置条件

  • 设置 Elasticsearch
    :::info Elasticsearch 在许多平台上得到广泛支持。建议设置一个 Elasticsearch 节点集群。 :::
  • 设置 kibana
    :::info Kibana 可以安装在您安装 Elasticsearch 的同一台设备上,但出于性能原因,也可以安装在单独的设备上。虽然可以在没有 Kibana 的情况下分析 NetFlow 数据,但这需要编写自己的 API 请求。Kibana 非常易于使用,并且具有广泛的功能。 :::
  • 设置 Fleet Server
    :::info 可以在您安装 Elasticsearch 和/或 Kibana 的同一台设备上设置 Fleet Server。建议将 Fleet Server 安装在不同的设备上。有关硬件和拓扑要求的建议,请参阅 Elasticsearch 手册。 :::

设置

设置说明分为两部分:Elastic(有关 Elasticsearch、Kibana 和 Fleet Server 的配置)和 RouterOS(与您的 RouterOS 设备相关的配置)。

Elastic

警告

某些步骤可能会随时间变化,请参阅 Elastic 的手册以查找最新的步骤。

  1. 登录到您的 Kibana
  2. 在主菜单下打开 Fleet 部分
  3. 打开 "Agent policies" 部分
  4. 按 "Create agent policy" 按钮创建新的 Agent Policy
  5. 为策略命名,例如 "NetFlow policy",根据需要调整高级设置,创建策略
  6. 通过点击其名称打开您新创建的策略
  7. 按 "Add integration"
  8. 搜索 "NetFlow Records" 并按 "Add NetFlow Records"
  9. 调整配置,确保:
    • 将 "UDP host to listen on" 设置为将运行 NetFlow Records 集成的服务器的 IP 地址,在此示例中地址应为 "10.0.0.2"
  10. 保存集成
  11. 按 "Add Elastic Agent to your host" 按钮
  12. 按照说明将 Elastic Agent 添加到您的主机
    :::info Elastic 的官方手册建议将 Elastic Agent 安装为 Fleet-managed。请考虑遵循该建议,因为当 agent 由 Fleet 管理时,管理它们更容易。 :::
  13. 确保您已在主机上以及从 RouterOS 设备 (10.0.0.1) 路径中的其他位置打开了 NetFlow 端口。默认目的端口为 2055/UDP。
  14. 您的 Elastic Agent 现在已准备好接收 NetFlow 数据!

RouterOS

  1. (可选)创建一个接口列表(例如 "NetFlow_interfaces"),并添加需要 NetFlow 数据分析的接口。

    /interface/list
    add name=NetFlow_interfaces
    /interface/list/member
    add interface=VLAN3000 list=NetFlow_interfaces
    
  2. 配置 Traffic-flow 以将 NetFlow 数据发送到您的 Elastic Agent (10.0.0.2)。

    /ip/traffic-flow
    set enabled=yes interfaces=NetFlow_interfaces
    /ip/traffic-flow/target
    add dst-address=10.0.0.2
    
  3. 现在您应该开始看到 NetFlow 数据被摄取!

  4. 继续本指南以开始使用 Kibana。

使用 Kibana

警告

某些步骤可能会随时间变化,请参阅 Elastic 的手册以查找最新的步骤。 NetFlow Records 集成提供了一些可用于分析 NetFlow 数据的有用资产。在继续之前,请确保您先安装这些资产。以下部分将为您提供一些查看 NetFlow 数据的基本方法。

  1. 登录到您的 Kibana
  2. 在主菜单中打开 "Dashboards" 菜单
  3. 搜索 Dashboards 并找到 "NetFlow"

您现在应该看到多个 NetFlow Dashboard。例如,尝试打开 "[Logs Netflow] Overview"。如果您的 NetFlow 数据被正确摄取,那么您现在应该看到汇总流量的图表。

另一个有用的 Dashboard 是 "[Logs Netflow] Flow records",它向您显示确切的 NetFlow 记录。一个非常有用的功能是过滤选项(顶部的 + 按钮),它允许您向 NetFlow 数据添加过滤器,例如,您可以将记录过滤为仅显示单个 IP 地址:

还有其他选项,例如搜索特定时间范围。您应该进一步阅读 Discover 以更好地理解这些可能性。

为便于快速参考,以下是您最有可能想要用于搜索 NetFlow 数据的字段:

  • source.ip
  • source.port
  • destination.ip
  • destination.port
  • network.transport

如果您想检查单条记录,建议使用 Discover 视图。NetFlow 数据可以以 "data_stream.dataset: netflow.log" 找到。

日志保留

根据您当地的法律,您可能被要求将 NetFlow 数据存储指定的时间段。请注意,繁忙的网络会产生大量 NetFlow 数据,甚至每天数 TB。您很可能需要调整 Lifecycle Policy。默认情况下,NetFlow 数据应归入 "logs" 策略。如果您有多个 Elasticsearch 节点,可以利用 "phases",它允许您将数据存储在不同类型的存储介质上,但如果您只有一个 Elasticsearch 节点,您的选择有限,您很可能想要删除旧数据。例如,如果您想在 6 个月后删除数据,那么您可以简单地将 ILM 策略更改为在 6 个月后删除数据,或使用以下 API 请求:

PUT _ilm/policy/logs
{
  "policy": {
    "phases": {
      "hot": {
        "min_age": "0ms",
        "actions": {
          "rollover": {
            "max_age": "30d",
            "max_primary_shard_size": "50gb"
          },
          "set_priority": {
            "priority": 101
          }
        }
      },
      "delete": {
        "min_age": "180d",
        "actions": {
          "delete": {
            "delete_searchable_snapshot": true
          }
        }
      }
    }
  }
}

危险

如果您更改 "logs" 策略,这将应用于您的所有日志,而不仅仅是 NetFlow 数据。如果您需要为其他日志设置不同的保留期,那么最好创建一个新的 ILM 策略,并指定 NetFlow 集成使用新创建的 ILM 策略。

使用不同的 ILM 策略

如果您希望 NetFlow 数据具有不同的保留期,那么您需要执行以下步骤:

  1. 创建一个新的 ILM 策略,为其赋予新名称并为 delete 阶段设置所需的周期,或使用此 API 请求:

    PUT _ilm/policy/netflow-logs
    {
      "policy": {
        "phases": {
          "hot": {
            "min_age": "0ms",
            "actions": {
              "rollover": {
                "max_age": "30d",
                "max_primary_shard_size": "50gb"
              },
              "set_priority": {
                "priority": 101
              }
            }
          },
          "delete": {
            "min_age": "1000d",
            "actions": {
              "delete": {
                "delete_searchable_snapshot": true
              }
            }
          }
        }
      }
    }
    
  2. 转到 Kibana,打开 "Stack Management",然后转到 "Index Management",再转到 "Component Templates"。

  3. 搜索 "logs-netflow.log@custom",打开并编辑它。

  4. 转到 "Index settings" 部分。

  5. 粘贴以下内容:

    {
      "index": {
        "lifecycle": {
          "name": "netflow-logs"
        }
      }
    }
    
  6. 按 "Next",然后按 "Save component template"。