web-dev-qa-db-ja.com

2つのCIDRアドレスが交差するかどうかを確認しますか?

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が存在するかどうかを確認するにはどうすればよいですか

13
AjanShrestha

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
19
falsetru

例では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
5
rob mayoff

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
2
shishax

テスト用の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行目 が壊れていないかどうかはわかりませんか?バグがある場合は、テストして報告する必要があります。

1
Sylvain Leroux