鉴于两个CIDR地址分别为192.168.2.0/14和192.168.2.0/32
如何在“python2.6”中检查两个ip地址是否重叠?
我已经通过netaddr,它允许检查是否
,192.168.2.0在CIDR地址192.168.2.0/14中from netaddr import IPNetwork, IPAddress
bool = IPAddress("192.168.2.0") in IPNetwork("192.168.2.0/14"):
但是如何检查两个CIDR地址??
我找到了一个引用:: How can I check if an ip is in a network in python
答案 0 :(得分:17)
使用ipaddr:
>>> import ipaddr
>>> n1 = ipaddr.IPNetwork('192.168.1.0/24')
>>> n2 = ipaddr.IPNetwork('192.168.2.0/24')
>>> n3 = ipaddr.IPNetwork('192.168.2.0/25')
>>> n1.overlaps(n2)
False
>>> n1.overlaps(n3)
False
>>> n2.overlaps(n3)
True
>>> n2.overlaps(n1)
False
答案 1 :(得分:5)
我假设您实际上希望两个CIDR都表示范围,即使在您的示例中,192.168.2.0 / 32仅代表一个地址。另请注意,在192.168.2.0/14中,.2。没有意义,因为14位前缀没有达到第三个八位字节。
无论如何,有几种方法可以做到这一点。您可能会注意到,要使它们重叠,必须始终是另一个的子集:
def cidrsOverlap(cidr0, cidr1):
return cidr0 in cidr1 or cidr1 in cidr0
或者您可以注意到,对于要重叠的范围,第一个范围的最低地址必须小于或等于第二个范围的最高地址,反之亦然。因此:
def cidrsOverlap(cidr0, cidr1):
return cidr0.first <= cidr1.last and cidr1.first <= cidr0.last
print cidrsOverlap(IPNetwork('192.168.2.0/24'), IPNetwork('192.168.3.0/24'))
# prints False
print cidrsOverlap(IPNetwork('192.168.2.0/23'), IPNetwork('192.168.3.0/24'))
# prints True
答案 2 :(得分:1)
如果没有netaddr
用于测试,但我认为您可以检查第一个网络的first和last地址是否都包含在第二个网络中:< / p>
net_1 = IPNetwork("192.168.2.0/14")
net_2 = IPNetwork("192.168.2.0/32")
if net_1.first in net_2 and net_1.last in net_2:
# do something
BTW,IPNetwork
line 1102定义了__contains__
方法。但我不确定line 1127是否没有被打破?如果存在错误,您应该测试并报告错误。
答案 3 :(得分:0)
我基于netaddr
库编写了this个简单的命令行工具。
pip install ipconflict
示例:
ipconflict 10.0.0.0/22 10.0.1.0/24
输出:
conflict found: 10.0.1.0/24 <-> 10.0.1.0/22