将较大的 CIDR(例如 /16)转换为 /24

问题描述 投票:0回答:2

我的硬件防火墙不接受大于 /24 的 CIDR 条目。我经常需要阻止更大的范围(例如 /17 或 /20),但是输入所有这些 /24 CIDR 是不切实际的。

我希望有人有办法做到这一点——可以使用在线工具,可以安装在 Linux 服务器上的东西,可以安装在 Windows 计算机上的东西,或者如果可能的话,甚至可以使用 Excel 技巧。我很绝望。

例子:

我要输入这个:192.168.0.0/17

然后得到这样的结果:

192.168.0.0/24

192.168.1.0/24

192.168.2.0/24

192.168.3.0/24

192.168.4.0/24

...一直到...

192.168.127.0/24

这个工具有点像我想要的,但是结果中有太多额外的数据,清理它和手动输入每个 /24 一样多。

http://jodies.de/ipcalc?host=192.168.0.0&mask1=17&mask2=24

ip converters cidr
2个回答
0
投票

如果你想写一点 Java,那么下面的代码,使用 IPAddress Java 库(免责声明:我是项目经理)处理这个。如果您不懂 Java 编程,那么您需要从 Java 速成班开始。

IPAddress addr = new IPAddressString("192.168.0.0/17").getAddress();
IPAddress shifted = addr.adjustPrefixLength(7, false);
Iterator<? extends IPAddress> iterator = shifted.prefixBlockIterator();
while(iterator.hasNext()) {
    System.out.println(iterator.next());
}

输出:

192.168.0.0/24
192.168.1.0/24
192.168.2.0/24
192.168.3.0/24
...
192.168.125.0/24
192.168.126.0/24
192.168.127.0/24

0
投票

Python 版本。

import ipaddress

# +network+  str or Network object
# +prefix+  int number of bits desired in result Networks.
# Returns a flat list of Networks up to prefixlen.
#
# Ex explode_to('192.168.0.0/22', 24)
# => [IPv4Network('192.168.0.0/24'), IPv4Network('192.168.1.0/24')]
def explode_to(network, prefixlen=24):
    if isinstance(network, str):
        network = ipaddress.ip_network(network)
    if network.prefixlen == prefixlen:
        return [network];
    subnets = [explode_to(sub, prefixlen) for sub in network.subnets()]
    return  [nwk for sublist in subnets for nwk in sublist] # flatten   
© www.soinside.com 2019 - 2024. All rights reserved.