ipv4_lookup 插件

ipv4_lookup 插件会在查找表中查找 IPv4 值,并返回具有匹配值的行。 该插件通过 evaluate 运算符调用。

语法

Tevaluateipv4_lookup(LookupTable,SourceIPv4Key,IPv4LookupKey [,ExtraKey1 [.. ,ExtraKeyN [,return_unmatched ]]] ),,

参数

客户 类型​​ 必需 说明
T string 表格输入,其列 SourceIPv4Key 将用于 IPv4 匹配。
LookupTable string 具有 IPv4 查找数据的表或表格表达式,其列 LookupKey 将用于 IPv4 匹配。 可以使用 IP 前缀表示法对 IPv4 值进行掩码操作。
SourceIPv4Key string T 的列,其中包含的 IPv4 字符串需在 LookupTable 中查找。 可以使用 IP 前缀表示法对 IPv4 值进行掩码操作。
IPv4LookupKey string LookupTable 的列,其中包含的 IPv4 字符串与每个 SourceIPv4Key 值相匹配。
ExtraKey1 .. ExtraKeyN string 用于查找匹配项的其他列引用。 与 join 运算类似:具有相等值的记录将被视为匹配。 列名引用必须同时存在于源表 TLookupTable 中。
return_unmatched bool 一个布尔标志,用于定义结果是应包含所有行还是仅包含匹配的行(默认值:false - 仅返回匹配的行)。

IP 前缀表示法

IP 前缀表示法(也称 CIDR 表示法)是表示 IP 地址及其关联网络掩码的简明方式。 格式为 <base IP>/<prefix length>,其中,前缀长度是网络掩码中前导 1 位的数目。 前缀长度决定了属于该网络的 IP 地址范围。

对于 IPv4,前缀长度是介于 0 和 32 之间的数字。 因此,表示法 192.168.2.0/24 表示 IP 地址 192.168.2.0,且网络掩码为 255.255.255.0。 此网络掩码具有 24 个前导 1 位,或者说前缀长度为 24。

对于 IPv6,前缀长度是介于 0 和 128 之间的数字。 因此,表示法 fe80::85d:e82c:9446:7994/120 表示 IP 地址 fe80::85d:e82c:9446:7994 且网络掩码为 ffff:ffff:ffff:ffff:ffff:ffff:ffff:ff00。 此网络掩码具有 120 个前导 1 位,或者说前缀长度为 120。

返回

ipv4_lookup 插件会返回基于 IPv4 密钥进行联接(查找)的结果。 该表的架构是源表与查找表的并集,类似于 lookup 运算符的结果。

如果 return_unmatched 参数设置为 ,则生成的表会同时包含匹配的行和不匹配的行(使用 null 进行填充)。

如果 return_unmatched 参数设置为 或已省略(使用默认值 false),则生成的表的记录数将与匹配的结果数相同。 与 return_unmatched=true 执行相比,此查找变体具有更好的性能。

注意

  • 此插件涵盖基于 IPv4 的联接的方案,假设查找表较小(10-20 万行),输入表可以较大。
  • 插件的性能将取决于查找表和数据源表的大小、列数和匹配记录数。

示例

IPv4 查找 - 仅匹配行

// IP lookup table: IP_Data
// Partial data from: https://raw.githubusercontent.com/datasets/geoip2-ipv4/master/data/geoip2-ipv4.csv
let IP_Data = datatable(network:string, continent_code:string ,continent_name:string, country_iso_code:string, country_name:string)
[
  "111.68.128.0/17","AS","Asia","JP","Japan",
  "5.8.0.0/19","EU","Europe","RU","Russia",
  "223.255.254.0/24","AS","Asia","SG","Singapore",
  "46.36.200.51/32","OC","Oceania","CK","Cook Islands",
  "2.20.183.0/24","EU","Europe","GB","United Kingdom",
];
let IPs = datatable(ip:string)
[
  '2.20.183.12',   // United Kingdom
  '5.8.1.2',       // Russia
  '192.165.12.17', // Unknown
];
IPs
| evaluate ipv4_lookup(IP_Data, ip, network)

