0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Pythonで任意のIPアドレスレンジからそれらを包含するサブネットを算出する

Posted at

はじめに

 任意の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')]

さいごに

 このnetaddripaddressというライブラリはIPアドレスやネットワークアドレスに対する操作をするのにすごく便利なライブラリで、サブネット分割だけでなく、さまざまな操作ができます。

 これまでにいくつか記事を書きましたので、そちらもご参照ください。
 また、そのような操作をWeb上でできるサイトを提供しているので是非ご利用ください。

IP Addr Tools: IPアドレスやサブネットを操作するいくつかのツールを提供しています。

以上

参考サイト:

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?