2

我正在使用 Ruby NetAddr::Tree 类来保存一堆 CIDR 对象,但我需要一种方法来将 CIDR 对象压缩到更大的子网中。

我想要一种获取 IP 的方法,例如:

12.26.8.0/21
12.26.16.0/21
12.26.24.0/21
12.26.32.0/21
12.26.40.0/21
12.27.152.0/21

并合并树中的相关地址范围,以便输出如下:

12.26.8.0/21
12.26.16.0/20
12.26.32.0/20
12.27.152.0/21

我查看了文档,但找不到任何方法来做到这一点。如果需要,我很高兴不再使用 NEtAddr::Tree,重要的是它需要一个 IP/网络掩码字符串列表,将它们合并并逐行输出。

4

1 回答 1

4

你看过NetAddr::merge吗?

从文档:

给定 CIDR 地址或 NetAddr::CIDR 对象的列表,以最有效的方式合并(汇总)它们。只有当新创建的超网不会导致“创建”新的 IP 空间时,才会进行汇总。例如,以下块(192.168.0.0/24、192.168.1.0/24 和 192.168.2.0/24)将汇总到 192.168.0.0/23 和 192.168.2.0/24 而不是 192.168.0.0/22

require 'netaddr'
require 'pp'

pp NetAddr.merge(
  %w[
    12.26.8.0/21
    12.26.16.0/21
    12.26.24.0/21
    12.26.32.0/21
    12.26.40.0/21
    12.27.152.0/21
  ].map{ |ip| NetAddr::CIDR.create(ip) }
)

=> ["12.26.8.0/21", "12.26.16.0/20", "12.26.32.0/20", "12.27.152.0/21"]
于 2012-10-03T14:20:28.087 回答