はじめに
前に「任意のIPアドレスレンジからサブネットを算出する」という記事を書きましたが、むしろ逆にネットワークアドレスに含まれるIPアドレス一覧が欲しいという場合の方が多いかも。
例えば、192.168.1.0/24
に含まれるIPアドレスの一覧が欲しいといったニーズ。
そんな時もipaddressライブラリやnetaddrライブラリを使えば超簡単に解決できます。
なお、少し使用目的が違うけど、このサイトでOriginal Subnet(s)にネットワークアドレスを入れて、Into:に32を入れると同じ様なことができます(結果に/32
がつきますが...)。
やってみる
まずはipaddressを使った方法。
#ライブラリ読み込み
from ipaddress import IPv4Network
#IPv4Networkクラスにネットワークアドレスを渡して、list()でIPv4Addressオブジェクトのリストを得る。
ipaddrs = list(IPv4Network('192.168.1.0/24'))
print(ipaddrs)
・結果
[IPv4Address('192.168.1.0'), IPv4Address('192.168.1.1'), IPv4Address('192.168.1.2'), IPv4Address('192.168.1.3'), IPv4Address('192.168.1.4'), IPv4Address('192.168.1.5'), IPv4Address('192.168.1.6'), IPv4Address('192.168.1.7'), IPv4Address('192.168.1.8'), IPv4Address('192.168.1.9'), IPv4Address('192.168.1.10'), ...(中略)... IPv4Address('192.168.1.255')]
なんて簡単なんだこれは!
netaddrではこんな感じ。
pip install netaddr
from netaddr import IPNetwork
#IPNetowrkクラスにネットワークアドレスを渡して、list()でIPv4Addressオブジェクトのリストを得る。
ipaddrs = list(IPNetwork('192.168.1.0/24'))
print(ipaddrs)
[IPAddress('192.168.1.0'), IPAddress('192.168.1.1'), IPAddress('192.168.1.2'), IPAddress('192.168.1.3'), IPAddress('192.168.1.4'), IPAddress('192.168.1.5'), IPAddress('192.168.1.6'), IPAddress('192.168.1.7'), IPAddress('192.168.1.8'), IPAddress('192.168.1.9'), IPAddress('192.168.1.10'), , ...(中略)... IPAddress('192.168.1.255')]
ほぼ同じだな、こりゃ。
なお、文字列型のリストで結果が欲しい場合は
ipaddrs_str = [*(map(str, ipaddrs))]
などとしてあげれば良い。
さいごに
このnetaddrやipaddressというライブラリはIPアドレスやネットワークアドレスに対する操作をするのにすごく便利なライブラリで、サブネット分割だけでなく、さまざまな操作ができます。
これまでにいくつか記事を書きましたので、そちらもご参照ください。
また、そのような操作をWeb上でできるサイトを提供しているので是非ご利用ください。
IP Addr Tools: IPアドレスやサブネットを操作するいくつかのツールを提供しています。
以上
参考サイト: