首页 > 解决方案 > CIDR 重叠不可能的结果 Python

问题描述

我无法解释以下内容。Cloudformation 告诉我我的子网重叠。我简直不敢相信,所以我在 python 中对其进行了测试。这就是我得到的:

In [0]: import ipaddr

In [12]: ipaddr.IPNetwork('10.0.128.0/23').overlaps(ipaddr.IPNetwork('10.0.136.0/20'))
Out[12]: True

In [18]: ipaddr.IPNetwork('10.0.128.0/23').overlaps(ipaddr.IPNetwork('10.0.144.0/20'))
Out[18]: False

In [19]: ipaddr.IPNetwork('10.0.128.0/23').overlaps(ipaddr.IPNetwork('10.0.143.0/20'))
Out[19]: True
In [0]: import ipaddr

In [20]: ipaddr.IPNetwork('10.0.134.0/23').overlaps(ipaddr.IPNetwork('10.0.136.0/20'))
Out[20]: True

In [22]: ipaddr.IPNetwork('10.0.134.0/23').overlaps(ipaddr.IPNetwork('10.0.144.0/20'))
Out[22]: False

In [23]: ipaddr.IPNetwork('10.0.134.0/23').overlaps(ipaddr.IPNetwork('10.0.143.0/20'))
Out[23]: True

这根本不可能是这样,不是吗?首先,10.0.134.0/23 的最后一个 IP 地址应该是 10.0.135.255。所以它不应该与 10.0.136.0/20 重叠。

但是,类似地,根据这个程序,为什么两个 CIDR 都应该在 10.0.144.0 结束?

程序根本不可靠吗?

注意:新库ipaddress似乎同意。

标签: pythonnetworkingcidr

解决方案


10.0.136.0不是/20网络的开始。它位于网络的中间10.0.128.0/20,范围从10.0.128.010.0.143.255。这显然与10.0.134.0/23.

ipaddress模块对此进行检查。ipaddress.ip_network('10.0.136.0/20')引发异常:

ValueError: 10.0.136.0/20 已设置主机位

您可以使用该选项禁止检查strict=False,但您不会收到有关该问题的警告。但是,如果您查看返回的值,您会看到地址范围从哪里开始。

>>> print(ipaddress.ip_network('10.0.136.0/20', strict=False))
10.0.128.0/20

网络/20有第三个八位字节,是 16 的倍数。


推荐阅读