はじめに
任意のIPアドレスレンジからサブネットを算出する機会がありますかね?
例えば、192.0.2.0
から192.0.2.130
までのIPレンジを包含するネットワークアドレスを知りたいといったニーズ。
そんな時はipaddressライブラリやnetaddrライブラリを使えば割と簡単に解決できます。
やってみる
まずはipaddressを使った方法。
nwaddrs.py
#ライブラリ読み込み
from ipaddress import IPv4Address, summarize_address_range
#IPアドレスレンジの最初と最後をそれぞれの変数に格納
first_ipaddr = IPv4Address('192.0.2.0')
last_ipaddr = IPv4Address('192.0.2.130')
#summarize_address_range(最初のIPアドレス, 最後のIPアドレス)でネットワークアドレスが返る
subnets = list(summarize_address_range(first_ipaddr, last_ipaddr))
print(subnets)
・結果
結果
[IPv4Network('192.0.2.0/25'), IPv4Network('192.0.2.128/31'), IPv4Network('192.0.2.130/32')]
良さげ。
192.0.2.0
から192.0.2.130
までのIPレンジを包含するネットワークアドレスは次の3つということがわかる。
ネットワークアドレス | レンジ |
---|---|
192.0.2.0/25 | 192.0.2.0 ~ 192.0.2.127 |
192.0.2.128/31 | 192.0.2.128 ~ 192.0.2.129 |
192.0.2.130/32 | 192.0.2.130 ~ 192.0.2.130 |
netaddrではこんな感じ。
netaddrインストール
pip install netaddr
nwaddrs1.py
from netaddr import IPRange, IPNetwork
first_ipaddr = '192.0.2.0'
last_ipaddr = '192.0.2.130'
subnets = IPRange(first_ipaddr, last_ipaddr).cidrs()
print(subnets)
結果
[IPNetwork('192.0.2.0/25'), IPNetwork('192.0.2.128/31'), IPNetwork('192.0.2.130/32')]
さいごに
このnetaddrやipaddressというライブラリはIPアドレスやネットワークアドレスに対する操作をするのにすごく便利なライブラリで、サブネット分割だけでなく、さまざまな操作ができます。
これまでにいくつか記事を書きましたので、そちらもご参照ください。
以上
参考サイト: