我的公司有大约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")
答案 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
有一个原因有两个不同的功能,我们还没有记录,但一个使用一些聪明的数学,另一个使用尝试。我会测试每一个,看看哪个更适合生产使用。