logo NodeSeekbeta

OneMan 版简易流量审计方案 | IP/端口日志/ASN识别/风控/规则

前言

众所周知,一个成功的 One Man 不能没有一个流量审计系统,就好像西方不能没有耶路撒冷。

最近搞了一台独服来跑自己的一些系统,顺便想把多余的资源开成小鸡卖以最大化利用资源。但是又担心小鸡被黑变成肉鸡,爆扫全网DDCC之类的事情发生(实际真的发生了)。于是就想整一套流量审计系统,能在小鸡流量不正常的时候提醒我甚至帮我自动封禁。

那么在经过几天的研究和对比之后,ElastiFlow 方案脱颖而出,优点有三:

  1. 免费
  2. UI好看
  3. 能调用外部接口发送告警信息、控制防火墙规则、小鸡限流等。

当然,最主要的还是免费,注册后即享 Basic License。下文截图均来自于 Basic License.

系统截图

威胁情报

显示对你的小鸡进行爆扫或攻击的源IP地址以及攻击类别。

楼主备注:可以写个脚本自动封禁扫描机器人,每隔一段时间提取排名前几的IP加入到防火墙黑名单。

流量(连接)记录

显示小鸡产生的连接/会话记录,包括连接发起方、双端IP地址/ASN/端口、连接跑了多少流量/发了多少个包。全部字段类型可见文章结尾的示例。
可使用查询语句筛选查询,截图中是查询某一台小鸡流量大于10KB的连接。

更酷炫的流量图

还有其他种类的流量图,比如根据地理位置显示、根据AS显示等,由于篇幅限制,这里随便挑两张图。

楼主备注:根据AS显示个人感觉挺有用的,特别是拿来科学的流量,在图里会很显眼。例如去往 Telegram ASN 的流量和 China Unicom ASN 的流量同时长出来了一截 ac01
这几天有一只小鸡以稳定间隔从 Cloudflare 拉数据,就是图里那一截截的绿色柱子


安装方法

由于个人喜欢用 Docker 的原因,以下教程均基于 Docker。不想用的可以去看官方教程手动安装。
使用系统为 Ubuntu 22.04 LTS。

安装需求

  1. 【必需】会 Linux 基本操作,有折腾的心。
  2. 【必需】支持 SNMP 或 Netflow 的设备一台,用于收集并发送网络信息给 ElastiFlow 处理。
    例如防火墙、交换机、路由器等。
    楼主的例子:楼主在母鸡上开了一个 Mikrotik RouterOS (ROS,一个路由器系统)小鸡,其他全部小鸡的流量都经过这台 ROS 处理。ROS 开启 Netflow 发送数据给 ElastiFlow 即可。下文将以 ROS 示例。
  3. 【必需】Linux 小鸡一台,建议起步 1 核 4G 内存 100G SSD。
    楼主的例子:在母鸡上开了一个 Ubuntu 22.04 LTS,4核16G100G内存,CPU平均占用4%,内存8G,日志文件每天约2G。(日志文件可以设置xx天后删除)

开始安装

1. 配置ROS
进入网页图形管理界面,IP -> Traffic Flow,Interfaces 选择 All,勾选 Enabled,点击 Apply 确认。

返回 IP -> Traffic Flow,点击 Apply 旁边的 Target 按钮,在跳转后的界面里点 Add New 按钮

直接照抄图上内容即可,除了

Src. Address 请填写你的 ROS 的地址,例如我这台 ROS 是 192.168.1.1 如果不填会跟我一样因为收不到数据debug半天
Dst. Address 请填写你准备拿来装 ElastiFlow 的 Linux 机器地址,例如我是 192.168.1.250

配置完成后,返回 IP -> Traffic Flow,拉到最下面检查 Finished FlowsActive Flows 数值是否不为0,且数值在增加(除非你网络内一个连接都没有),如果有,说明配置成功,进行下一步。

2. 安装 Docker 和 Docker Compose
已安装且版本符合以下标准的可以跳过安装。

Docker Engine version 18.06.0 or newer
Docker Compose version 1.26.0 or newer (including Compose V2)

这里就不写怎么安装了,如果不会装的,下面的内容也没有看的必要了 ac24

3. 安装 ELK 全家桶

什么是ELK:Elasticsearch, Logstash, and Kibana,一套针对日志数据做解决方案的框架。
我可以不装吗:可以,ElastiFlow 支持 Elasticsearch,Elastic Cloud,Elastic Cloud Enterprise,OpenSearch,AWS OpenSearch Service,Apache Kafka,Confluent Platform,Redpanda,Splunk,Cribl Stream。自己随便挑一个然后研究怎么玩吧。

执行下面指令。某些命令可能需要 sudo 执行

git clone https://github.com/deviantony/docker-elk.git
cd docker-elk
vim .env

