Azure Data Explorer:用ipv4_is_in_any_range确定IP所属具体范围
Kusto中匹配IP到具体IP范围并关联元数据的方法
针对你遇到的问题,这里提供两种可行的实现方案,均适配250个IP范围的场景:
方法一:交叉连接+范围过滤
利用Kusto的cross join做笛卡尔积(因IP范围仅250个,性能开销可忽略),再通过ipv4_is_in_range筛选匹配的记录,最终关联元数据。
基础实现代码
// 替换为你的实际表名和列名 IPTable | cross join IPRanges | where ipv4_is_in_range(ClientIP, IPRange) | project ClientIP, IPRange, Metadata
处理IP多范围匹配(可选)
若存在IP同时属于多个范围的情况,可筛选出最精确的子网范围(前缀长度最长):
IPTable | cross join IPRanges | where ipv4_is_in_range(ClientIP, IPRange) // 提取子网前缀长度,用于排序 | extend PrefixLength = toint(split(IPRange, "/")[1]) // 按IP分组,取前缀最长的匹配项 | partition by ClientIP ( order by PrefixLength desc | take 1 ) | project ClientIP, IPRange, Metadata
方法二:动态数组展开+匹配
将IP范围与元数据打包成动态数组,通过mv-expand展开后做匹配,适合范围列表需临时定义的场景。
实现代码
// 定义包含元数据的IP范围数组,替换为你的实际数据 let ip_ranges = dynamic([ {"Range": "10.0.0.0/8", "Meta": "内网A区"}, {"Range": "172.16.0.0/12", "Meta": "内网B区"}, {"Range": "192.168.0.0/16", "Meta": "内网C区"} ]); IPTable | mv-expand ip_range = ip_ranges | extend IPRange = tostring(ip_range.Range), Metadata = tostring(ip_range.Meta) | where ipv4_is_in_range(ClientIP, IPRange) | project ClientIP, IPRange, Metadata
说明
两种方案的性能在250个IP范围的场景下均表现良好;若后续范围数量大幅增长,可将IP和范围转换为整数型的起止值,通过数值范围匹配进一步优化性能。
内容的提问来源于stack exchange,提问作者Pranav Addepalli
相关产品推荐
相关产品推荐

