Logstash(ELK)无DNS/AD时基于本地文件实现IP主机名富化方法
ELK栈实现IP->Hostname静态映射富化方案
ELK栈原生支持和Splunk lookup完全等价的静态映射能力,不需要依赖DNS、AD等外部查询服务,直接用你准备好的CSV文件就能实现IP到主机名的富化,两种常用落地方式按需选择即可。
方案1:Logstash摄入阶段富化(推荐,性能最优)
该方案在数据写入Elasticsearch前就完成字段富化,查询时不需要额外计算,是生产环境最常用的实现方式。
- 预处理CSV文件
将现有映射文件整理为标准两列格式,表头固定为ip和hostname即可,示例格式:
将整理好的文件放到Logstash进程有读取权限的路径下,比如ip,hostname 192.168.1.10,prod-web-01 192.168.1.12,prod-mysql-01 10.0.2.45,office-pc-wangwu/etc/logstash/conf.d/ip_hostname_map.csv。 - 配置Logstash translate过滤器
translate是Logstash内置的静态键值映射插件,不需要额外安装,直接在处理Zeek/Suricata日志的filter段添加如下配置即可:filter { # 源IP映射,新增src_hostname字段,不覆盖原始src_ip translate { field => "src_ip" # 替换为你日志中实际存储源IP的字段名,比如Zeek对应id.orig_h target => "src_hostname" dictionary_path => "/etc/logstash/conf.d/ip_hostname_map.csv" exact => true refresh_interval => 300 # 每5分钟自动重载CSV文件,更新映射无需重启Logstash fallback => "unknown-host" # 无匹配时的默认值,不需要可删除该行 } # 目的IP映射,新增dest_hostname字段 translate { field => "dest_ip" # 替换为你日志中实际存储目的IP的字段名,比如Zeek对应id.resp_h target => "dest_hostname" dictionary_path => "/etc/logstash/conf.d/ip_hostname_map.csv" exact => true refresh_interval => 300 fallback => "unknown-host" } }如果日志中IP字段为数组格式(比如部分Zeek日志记录的多IP场景),在对应translate块中添加
iterate_on => ["你的IP字段名"]参数,插件会自动遍历数组内所有IP完成匹配。 - 验证配置后重启Logstash,后续新摄入的日志会自动携带
src_hostname、dest_hostname字段,Kibana中检索、做可视化时直接调用这两个字段即可。
方案2:Elasticsearch Enrich策略富化(适合无Logstash配置权限的场景)
如果不方便调整Logstash配置,可以直接在Elasticsearch层实现映射,效果和摄入阶段富化一致:
- 将CSV文件导入Elasticsearch生成静态查找索引,比如命名为
ip_hostname_lookup,索引中每个文档仅需包含ip、hostname两个字段。 - 在Kibana Dev Tools中创建匹配类型的Enrich策略:
执行以下命令让策略生效:PUT /_enrich/policy/ip_hostname_map_policy { "match": { "indices": "ip_hostname_lookup", "match_field": "ip", "enrich_fields": ["hostname"] } }POST /_enrich/policy/ip_hostname_map_policy/_execute - 创建Ingest摄入管道,将管道和Zeek/Suricata对应的日志索引绑定,新写入的数据会自动匹配IP添加hostname字段;历史数据可以通过
_update_by_query接口重跑管道完成补全。
注意事项
- 不建议直接用hostname覆盖原始IP字段,网络安全排查场景下原始IP是必要的溯源依据,在Kibana中配置展示字段时优先选hostname即可,体验和替换IP完全一致。
- 映射性能无瓶颈:Logstash translate插件会将整个CSV加载到内存中做哈希匹配,即使是十万级别的IP映射条目,处理延迟也在微秒级,远高于外部DNS查询的性能。
- CSV更新不需要重启服务:Logstash侧会按配置的
refresh_interval自动重载文件;ES Enrich侧只要更新lookup索引中的数据,重新执行策略生效命令即可同步新映射关系。
内容的提问来源于stack exchange,提问作者David Decker
相关产品推荐
相关产品推荐

