はじめに
以前、Pythonでネットワークを集約するスーパネット化の記事やネットワークを分割する記事を書きましたが、今回はPythonでネットワークアドレス同士の差を算出する方法について書こうと思います。
この方法で、あるネットワークアドレスから別のより小さいネットワークを切り出した後に残るネットワークアドレスを求めることができます。
手っ取り早くそれを実現したい方はこちらをご利用ください。
ネットワークアドレス同士の差を求める
ここでは192.168.32.0/24
のネットワークと192.168.0.128/26
の差を求めて、前者のネットワークから後者のネットワークを切り出した後に残るネットワークアドレスを計算したい。
・準備
必要なライブラリのインストール。
pip install netaddr
・ネットワークの差を求める
#便利なライブラリの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/25
と192.168.0.192/26
のネットワークが残ることがわかる。
IPSet(['192.168.0.0/25', '192.168.0.192/26'])
特にnetaddrライブラリを推しているわけではないけれど、この記事をnetaddrで書き始めてしまったので、ここまで書いたが、ipaddressライブラリでも同じことが出来る。このライブラリは標準ライブラリに含まれていて、インストール不要なので一つのネットワークアドレス同士の差を求める場合はこちら方が使いやすい。
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')]
さいごに
このnetaddrやipaddressというライブラリはIPアドレスやネットワークアドレスに対する操作をするのにすごく便利なライブラリで、サブネット分割だけでなく、さまざまな操作ができます。
これまでにいくつか記事を書きましたので、そちらもご参照ください。
また、そのような操作をWeb上でできるサイトを提供しているので是非ご利用ください。
IP Addr Tools: IPアドレスやサブネットを操作するいくつかのツールを提供しています。
以上
参考サイト: