【问题标题】:Ruby IPAddr: find address maskRuby IPAddr:查找地址掩码
【发布时间】:2017-01-12 03:46:58
【问题描述】:

我有一个处理大量 IP 地址的应用程序(分析检查点防火墙规则集)。有一次我想检查一个特定的地址对象是 /32 还是“网络”。

目前我正在这样做:

next unless ip.inspect.match(/\/255\.255\.255\.255/)

它可以工作,但似乎效率低下,但我看不到任何从地址对象中提取掩码的方法。

【问题讨论】:

  • 您不能在不知道掩码或拥有其他某种数据的情况下执行此操作。 192.168.1.0 是 IP 还是网络?它可能是 /23 的一部分。你能举出更好、更完整的例子吗?
  • 这很奇怪,确实没有网络掩码的访问器。您可以通过不对整个字符串进行Regexp 匹配来提高代码效率:ip.inspect.end_with?('/255.255.255.255>'),但这就是您所能做的。
  • Jorg:谢谢,这肯定比 RE 调用更快!
  • Tadman:关键是 IPAddr 类将网络掩码存储为每个对象的一部分,但似乎没有任何明显的方法可以访问它。在我的应用程序中,我混合了从 /32 到 /8 的网络掩码,其中 /32s 是我需要检查的特殊情况。
  • @tadman:或者拿点盐和一瓶龙舌兰酒。

标签: ruby ip-address


【解决方案1】:

我知道这是一个 3 年前的问题,但这是我在 Google 上搜索时的第一个结果,所以我想提供一个新答案。

我今天在控制台玩,注意到IPAddr 对象上的prefix 方法将 cidr 掩码返回为整数。

所以,例如:

ip = IPAddr.new("192.168.1.0/24")
ip.prefix 
  # => 24

事实证明,类型强制为您提供了地址和掩码的整数表示,因此您可以对 to_i、to_json、as_json 或 instance_values 的输出进行数学运算。

以网络地址为例:

ip.to_i 
  # => 3232235776

ip.to_i.to_s(2) 
  # => "11000000101010000000000100000000"

还有一个带有网络掩码的:

ip.as_json 
  # => {"family"=>2, "addr"=>3232235776, "mask_addr"=>4294967040}

ip.as_json["mask_addr"].to_s(2) 
  # => 11111111111111111111111100000000

ip.as_json["mask_addr"].to_s(2).count("1")
  # => 24

【讨论】:

    【解决方案2】:

    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
    

    这里不一定是最好的解决方案,但它确实有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-06
      • 2015-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-28
      相关资源
      最近更新 更多