.env 文件开头有三个密码,默认是 changeme,请修改成不一样的,强度高的密码。密码稍后会用到,可以先记下来以备复制。
(ELASTIC_PASSWORD, LOGSTASH_INTERNAL_PASSWORD, KIBANA_SYSTEM_PASSWORD)

docker-compose up -d

4. 安装 ElastiFlow
执行下面指令。某些命令可能需要 sudo 执行
以使用 Netflow 为例,如使用 SNMP 请参照官网对应文档

mkdir elastiflow
cd elastiflow
touch docker-compose.yml
vim docker-compose.yml

然后复制粘贴以下内容。配置文件中需要修改的地方会在下文提及。

version: '3'
services:
  # ElastiFlow Unified Flow Collector
  flow-collector:
    image: elastiflow/flow-collector:6.2.2
    container_name: flow-collector
    restart: 'unless-stopped'
    network_mode: 'host'
    volumes:
      - /etc/elastiflow:/etc/elastiflow
    environment:
      EF_LICENSE_ACCEPTED: 'true'
      EF_ACCOUNT_ID: '请替换成你自己的账户ID'
      
      EF_FLOW_LICENSE_KEY: '请替换成你自己的License Key'
      #EF_FLOW_LICENSED_UNITS: 

      #EF_INSTANCE_NAME: default
      #EF_API_PORT: 8080
      #EF_API_TLS_ENABLE: ''
      #EF_API_TLS_CERT_FILEPATH: ''
      #EF_API_TLS_KEY_FILEPATH: ''
      #EF_API_BASIC_AUTH_ENABLE: 'false'
      #EF_API_BASIC_AUTH_USERNAME: ''
      #EF_API_BASIC_AUTH_PASSWORD: ''

      EF_LOGGER_LEVEL: 'info'
      #EF_LOGGER_ENCODING: 'json'
      #EF_LOGGER_FILE_LOG_ENABLE: 'false'
      #EF_LOGGER_FILE_LOG_FILENAME: '/var/log/elastiflow/flowcoll/flowcoll.log'
      #EF_LOGGER_FILE_LOG_MAX_SIZE: 100
      #EF_LOGGER_FILE_LOG_MAX_AGE: ''
      #EF_LOGGER_FILE_LOG_MAX_BACKUPS: 4
      #EF_LOGGER_FILE_LOG_COMPRESS: 'false'

      EF_FLOW_SERVER_UDP_IP: '0.0.0.0'
      EF_FLOW_SERVER_UDP_PORT: 9995
      #EF_FLOW_SERVER_UDP_READ_BUFFER_MAX_SIZE: 134217728

      #EF_FLOW_PACKET_STREAM_MAX_SIZE: 

      EF_AWS_VPC_FLOW_LOG_ENABLE: 'false'
      #EF_AWS_VPC_FLOW_LOG_S3_BUCKET: ''
      #EF_AWS_VPC_FLOW_LOG_PREFIX: 'AWSLogs'
      #AWS_REGION: ''
      #AWS_ACCESS_KEY_ID: ''
      #AWS_SECRET_ACCESS_KEY: ''

      #EF_INPUT_FLOW_BENCHMARK_ENABLE: 'false'
      #EF_INPUT_FLOW_BENCHMARK_PACKET_FILE_PATH: '/etc/elastiflow/benchmark/flow/packets.txt'

      #EF_PROCESSOR_POOL_SIZE: 

      #EF_PROCESSOR_DECODE_IPFIX_ENABLE: 'true'
      #EF_PROCESSOR_DECODE_NETFLOW1_ENABLE: 'true'
      #EF_PROCESSOR_DECODE_NETFLOW5_ENABLE: 'true'
      #EF_PROCESSOR_DECODE_NETFLOW6_ENABLE: 'true'
      #EF_PROCESSOR_DECODE_NETFLOW7_ENABLE: 'true'
      EF_PROCESSOR_DECODE_NETFLOW9_ENABLE: 'true' # 因为ROS默认是Netflow v9
      #EF_PROCESSOR_DECODE_SFLOW5_ENABLE: 'true'
      #EF_PROCESSOR_DECODE_SFLOW_FLOWS_ENABLE: 'true'
      #EF_PROCESSOR_DECODE_SFLOW_FLOWS_KEEP_SAMPLES: 'false'
      #EF_PROCESSOR_DECODE_SFLOW_COUNTERS_ENABLE: 'true'
      #EF_PROCESSOR_DECODE_MAX_RECORDS_PER_PACKET: 64

      #EF_PROCESSOR_TRANSLATE_KEEP_IDS: 'default'

      #EF_PROCESSOR_ENRICH_APP_ID_ENABLE: 'true'
      #EF_PROCESSOR_ENRICH_APP_ID_PATH: '/etc/elastiflow/app/appid.yml'
      #EF_PROCESSOR_ENRICH_APP_ID_TTL: 7200
      #EF_PROCESSOR_ENRICH_APP_IPPORT_ENABLE: 'true'
      #EF_PROCESSOR_ENRICH_APP_IPPORT_PATH: '/etc/elastiflow/app/ipport.yml'
      #EF_PROCESSOR_ENRICH_APP_IPPORT_TTL: 7200
      #EF_PROCESSOR_ENRICH_APP_IPPORT_PRIVATE: 'true'
      #EF_PROCESSOR_ENRICH_APP_IPPORT_PUBLIC: 'false'
      #EF_PROCESSOR_ENRICH_APP_REFRESH_RATE: 15

      #EF_PROCESSOR_ENRICH_IPADDR_TTL: 7200

      EF_PROCESSOR_ENRICH_IPADDR_METADATA_ENABLE: 'false'
      #EF_PROCESSOR_ENRICH_IPADDR_METADATA_USERDEF_PATH: '/etc/elastiflow/metadata/ipaddrs.yml'
      #EF_PROCESSOR_ENRICH_IPADDR_METADATA_REFRESH_RATE: 15

      EF_PROCESSOR_ENRICH_IPADDR_DNS_ENABLE: 'true'
      EF_PROCESSOR_ENRICH_IPADDR_DNS_NAMESERVER_IP: '请替换成你自己的DNS服务器IP'
      EF_PROCESSOR_ENRICH_IPADDR_DNS_NAMESERVER_TIMEOUT: 3000
      #EF_PROCESSOR_ENRICH_IPADDR_DNS_RESOLVE_PRIVATE: 'true'
      #EF_PROCESSOR_ENRICH_IPADDR_DNS_RESOLVE_PUBLIC: 'true'
      #EF_PROCESSOR_ENRICH_IPADDR_DNS_USERDEF_PATH: '/etc/elastiflow/hostname/user_defined.yml'
      #EF_PROCESSOR_ENRICH_IPADDR_DNS_USERDEF_REFRESH_RATE: 15
      #EF_PROCESSOR_ENRICH_IPADDR_DNS_INCLEXCL_PATH: '/etc/elastiflow/hostname/incl_excl.yml'
      #EF_PROCESSOR_ENRICH_IPADDR_DNS_INCLEXCL_REFRESH_RATE: 15

      EF_PROCESSOR_ENRICH_IPADDR_MAXMIND_ASN_ENABLE: 'true'
      #EF_PROCESSOR_ENRICH_IPADDR_MAXMIND_ASN_PATH: '/etc/elastiflow/maxmind/GeoLite2-ASN.mmdb'

      EF_PROCESSOR_ENRICH_IPADDR_MAXMIND_GEOIP_ENABLE: 'true'
      #EF_PROCESSOR_ENRICH_IPADDR_MAXMIND_GEOIP_PATH: '/etc/elastiflow/maxmind/GeoLite2-City.mmdb'
      #EF_PROCESSOR_ENRICH_IPADDR_MAXMIND_GEOIP_VALUES: 'city,country,country_code,location,timezone'
      #EF_PROCESSOR_ENRICH_IPADDR_MAXMIND_GEOIP_LANG: 'en'
      #EF_PROCESSOR_ENRICH_IPADDR_MAXMIND_GEOIP_INCLEXCL_PATH: '/etc/elastiflow/maxmind/incl_excl.yml'
      #EF_PROCESSOR_ENRICH_IPADDR_MAXMIND_GEOIP_INCLEXCL_REFRESH_RATE: 15

      EF_PROCESSOR_ENRICH_IPADDR_RISKIQ_ASN_ENABLE: 'true'
      #EF_PROCESSOR_ENRICH_IPADDR_RISKIQ_ASN_ENDPOINT: 'https://api.passivetotal.org/v2/netflow/as/download'
      #EF_PROCESSOR_ENRICH_IPADDR_RISKIQ_ASN_REFRESH_INTERVAL: 1440
      EF_PROCESSOR_ENRICH_IPADDR_RISKIQ_THREAT_ENABLE: 'true'
      #EF_PROCESSOR_ENRICH_IPADDR_RISKIQ_THREAT_ENDPOINT: 'https://api.passivetotal.org/v2/netflow/blocklist/download'
      #EF_PROCESSOR_ENRICH_IPADDR_RISKIQ_THREAT_REFRESH_INTERVAL: 1440
      #EF_PROCESSOR_ENRICH_IPADDR_RISKIQ_THREAT_INCLEXCL_PATH: '/etc/elastiflow/riskiq/incl_excl.yml'
      #EF_PROCESSOR_ENRICH_IPADDR_RISKIQ_THREAT_INCLEXCL_REFRESH_RATE: 15
      EF_PROCESSOR_ENRICH_IPADDR_RISKIQ_API_USER: '请替换成你自己的RiskIQ账号'
      EF_PROCESSOR_ENRICH_IPADDR_RISKIQ_API_KEY: '请替换成你自己的RiskIQ API Key'
      #EF_PROCESSOR_ENRICH_IPADDR_RISKIQ_API_TIMEOUT: 180

      #EF_PROCESSOR_ENRICH_ASN_PREF: 'lookup'
      
      #EF_PROCESSOR_ENRICH_NETIF_TTL: 7200

      EF_PROCESSOR_ENRICH_NETIF_METADATA_ENABLE: 'false'
      #EF_PROCESSOR_ENRICH_NETIF_METADATA_USERDEF_PATH: '/etc/elastiflow/metadata/ipaddrs.yml'
      #EF_PROCESSOR_ENRICH_NETIF_METADATA_REFRESH_RATE: 15

      EF_PROCESSOR_ENRICH_NETIF_FLOW_OPTIONS_ENABLE: 'true'

      EF_PROCESSOR_ENRICH_NETIF_SNMP_ENABLE: 'false'
      #EF_PROCESSOR_ENRICH_NETIF_SNMP_PORT: 161
      #EF_PROCESSOR_ENRICH_NETIF_SNMP_VERSION: 2
      EF_PROCESSOR_ENRICH_NETIF_SNMP_COMMUNITIES: 'public'
      #EF_PROCESSOR_ENRICH_NETIF_SNMP_TIMEOUT: 2
      #EF_PROCESSOR_ENRICH_NETIF_SNMP_RETRIES: 1

      #EF_PROCESSOR_ENRICH_TOTALS_IF_NO_DELTAS: 'false'

      #EF_PROCESSOR_ENRICH_SAMPLERATE_CACHE_SIZE: 32768
      #EF_PROCESSOR_ENRICH_SAMPLERATE_USERDEF_ENABLE: 'false'
      #EF_PROCESSOR_ENRICH_SAMPLERATE_USERDEF_PATH: '/etc/elastiflow/settings/sample_rate.yml'
      #EF_PROCESSOR_ENRICH_SAMPLERATE_USERDEF_OVERRIDE: 'false'

      #EF_PROCESSOR_ENRICH_COMMUNITYID_ENABLE: 'true'
      #EF_PROCESSOR_ENRICH_COMMUNITYID_SEED: 0
      #EF_PROCESSOR_ENRICH_CONVERSATIONID_ENABLE: 'true'
      #EF_PROCESSOR_ENRICH_CONVERSATIONID_SEED: 0

      #EF_PROCESSOR_ENRICH_JOIN_ASN: 'true'
      #EF_PROCESSOR_ENRICH_JOIN_GEOIP: 'true'
      #EF_PROCESSOR_ENRICH_JOIN_SEC: 'true'
      #EF_PROCESSOR_ENRICH_JOIN_NETATTR: 'true'
      #EF_PROCESSOR_ENRICH_JOIN_SUBNETATTR: 'true'

      #EF_PROCESSOR_DURATION_PRECISION: 'ms'
      #EF_PROCESSOR_TIMESTAMP_PRECISION: 'ms'
      #EF_PROCESSOR_PERCENT_NORM: 100
      #EF_PROCESSOR_EXPAND_CLISRV: 'true'
      #EF_PROCESSOR_EXPAND_CLISRV_NO_L4_PORTS: 'true'
      #EF_PROCESSOR_KEEP_CPU_TICKS: 'false'

      #EF_PROCESSOR_DROP_FIELDS: ''

      # stdout
      #EF_OUTPUT_STDOUT_ENABLE: 'true'
      #EF_OUTPUT_STDOUT_FORMAT: 'json_pretty'

      # monitor
      #EF_OUTPUT_MONITOR_ENABLE: 'false'
      #EF_OUTPUT_MONITOR_INTERVAL: 300

      # Elasticsearch
      EF_OUTPUT_ELASTICSEARCH_ENABLE: 'true' # 因为我们使用的是Elastic框架
      #EF_OUTPUT_ELASTICSEARCH_ECS_ENABLE: 'true'
      #EF_OUTPUT_ELASTICSEARCH_BATCH_DEADLINE: 2000
      #EF_OUTPUT_ELASTICSEARCH_BATCH_MAX_BYTES: 8388608
      #EF_OUTPUT_ELASTICSEARCH_TIMESTAMP_SOURCE: 'collect'
      #EF_OUTPUT_ELASTICSEARCH_INDEX_PERIOD: 'ilm'
      #EF_OUTPUT_ELASTICSEARCH_INDEX_SUFFIX: 'rollover'
      #EF_OUTPUT_ELASTICSEARCH_DROP_FIELDS: ''
      #EF_OUTPUT_ELASTICSEARCH_ALLOWED_RECORD_TYPES: 'as_path_hop,flow_option,flow,telemetry'

      #EF_OUTPUT_ELASTICSEARCH_INDEX_TEMPLATE_ENABLE: 'true'
      #EF_OUTPUT_ELASTICSEARCH_INDEX_TEMPLATE_OVERWRITE: 'true'
      EF_OUTPUT_ELASTICSEARCH_INDEX_TEMPLATE_SHARDS: 1
      EF_OUTPUT_ELASTICSEARCH_INDEX_TEMPLATE_REPLICAS: 0
      #EF_OUTPUT_ELASTICSEARCH_INDEX_TEMPLATE_REFRESH_INTERVAL: '10s'
      #EF_OUTPUT_ELASTICSEARCH_INDEX_TEMPLATE_CODEC: 'best_compression'
      #EF_OUTPUT_ELASTICSEARCH_INDEX_TEMPLATE_ILM_LIFECYCLE: 'elastiflow'
      #EF_OUTPUT_ELASTICSEARCH_INDEX_TEMPLATE_PIPELINE_DEFAULT: '_none'
      #EF_OUTPUT_ELASTICSEARCH_INDEX_TEMPLATE_PIPELINE_FINAL: '_none'

      # A comma separated list of Elasticsearch nodes to use. DO NOT include "http://" or "https://"
      EF_OUTPUT_ELASTICSEARCH_ADDRESSES: '127.0.0.1:9200'
      EF_OUTPUT_ELASTICSEARCH_USERNAME: 'elastic'
      EF_OUTPUT_ELASTICSEARCH_PASSWORD: '这里改成.env里的elastic密码'
      #EF_OUTPUT_ELASTICSEARCH_CLOUD_ID: ''
      #EF_OUTPUT_ELASTICSEARCH_API_KEY: ''
      #EF_OUTPUT_ELASTICSEARCH_CLIENT_CA_CERT_FILEPATH: 
      #EF_OUTPUT_ELASTICSEARCH_CLIENT_CERT_FILEPATH: 
      #EF_OUTPUT_ELASTICSEARCH_CLIENT_KEY_FILEPATH: 

      EF_OUTPUT_ELASTICSEARCH_TLS_ENABLE: 'false'
      EF_OUTPUT_ELASTICSEARCH_TLS_SKIP_VERIFICATION: 'false'
      EF_OUTPUT_ELASTICSEARCH_TLS_CA_CERT_FILEPATH: ''

      #EF_OUTPUT_ELASTICSEARCH_RETRY_ENABLE: 'true'
      #EF_OUTPUT_ELASTICSEARCH_RETRY_ON_TIMEOUT_ENABLE: 'true'
      #EF_OUTPUT_ELASTICSEARCH_MAX_RETRIES: 3
      #EF_OUTPUT_ELASTICSEARCH_RETRY_BACKOFF: 1000

      # OpenSearch
      EF_OUTPUT_OPENSEARCH_ENABLE: 'false'
      EF_OUTPUT_OPENSEARCH_ECS_ENABLE: 'false'
      #EF_OUTPUT_OPENSEARCH_BATCH_DEADLINE: 2000
      #EF_OUTPUT_OPENSEARCH_BATCH_MAX_BYTES: 8388608
      #EF_OUTPUT_OPENSEARCH_TIMESTAMP_SOURCE: 'end'
      #EF_OUTPUT_OPENSEARCH_INDEX_PERIOD: 'daily'
      #EF_OUTPUT_OPENSEARCH_INDEX_SUFFIX: ''
      #EF_OUTPUT_OPENSEARCH_DROP_FIELDS: ''
      #EF_OUTPUT_OPENSEARCH_ALLOWED_RECORD_TYPES: 'as_path_hop,flow_option,flow,telemetry'

      #EF_OUTPUT_OPENSEARCH_INDEX_TEMPLATE_ENABLE: 'true'
      #EF_OUTPUT_OPENSEARCH_INDEX_TEMPLATE_OVERWRITE: 'true'
      EF_OUTPUT_OPENSEARCH_INDEX_TEMPLATE_SHARDS: 1
      EF_OUTPUT_OPENSEARCH_INDEX_TEMPLATE_REPLICAS: 0
      #EF_OUTPUT_OPENSEARCH_INDEX_TEMPLATE_REFRESH_INTERVAL: '10s'
      #EF_OUTPUT_OPENSEARCH_INDEX_TEMPLATE_CODEC: 'best_compression'
      #EF_OUTPUT_OPENSEARCH_INDEX_TEMPLATE_ISM_POLICY: ''
      #EF_OUTPUT_OPENSEARCH_INDEX_TEMPLATE_PIPELINE_DEFAULT: '_none'
      #EF_OUTPUT_OPENSEARCH_INDEX_TEMPLATE_PIPELINE_FINAL: '_none'

      # A comma separated list of OpenSearch nodes to use. DO NOT include "http://" or "https://"
      EF_OUTPUT_OPENSEARCH_ADDRESSES: '127.0.0.1:9200'
      EF_OUTPUT_OPENSEARCH_USERNAME: 'admin'
      EF_OUTPUT_OPENSEARCH_PASSWORD: 'admin'
      #EF_OUTPUT_OPENSEARCH_CLIENT_CA_CERT_FILEPATH: 
      #EF_OUTPUT_OPENSEARCH_CLIENT_CERT_FILEPATH: 
      #EF_OUTPUT_OPENSEARCH_CLIENT_KEY_FILEPATH: 

      EF_OUTPUT_OPENSEARCH_TLS_ENABLE: 'false'
      EF_OUTPUT_OPENSEARCH_TLS_SKIP_VERIFICATION: 'false'
      EF_OUTPUT_OPENSEARCH_TLS_CA_CERT_FILEPATH: ''

      #EF_OUTPUT_OPENSEARCH_RETRY_ENABLE: 'true'
      #EF_OUTPUT_OPENSEARCH_RETRY_ON_TIMEOUT_ENABLE: 'true'
      #EF_OUTPUT_OPENSEARCH_MAX_RETRIES: 3
      #EF_OUTPUT_OPENSEARCH_RETRY_BACKOFF: 1000

      # Splunk
      EF_OUTPUT_SPLUNK_HEC_ENABLE: 'false'
      #EF_OUTPUT_SPLUNK_HEC_CIM_ENABLE: 'false'
      EF_OUTPUT_SPLUNK_HEC_ADDRESSES: '127.0.0.1:8088'
      EF_OUTPUT_SPLUNK_HEC_TOKEN: ''
      #EF_OUTPUT_SPLUNK_HEC_BATCH_MAX_BYTES: 8388608
      #EF_OUTPUT_SPLUNK_HEC_BATCH_DEADLINE: 2000
      #EF_OUTPUT_SPLUNK_HEC_TLS_ENABLE: 'true'
      #EF_OUTPUT_SPLUNK_HEC_TLS_SKIP_VERIFICATION: 'false'
      #EF_OUTPUT_SPLUNK_HEC_TLS_CA_CERT_FILEPATH: ''
      #EF_OUTPUT_SPLUNK_HEC_DROP_FIELDS: ''

      # Kafka
      EF_OUTPUT_KAFKA_ENABLE: 'false'
      EF_OUTPUT_KAFKA_BROKERS: ''
      #EF_OUTPUT_KAFKA_VERSION: '1.0.0'
      #EF_OUTPUT_KAFKA_TOPIC: 'elastiflow-flow-codex'
      #EF_OUTPUT_KAFKA_PARTITION_KEY: 'flow.export.ip.addr'
      #EF_OUTPUT_KAFKA_CLIENT_ID: 'elastiflow-flowcoll'
      #EF_OUTPUT_KAFKA_RACK_ID: ''
      #EF_OUTPUT_KAFKA_TIMEOUT: 30
      #EF_OUTPUT_KAFKA_DROP_FIELDS: ''
      #EF_OUTPUT_KAFKA_ALLOWED_RECORD_TYPES: 'as_path_hop,flow_option,flow,telemetry'
      #EF_OUTPUT_KAFKA_FLAT_RECORD_ENABLE: 'true'

      EF_OUTPUT_KAFKA_SASL_ENABLE: 'false'
      #EF_OUTPUT_KAFKA_SASL_USERNAME: ''
      #EF_OUTPUT_KAFKA_SASL_PASSWORD: ''

      #EF_OUTPUT_KAFKA_TLS_ENABLE: 'false'
      #EF_OUTPUT_KAFKA_TLS_CA_CERT_FILEPATH: ''
      #EF_OUTPUT_KAFKA_TLS_CERT_FILEPATH: ''
      #EF_OUTPUT_KAFKA_TLS_KEY_FILEPATH: ''
      #EF_OUTPUT_KAFKA_TLS_SKIP_VERIFICATION: 'false'

      #EF_OUTPUT_KAFKA_PRODUCER_MAX_MESSAGE_BYTES: 1000000
      #EF_OUTPUT_KAFKA_PRODUCER_REQUIRED_ACKS: 1
      #EF_OUTPUT_KAFKA_PRODUCER_TIMEOUT: 10
      #EF_OUTPUT_KAFKA_PRODUCER_COMPRESSION: 0
      #EF_OUTPUT_KAFKA_PRODUCER_COMPRESSION_LEVEL: -1000
      #EF_OUTPUT_KAFKA_PRODUCER_FLUSH_BYTES: 1000000
      #EF_OUTPUT_KAFKA_PRODUCER_FLUSH_MESSAGES: 1024
      #EF_OUTPUT_KAFKA_PRODUCER_FLUSH_FREQUENCY: 500
      #EF_OUTPUT_KAFKA_PRODUCER_FLUSH_MAX_MESSAGES: 0
      #EF_OUTPUT_KAFKA_PRODUCER_RETRY_MAX: 3
      #EF_OUTPUT_KAFKA_PRODUCER_RETRY_BACKOFF: 100

      # Cribl
      EF_OUTPUT_CRIBL_ENABLE: 'false'
      EF_OUTPUT_CRIBL_ADDRESSES: '127.0.0.1:10080'
      EF_OUTPUT_CRIBL_TOKEN: ''
      #EF_OUTPUT_CRIBL_BATCH_DEADLINE: 2000
      #EF_OUTPUT_CRIBL_BATCH_MAX_BYTES: 8388608
      #EF_OUTPUT_CRIBL_TLS_ENABLE: 'false'
      #EF_OUTPUT_CRIBL_TLS_SKIP_VERIFICATION: 'false'
      #EF_OUTPUT_CRIBL_TLS_CA_CERT_FILEPATH: ''
      #EF_OUTPUT_CRIBL_DROP_FIELDS: ''

      # Generic HTTP
      EF_OUTPUT_GENERIC_HTTP_ENABLE: 'false'
      EF_OUTPUT_GENERIC_HTTP_ECS_ENABLE: 'false'
      #EF_OUTPUT_GENERIC_HTTP_BATCH_DEADLINE: 2000
      #EF_OUTPUT_GENERIC_HTTP_BATCH_MAX_BYTES: 8388608
      EF_OUTPUT_GENERIC_HTTP_ADDRESSES: ''
      #EF_OUTPUT_GENERIC_HTTP_USERNAME: ''
      #EF_OUTPUT_GENERIC_HTTP_PASSWORD: ''
      #EF_OUTPUT_GENERIC_HTTP_TLS_ENABLE: 'false'
      #EF_OUTPUT_GENERIC_HTTP_TLS_SKIP_VERIFICATION: 'false'
      #EF_OUTPUT_GENERIC_HTTP_TLS_CA_CERT_FILEPATH: ''
      #EF_OUTPUT_GENERIC_HTTP_DROP_FIELDS: ''
      #EF_OUTPUT_GENERIC_HTTP_TIMESTAMP_SOURCE: 'end'

      # RiskIQ
      #EF_OUTPUT_RISKIQ_ENABLE: 'false'
      #EF_OUTPUT_RISKIQ_HOST: ''
      #EF_OUTPUT_RISKIQ_PORT: 
      #EF_OUTPUT_RISKIQ_CUSTOMER_UUID: ''
      #EF_OUTPUT_RISKIQ_CUSTOMER_ENCRYPTION_KEY: ''
      EF_OUTPUT_RISKIQ_ENABLE: 'true'
      EF_OUTPUT_RISKIQ_HOST: 'flow.riskiq.net' # 应该大家都是这个地址
      EF_OUTPUT_RISKIQ_PORT: 20000 # 应该大家都是 20000 吧
      EF_OUTPUT_RISKIQ_CUSTOMER_UUID: '这里填写你的RiskIQ UUID'
      EF_OUTPUT_RISKIQ_CUSTOMER_ENCRYPTION_KEY: '这里填写你的RiskIQ 加密密钥'

