2013-06-20 12 views
7

2つのCIDRアドレスが192.168.2.0/14と192.168.2.0/32と答えた場合2つのCIDRアドレスが交差していないか確認してください。

"python2.6"に2つのIPアドレスが重複していないかどうかを確認するにはどうすればよいですか?

私はnetaddr通過した、それは 192.168.2.0は2つのCIDRアドレスを確認するために

from netaddr import IPNetwork, IPAddress 
bool = IPAddress("192.168.2.0") in IPNetwork("192.168.2.0/14"): 

しかし、どのようにでCIDRアドレス192.168.2.0/14であるかどうかを確認することができます?

私は参照を見つけ:: How can I check if an ip is in a network in python

+0

はFYI、192.168.2.0/32は、単一のIPアドレス(192.168.2.0)ではないサブネットです。 – slebetman

+0

あなたはPython固有ではない回答を受け入れますか? – slebetman

+0

情報のThnx。私はPythonでそれが必要ですが、あなたの説明が役に立つかもしれません。 – AJRedDevil

答えて

8

>>> 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 
+0

ライブラリは私が欲しいものを正確に行います。 – AJRedDevil

+0

同じコードがIPv6にも対応しているのですか、それともIPv4のみをサポートしていますか? – AJRedDevil

+0

IPv6の作業。 IPaddr.IPNetwork( ':: 192.168.0.0/120')。overlaps(ipaddr.IPNetwork( ':: 192.168.0.0/121')) 'は真を返し、' ipaddr.IPNetwork(:: 192.168.4.0/120 ').overlaps(ipaddr.IPNetwork(' :: 192.168.0.0/121 ')) 'はFalseを返します – falsetru

1

テストのために手元にnetaddrがありますが、私が最初にネットワークのfirstlastアドレスは、両方の第二に含まれている場合は、チェックすることができないと思う場合は、次の

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 

ところで、IPNetworkline 1102__contains__方法を定義します。しかし、私はline 1127が壊れていないとは確信していませんか?もしあれば、バグをテストし報告しなければなりません。

5

あなたの例では、192.168.2.0/32は1つのアドレスしか表していませんが、実際に両方のCIDRが範囲を表しているとします。また、192.168.2.0/14では.2。 14ビットの接頭辞が3番目のオクテットに達しないため意味がありません。

とにかく、これを行うにはいくつかの方法があります。あなたは、彼らが重なるように、1つは、常に他のサブセットである必要があることに気づくことができます:

def cidrsOverlap(cidr0, cidr1): 
    return cidr0 in cidr1 or cidr1 in cidr0 

それとも、範囲が重複することは、最初の範囲の最下位アドレスは以下でなければなりません気づくことができ2番目の範囲の最上位アドレス、およびその逆。したがって:ipaddr使用

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 
+0

範囲の比較に感謝します。 さらにもう1つ、重複しているIPアドレスを見つけることができますか? – AJRedDevil

+2

重複しているIPアドレスは、より小さい範囲を持つサブネットです。すなわち、 '/'の後の数字が大きいほどです。したがって、192.168.2.0/23と192.168.2.0/24の間に重複するアドレスは192.168.2.0/24です。 CIDRサブネットは「重複」できないことに注意してください。それらには、より小さいCIDRサブネットのみを含めることができます。 – slebetman

+0

@AJRedDevil 1つは常に他のもののサブセットなので、オーバーラップはほんの小さな範囲です。オーバーラップ(小さい範囲)の最初のアドレスは 'max(cidr0.first、cidr1.first)'です。最後のアドレスは 'min(cidr0.last、cidr1.last)'です。 –

関連する問題