我的硬件防火墙不接受大于 /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 一样多。
如果你想写一点 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
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