我有一个应用程序,我处理大量的IP地址(分析检查点防火墙规则集).有一次,我想检查特定地址对象是/ 32还是"网络".
目前我这样做:
next unless ip.inspect.match(/\/255\.255\.255\.255/)
它工作但似乎有点低效,但我看不到任何从地址对象中提取掩码的方法.
Ruby核心库的某些部分有时只是勾勒出来的,而IPAddr似乎是其中之一,遗憾的是,它有点不完整.
不用担心.你可以用一个简单的猴子补丁解决这个问题:
class IPAddr def cidr_mask case (@family) when Socket::AF_INET 32 - Math.log2((1<<32) - @mask_addr).to_i when Socket::AF_INET6 128 - Math.log2((1<<128) - @mask_addr).to_i else raise AddressFamilyError, "unsupported address family" end end end
这应该处理IPv4和IPv6地址:
IPAddr.new('151.101.65.69').cidr_mask # => 32 IPAddr.new('151.101.65.69/26').cidr_mask # => 26 IPAddr.new('151.101.65.69/255.255.255.0').cidr_mask # => 24 IPAddr.new('2607:f8b0:4006:800::200e').cidr_mask # => 128 IPAddr.new('2607:f8b0:4006:800::200e/100').cidr_mask # => 100
这不一定是最好的解决方案,但它确实有效.