输出

ip network continent_code continent_name country_iso_code country_name
2.20.183.12 2.20.183.0/24 EU 欧洲 GB United Kingdom
5.8.1.2 5.8.0.0/19 EU 欧洲 RU 俄罗斯

IPv4 查找 - 同时返回匹配行和非匹配行

// IP lookup table: IP_Data
// Partial data from: 
// https://raw.githubusercontent.com/datasets/geoip2-ipv4/master/data/geoip2-ipv4.csv
let IP_Data = datatable(network:string,continent_code:string ,continent_name:string ,country_iso_code:string ,country_name:string )
[
    "111.68.128.0/17","AS","Asia","JP","Japan",
    "5.8.0.0/19","EU","Europe","RU","Russia",
    "223.255.254.0/24","AS","Asia","SG","Singapore",
    "46.36.200.51/32","OC","Oceania","CK","Cook Islands",
    "2.20.183.0/24","EU","Europe","GB","United Kingdom",
];
let IPs = datatable(ip:string)
[
    '2.20.183.12',   // United Kingdom
    '5.8.1.2',       // Russia
    '192.165.12.17', // Unknown
];
IPs
| evaluate ipv4_lookup(IP_Data, ip, network, return_unmatched = true)

输出

ip network continent_code continent_name country_iso_code country_name
2.20.183.12 2.20.183.0/24 EU 欧洲 GB United Kingdom
5.8.1.2 5.8.0.0/19 EU 欧洲 RU 俄罗斯
192.165.12.17

IPv4 查找 - 在 external_data() 中使用源

let IP_Data = external_data(network:string,geoname_id:long,continent_code:string,continent_name:string ,country_iso_code:string,country_name:string,is_anonymous_proxy:bool,is_satellite_provider:bool)
    ['https://raw.githubusercontent.com/datasets/geoip2-ipv4/master/data/geoip2-ipv4.csv'];
let IPs = datatable(ip:string)
[
    '2.20.183.12',   // United Kingdom
    '5.8.1.2',       // Russia
    '192.165.12.17', // Sweden
];
IPs
| evaluate ipv4_lookup(IP_Data, ip, network, return_unmatched = true)

输出

ip network geoname_id continent_code continent_name country_iso_code country_name is_anonymous_proxy is_satellite_provider
2.20.183.12 2.20.183.0/24 2635167 EU 欧洲 GB 英国 0 0
5.8.1.2 5.8.0.0/19 2017370 EU 欧洲 RU 俄罗斯 0 0
192.165.12.17 192.165.8.0/21 2661886 EU 欧洲 SE 瑞典 0 0

IPv4 查找 - 使用额外的列进行匹配

let IP_Data = external_data(network:string,geoname_id:long,continent_code:string,continent_name:string ,country_iso_code:string,country_name:string,is_anonymous_proxy:bool,is_satellite_provider:bool)
    ['https://raw.githubusercontent.com/datasets/geoip2-ipv4/master/data/geoip2-ipv4.csv'];
let IPs = datatable(ip:string, continent_name:string, country_iso_code:string)
[
    '2.20.183.12',   'Europe', 'GB', // United Kingdom
    '5.8.1.2',       'Europe', 'RU', // Russia
    '192.165.12.17', 'Europe', '',   // Sweden is 'SE' - so it won't be matched
];
IPs
| evaluate ipv4_lookup(IP_Data, ip, network, continent_name, country_iso_code)

输出

ip continent_name country_iso_code network geoname_id continent_code country_name is_anonymous_proxy is_satellite_provider
2.20.183.12 欧洲 GB 2.20.183.0/24 2635167 EU 英国 0 0
5.8.1.2 欧洲 RU 5.8.0.0/19 2017370 EU 俄罗斯 0 0