将通配符子网转换为最小的CIDR子网列表。

3
我需要将通配符子网转换为最小CIDR子网列表。 例如:
1.2.3.4/255.0.255.0
converted to
1.0.3.0/24
1.1.3.0/24
1.2.3.0/24
1.3.3.0/24
...
1.254.3.0/24
1.255.3.0/24

上面的例子很简单,但对于像1.2.3.4/252.0.128.0这样的通配符子网更加复杂。
在Java中是否有相应的库?
提前致谢。

1
您的输入是字符串还是数字数据类型? - coredump
子网掩码252.0.128.0无效。以点十进制格式表示的数字必须由连续的1位组成,才能成为有效的网络掩码。 - coredump
但它可以在iptables中使用,因此这是可能的,例如规则: iptables -A INPUT -s 10.0.0.0/252.0.128.0 -j ACCEPT 我需要进行此转换以便在ipset中使用这些子网。因此,它实际上是有效的。 - denizeren
我的输入是字符串数据类型。 - denizeren
3个回答

3
您可以使用来自ApacheSubnetUtils
它有一个构造函数SubnetUtils(String address, String mask),该函数接受两个字符串作为参数,即目标IP和网络掩码。
然后,您可以使用嵌套类SubnetUtilsInfo及其方法获取所需内容。

0

在Python中将通配符转换为前缀

address = Address("1.2.3.4 255.0.255.0")
prefixes = address.prefixes()
print(prefixes)  
# ['0.2.0.4/32', 
#  '0.2.1.4/32', 
#  '0.2.2.4/32', 
#  ...

0
TCP/IP中使用了3种类型的掩码。子网掩码、简单位掩码和通配符掩码。子网掩码必须是连续的,即一系列1后跟一系列0。自1991年以来(RFC 1219),它一直是这样的。使用此掩码是为了使设备了解所讨论的子网的网络号、广播号和有效主机。简单位掩码用于访问控制,并允许不连续。Cisco ASA防火墙、iptables和其他系统使用这些类型的掩码来测试IP地址的某些部分。例如,10.1.0.254 255.255.0.255测试第一个八位组为10,第二个为1,第四个为254,但第三个八位组的值可以是0-255。通配符掩码是一个反转的简单位掩码,通常用于Cisco路由器和交换机。这些也允许不连续。使用前面的示例,我们会反转掩码以获得10.1.0.254 0.0.255.0的测试。这个测试与之前的示例相同,我们关心八位组1、2和4是否匹配精确值,但八位组3可能会变化。
所有这些中的关键点是你正在尝试转换两个不同的东西。子网掩码的用途与简单位掩码/通配符掩码的用途不同。从一个转换到另一个是不可能的。即使简单/通配符掩码是连续的,该掩码也可能不代表实际使用的子网掩码。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接