前言
众所周知,一个成功的 One Man 不能没有一个流量审计系统,就好像西方不能没有耶路撒冷。
最近搞了一台独服来跑自己的一些系统,顺便想把多余的资源开成小鸡卖以最大化利用资源。但是又担心小鸡被黑变成肉鸡,爆扫全网DDCC之类的事情发生(实际真的发生了)。于是就想整一套流量审计系统,能在小鸡流量不正常的时候提醒我甚至帮我自动封禁。
那么在经过几天的研究和对比之后,ElastiFlow 方案脱颖而出,优点有三:
- 免费
- UI好看
- 能调用外部接口发送告警信息、控制防火墙规则、小鸡限流等。
当然,最主要的还是免费,注册后即享 Basic License。下文截图均来自于 Basic License.
系统截图
威胁情报
显示对你的小鸡进行爆扫或攻击的源IP地址以及攻击类别。
楼主备注:可以写个脚本自动封禁扫描机器人,每隔一段时间提取排名前几的IP加入到防火墙黑名单。
流量(连接)记录
显示小鸡产生的连接/会话记录,包括连接发起方、双端IP地址/ASN/端口、连接跑了多少流量/发了多少个包。全部字段类型可见文章结尾的示例。
可使用查询语句筛选查询,截图中是查询某一台小鸡流量大于10KB的连接。
更酷炫的流量图
还有其他种类的流量图,比如根据地理位置显示、根据AS显示等,由于篇幅限制,这里随便挑两张图。
楼主备注:根据AS显示个人感觉挺有用的,特别是拿来科学的流量,在图里会很显眼。例如去往 Telegram ASN 的流量和 China Unicom ASN 的流量同时长出来了一截
这几天有一只小鸡以稳定间隔从 Cloudflare 拉数据,就是图里那一截截的绿色柱子
安装方法
由于个人喜欢用 Docker 的原因,以下教程均基于 Docker。不想用的可以去看官方教程手动安装。
使用系统为 Ubuntu 22.04 LTS。
安装需求
- 【必需】会 Linux 基本操作,有折腾的心。
- 【必需】支持 SNMP 或 Netflow 的设备一台,用于收集并发送网络信息给 ElastiFlow 处理。
例如防火墙、交换机、路由器等。
楼主的例子:楼主在母鸡上开了一个 Mikrotik RouterOS (ROS,一个路由器系统)小鸡,其他全部小鸡的流量都经过这台 ROS 处理。ROS 开启 Netflow 发送数据给 ElastiFlow 即可。下文将以 ROS 示例。 - 【必需】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 Flows
和 Active 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)
这里就不写怎么安装了,如果不会装的,下面的内容也没有看的必要了
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
,点击即可。
自定义规则
有点长,写不动了,先随便放几张图好了
常见问题
可能哪里有遗漏的地方,这里留着做补充吧。
好贴加精,不知道有没有自带一些规则?比如只允许访问80,443。
我想我以后去日本拉条家宽,当我不在家的时候分享出去给有需要的mjj落地,家宽解锁漂亮,但是怕他们下载儿童色情或者是盗版,弄不好我就被罚了…对于这个使用情景该如何防范?
好贴
膜拜大佬!如果开小鸡的我来一台!
是不是可以直接把dns设置为软路由的,这样所有流量都可以监控了
@Just纱世里 #1 不准备商业化的话,仅常用geosite白名单就可以满足大部分使用场景了
@Just纱世里 #1
ElastiFlow 本身是没有防火墙功能的,也不会对防火墙/路由产生任何影响,除非手动设定规则通过Webhook调用自己写的接口。
仅允许用户访问80/443的话,可以在路由器/防火墙层面加一个规则,默认规则 drop 掉全部出站,然后在这个默认规则上面再加一条 accept dst port 80,443。
盗版一般是BT下载吧,可以收集常见 bt tracker 的地址然后加防火墙黑名单。或者可以试试防火墙带的 L7 过滤功能,把bt协议的包特征加进去然后再过滤(不过我没试过,不知道效果怎么样,性能也不清楚如何
儿童色情就不知道了,没有了解过
如果是bt的话和上面一样处理
试了下 L7 匹配,效果拔群,一点都下不动,已经给我的小鸡们用上了
ROS 玩不来呀
套一个ROS 岂不是流量都走上边过了?
好贴支持
好帖,赞