それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

python の netaddr で ip( ipv4) アドレスを扱う

ip アドレスを計算を簡便にするライブラリがあったので使ってみることにした。

ライブラリを読み込む

インストールする。

$ pip install netaddr

使う準備をする。

from netaddr import *

ip アドレス(ネットマスク含む)を扱う。

サブネットマスク表記を含む場合は IPNetwork を使う。

>>> ip= IPNetwork('10.2.0.1/8')
>>> ip.network
IPAddress('10.0.0.0')
>>> ip.netmask
IPAddress('255.0.0.0')
>>> ip.ip
IPAddress('10.2.0.1')>>>

IPアドレスを扱う。

IPアドレスだけを扱うときは、IPAddress を使う。

>>> ip = IPAddress('192.168.1.1')
>>> ip
IPAddress('192.168.1.1')

主に、IPNetworkの戻り値として得られる。

IPアドレスのネットワーク部を扱う。

>>> ip = IPNetwork('192.168.1.1/24')
>>> ip.network
IPAddress('192.168.1.0')

または、ちゃんとネットマスクを適用する。AND演算でネットマスクを掛けてやる。

>>> ip.ip & ip.netmask
IPAddress('192.168.1.0')

ホスト部を取り出す。

>>> ip.ip
IPAddress('192.168.1.1')
>>> ip.hostmask
IPAddress('0.0.0.255')
>>> ip.hostmask  & ip.ip
IPAddress('0.0.0.1')
>>>

ホスト部とネットワーク部をあわせてIPアドレスを作る。

>>> ip = IPNetwork('192.168.1.1/24')
>>> ip.ip
IPAddress('192.168.1.1')>>> ( ip.hostmask  & ip.ip )
IPAddress('0.0.0.1')
>>> ( ip.netmask & ip.ip )
IPAddress('192.168.1.0')
>>> ( ip.hostmask  & ip.ip ) + ( ip.netmask & ip.ip )
IPAddress('192.168.1.1')
>>>

ホスト部を変更

>>> ip = IPNetwork('192.168.100.1/24')
>>> ip
IPNetwork('192.168.100.1/24')
>>>
>>> ip.ip & ip.netmask
IPAddress('192.168.100.0')
>>> ip.ip & ip.netmask | IPAddress('0.0.0.24')
IPAddress('192.168.100.24')
>>>

IPアドレスを進める。

>>> ip.ip
IPAddress('192.168.1.1')
>>> ip.ip +  1
IPAddress('192.168.1.2')

/24 アドレスを/28へさらに分割する。

>>> for i in ip.subnet(28):
...     print(i)
...
192.168.1.0/28
192.168.1.16/28
192.168.1.32/28
192.168.1.224/28
192.168.1.240/28

List comprehension でも表現できる。

[ x for x in ip.subnet(30)]

演算子で計算がカッコいい

演算子(operand) を使ってIPアドレス計算するのが、良かった。

2進数に落としてビットフラグ計算なんてやってられないけど、原理原則としてビットマスク計算がIPアドレスなので、計算はそのままなのがいい。

ipv6については次回。

ipv4 でnetaddr の使い方が把握できたので、それをv6に置き換えて、インターフェースIDを扱うことにする。

https://takuya-1st.hatenablog.jp/entry/2021/01/28/201047

参考資料