You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 13:55:03