修改配置文件:

ElastiFlow 授权设置
Line13 EF_ACCOUNT_ID: 点击就送
Line15 EF_FLOW_LICENSE_KEY: 同上,查收邮件

DNS 设置
Line85 EF_PROCESSOR_ENRICH_IPADDR_DNS_NAMESERVER_IP: 换成你的 DNS 服务器地址,应该可以用 1.1.1.1

IP风控、威胁检测服务设置
Line112 EF_PROCESSOR_ENRICH_IPADDR_RISKIQ_API_USER
Line113 EF_PROCESSOR_ENRICH_IPADDR_RISKIQ_API_KEY
Line 327 EF_OUTPUT_RISKIQ_CUSTOMER_UUID
Line 328 EF_OUTPUT_RISKIQ_CUSTOMER_ENCRYPTION_KEY

先去注册 RiskIQ 账号:注册地址
然后参照官网文档中 Get your API Key 章节:文档地址
按照步骤应该就能拿到 API_USER 和 API_KEY,拿到后填入 112 和 113 行。

参照官网文档中 Get your RiskIQ Output Configuration 章节:文档地址
按照步骤应该就能拿到所需的UUID和KEY,拿到后填入 327 和 328 行。

Elastic 密码设置
Line192 EF_OUTPUT_ELASTICSEARCH_PASSWORD: 请填入安装 ELK 全家桶时设置的密码

