2つのCIDRアドレスが与えられた場合、192.168.2.0/14と192.168.2.0/32と言います
「python2.6」で2つの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"):
しかし、2つのCIDRアドレスを確認する方法は??
参照を見つけました:: PythonのネットワークにIPが存在するかどうかを確認するにはどうすればよいですか
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
例では192.168.2.0/32が1つのアドレスのみを表している場合でも、実際には両方のCIDRで範囲を表す必要があると想定します。また、192.168.2.0/14では、.2。 14ビットのプレフィックスが3番目のオクテットに到達しないため、意味がありません。
とにかく、これを行うにはいくつかの方法があります。それらがオーバーラップするためには、一方が常に他方のサブセットである必要があることに気付くでしょう。
def cidrsOverlap(cidr0, cidr1):
return cidr0 in cidr1 or cidr1 in cidr0
または、範囲が重複するためには、最初の範囲の最低アドレスが2番目の範囲の最高アドレス以下である必要があり、その逆も同様です。したがって:
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
netaddr
libに基づいて、 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
テスト用のnetaddr
が手元にない場合でも、最初のネットワークの first アドレスと last アドレスの両方がに含まれているかどうかを確認できると思います。二番目:
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
ところで、IPNetwork
行1102 は__contains__
メソッドを定義します。しかし、 1127行目 が壊れていないかどうかはわかりませんか?バグがある場合は、テストして報告する必要があります。