检查IP地址列表是否属于R中CIDR标记的IP块列表

时间:2016-09-26 15:43:37

标签: r

我的公司有大约200个CIDR IP块的列表。我正在尝试验证网页访问者(每天几千次点击)是否来自这些块。理想情况下,我想要的输出是不在范围内的百分比和这些IP的列表,所以我可以进一步检查它们。

我从iptools包中找到了ip_in_range()函数,但它是1比1的比较。我认为某种lapply或其他循环应该能够实现我想要的,但我是一个新手,到目前为止还没有能够提出正确的符号。我相信我会想要IP#1并针对各种CIDR进行测试。一旦它变为TRUE,它就可以被停止,但这不会经常重复,所以我不能只循环遍历所有块。然后循环将转到IP#2并再次运行。说实话,我的故障率预计会很低,即使每个IP旁边只有一个TRUE和FALSE输出就足以让我手动拔出故障。

我知道必须有一些通用方法来循环一个需要2个输入的函数,我只是想不出用正确的方法来搜索搜索以找到任何东西。

示例数据:

visitor_ip_addresses <- c("10.10.1.2", "10.34.21.4", "192.168.23.34", "172.16.34.78", "1.2.3.4", "192.168.4.6")
ip_ranges <- c("10.0.0.0/8", "192.168.0.0/16", "172.16.0.0/12")

1 个答案:

答案 0 :(得分:2)

devtools::install_github("hrbrmstr/iptools")

library(iptools)

visitor_ip_addresses <- c("10.10.1.2", "10.34.21.4", "192.168.23.34",
                          "172.16.34.78", "1.2.3.4", "192.168.4.6")

ip_ranges <- c("10.0.0.0/8", "192.168.0.0/16", "172.16.0.0/12")

ips_in_cidrs(visitor_ip_addresses, ip_ranges)
## [1]  TRUE  TRUE  TRUE  TRUE FALSE  TRUE

ip_in_any(visitor_ip_addresses, ip_ranges)
## # A tibble: 6 × 2
##             ips in_cidr
##           <chr>   <lgl>
## 1     10.10.1.2    TRUE
## 2    10.34.21.4    TRUE
## 3 192.168.23.34    TRUE
## 4  172.16.34.78    TRUE
## 5       1.2.3.4   FALSE
## 6   192.168.4.6    TRUE

有一个原因有两个不同的功能,我们还没有记录,但一个使用一些聪明的数学,另一个使用尝试。我会测试每一个,看看哪个更适合生产使用。