至此 Docker 配置文件修改结束。


接下来继续进行其他配置:

Maxmind GeoIP 注册:点击注册
获取 License Key:官方文档

Maxmind GeoIP 数据库及自动更新设置:

cd /etc/elastiflow/maxmind # 如果没有目录就自己创一个目录
add-apt-repository ppa:maxmind/ppa # 以 Ubuntu 为例
apt update
apt install geoipupdate
touch GeoIP.config
vim GeoIP.config

复制并粘贴以下内容,保存退出。

# GeoIP.conf file for `geoipupdate` program, for versions >= 3.1.1.
# Used to update GeoIP databases from https://www.maxmind.com.
# For more information about this config file, visit the docs at
# https://dev.maxmind.com/geoip/updating-databases.

# `AccountID` is from your MaxMind account.
AccountID 你的AccountID

# `LicenseKey` is from your MaxMind account
LicenseKey 你的LicenseKey

# `EditionIDs` is from your MaxMind account.
EditionIDs GeoLite2-ASN GeoLite2-City GeoLite2-Country

设置自动更新定时任务:

14 14 * * 6,4 /usr/local/bin/geoipupdate -f /etc/elastiflow/maxmind/GeoIP.config -d /etc/elastiflow/maxmind/

手动运行更新一次:

geoipupdate -f /etc/elastiflow/maxmind/GeoIP.config -d /etc/elastiflow/maxmind/

