PythonでサブネットをIPアドレスに一致させる簡単な方法は何ですか?IPアドレスがサブネットにある場合はそれを選択できますか?
前もって感謝します。
PythonでサブネットをIPアドレスに一致させる簡単な方法は何ですか?IPアドレスがサブネットにある場合はそれを選択できますか?
前もって感謝します。
Python 3.3以降では、ipaddressモジュールを使用できます。
>>> import ipaddress
>>> ipaddress.ip_address('192.0.43.10') in ipaddress.ip_network('192.0.0.0/16')
True
Pythonのインストールが3.3より古い場合は、このバックポートを使用できます。
この方法で多くのIPアドレスを評価する場合は、次のようにネットマスクを事前に計算することをお勧めします。
n = ipaddress.ip_network('192.0.0.0/16')
netw = int(n.network_address)
mask = int(n.netmask)
次に、アドレスごとに、次のいずれかを使用してバイナリ表現を計算します。
a = int(ipaddress.ip_address('192.0.43.10'))
a = struct.unpack('!I', socket.inet_pton(socket.AF_INET, '192.0.43.10'))[0]
a = struct.unpack('!I', socket.inet_aton('192.0.43.10'))[0] # IPv4 only
最後に、次のことを簡単に確認できます。
in_network = (a & mask) == netw
特定のIPについて、プレフィックスの長いリストからプレフィックスを検索する場合は、最長プレフィックス一致を実装できます。最初にプレフィックスのリストからプレフィックスツリーを構築し、その後、ツリーをトラバースして、プレフィックスに一致する最も遠いリーフを探します。
怖いように聞こえますが、それほど悪くはありません:)