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