更新完之后请查看 /etc/elastiflow/maxmind 文件夹下是否有三个 mmdb 文件,如果有则更新成功。


生成 kinaba 密钥,用于创建自定义规则(如5分钟平均带宽高于100M发送邮件告警、调用防火墙接口封禁用户等)

docker container run --rm docker.elastic.co/kibana/kibana:8.6.2 bin/kibana-encryption-keys generate

生成完毕后复制生成的密钥,编辑 docker-elk/kibana/config/kibana.yml 文件,找到 Encryption keys 部分,粘贴到下面。

docker-compose up -d

安装完成后浏览器访问 http://你的ip:5601,能打开网页并能使用 elastic 账号登录成功即可。
(账号名是 elastic,密码是你刚才设置的 ELASTIC_PASSWORD)

注意:不建议将这些服务公开到公网,请设置防火墙或其他安全措施!
注意:不建议将这些服务公开到公网,请设置防火墙或其他安全措施!
注意:不建议将这些服务公开到公网,请设置防火墙或其他安全措施!
楼主的做法是,安装 ElasticFlow 的小鸡不分配公网IP,通过 NAT 上网,安装 Tailscale 通过VPN内网连接SSH/访问Elastic Search

5. 导入 Kibana Objects
这东西就是官方帮你做好的可视化图表和面板,没有这个东西你就看不到帖子一开始的那些截图。

