2
0

More than 1 year has passed since last update.

Pythonでネットワークアドレス同士の差を求める

Posted at

はじめに

 以前、Pythonでネットワークを集約するスーパネット化の記事ネットワークを分割する記事を書きましたが、今回はPythonでネットワークアドレス同士の差を算出する方法について書こうと思います。
 この方法で、あるネットワークアドレスから別のより小さいネットワークを切り出した後に残るネットワークアドレスを求めることができます。

 手っ取り早くそれを実現したい方はこちらをご利用ください。

ネットワークアドレス同士の差を求める

 ここでは192.168.32.0/24のネットワークと192.168.0.128/26の差を求めて、前者のネットワークから後者のネットワークを切り出した後に残るネットワークアドレスを計算したい。

・準備

 必要なライブラリのインストール。

pip install netaddr

・ネットワークの差を求める

differ.py
#便利なライブラリのnetaddrを読み込む
from netaddr import IPSet

#192.168.32.0/24のネットワークをIPSetクラスに渡してオブジェクトs1を生成。
s1 = IPSet(['192.168.0.0/24'])

#192.168.32.128/26のネットワークをIPSetクラスに渡してオブジェクトs2を生成。
s2 = IPSet(['192.168.0.128/26'])

#差分を求める
s3 = s1.difference(s2)

#算術演算の様にしても差分を求められる!
#s3 = s1 - s2
print(s3)

・結果
 この様に192.168.32.0/24のネットワークから192.168.0.128/26を切り出すと192.168.0.0/25192.168.0.192/26のネットワークが残ることがわかる。

結果
IPSet(['192.168.0.0/25', '192.168.0.192/26'])

 特にnetaddrライブラリを推しているわけではないけれど、この記事をnetaddrで書き始めてしまったので、ここまで書いたが、ipaddressライブラリでも同じことが出来る。このライブラリは標準ライブラリに含まれていて、インストール不要なので一つのネットワークアドレス同士の差を求める場合はこちら方が使いやすい。

differ1.py
from ipaddress import IPv4Network

s1 = IPv4Network('192.168.0.0/24')
s2 = IPv4Network('192.168.0.128/26')
s3 = list(s1.address_exclude(s2))  

print(s3)
結果
[IPv4Network('192.168.0.0/25'), IPv4Network('192.168.0.192/26')]

さいごに

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

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

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

以上

参考サイト:

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