点击下载

下载完成后如果是 txt 格式的话,把 txt 后缀去了,只保留 ndjson,否则上传的时候选不了。

  • 登录 Elastic Search,访问这个链接

http://替换你的ip:5601/app/management/kibana/objects

  • 然后右上角点 Import

  • 选择刚刚下载好的文件上传
  • 上传完成后应该能看到下面多出来很多东西,这就是成功了

至此,全部配置完成。


使用

点击左侧菜单,选择 Analytics-Dashboard,然后在右侧列表中找到 ElastiFlow (flow): Overview,点击即可。

自定义规则

有点长,写不动了,先随便放几张图好了




常见问题

可能哪里有遗漏的地方,这里留着做补充吧。 ac15

12
  • 好贴加精,不知道有没有自带一些规则?比如只允许访问80,443。

    我想我以后去日本拉条家宽,当我不在家的时候分享出去给有需要的mjj落地,家宽解锁漂亮,但是怕他们下载儿童色情或者是盗版,弄不好我就被罚了…对于这个使用情景该如何防范?

  • 好贴 xhj003

  • 膜拜大佬!如果开小鸡的我来一台!

  • 是不是可以直接把dns设置为软路由的,这样所有流量都可以监控了

  • @Just纱世里 #1 不准备商业化的话,仅常用geosite白名单就可以满足大部分使用场景了 xhj001

  • @Just纱世里 #1
    ElastiFlow 本身是没有防火墙功能的,也不会对防火墙/路由产生任何影响,除非手动设定规则通过Webhook调用自己写的接口。

    仅允许用户访问80/443的话,可以在路由器/防火墙层面加一个规则,默认规则 drop 掉全部出站,然后在这个默认规则上面再加一条 accept dst port 80,443。

    盗版一般是BT下载吧,可以收集常见 bt tracker 的地址然后加防火墙黑名单。或者可以试试防火墙带的 L7 过滤功能,把bt协议的包特征加进去然后再过滤(不过我没试过,不知道效果怎么样,性能也不清楚如何

    儿童色情就不知道了,没有了解过 ac01
    如果是bt的话和上面一样处理


    试了下 L7 匹配,效果拔群,一点都下不动,已经给我的小鸡们用上了

  • ROS 玩不来呀

  • 套一个ROS 岂不是流量都走上边过了?

  • 好贴支持

  • 好帖,赞

12

你好啊,陌生人!

我的朋友,看起来你是新来的,如果想参与到讨论中,点击下面的按钮!

📈用户数目📈

目前论坛共有15787位seeker

🎉欢迎新用户🎉