ネットワークプログラミングで大活躍 netaddrの簡易説明書 - Python


IPアドレスをいじくりまわしたり、IPアドレスの比較・判定、CIDR作成・結合や分解、
レンジ範囲操作でなどネットワークエンジニアは活用する機会が多いnetaddrの自分用に使い方メモまとめ。
メモなんで今後随時追加していきます。

1. netaddrインストール

pipコマンドでインストール
pip install netaddr

2.netaddr読み込み

from netaddr import *

3 netaddr基本操作

IPアドレスの種類出力

ip = IPAddress('192.0.2.1')
print(ip.version)

出力 4

文字列(str)型で出力

str(ip)

int型でロングIP出力

ロングIPへ変換
int(ip)
比較
int(ip) == 3221225985
True

その他型操作 ヘックス、バイナリなど

hex(ip)
'0xc0000201'
ip.bin
'0b11000000000000000000001000000001'
ip.bits()
'11000000.00000000.00000010.00000001'
ip.words == (192, 0, 2, 1)
True

IPV4からIPV6へ変換

IPAddress('192.0.2.15').ipv6()

出力 IPAddress('::ffff:192.0.2.15')

IPV6からIPV4へ変換

IPNetwork('::ffff:192.0.2.1/119').ipv4()
IPNetwork('192.0.2.1/23')

リスト操作

IPアドレスをリスト操作可能。
list()でCIDRをリスト化。

ip = IPNetwork('192.0.2.16/29')
ip_list = list(ip)

リストの長さ

len(ip_list)
出力 8

リストの中身

print(ip_list)
出力 [IPAddress('192.0.2.16'), IPAddress('192.0.2.17'), ..., IPAddress('192.0.2.22'), IPAddress('192.0.2.23')]

リストインデックス操作

IPリストの一番初めを取得
ip[0]
出力 IPAddress('192.0.2.16')

IPリストの最終を取得
ip[-1]
出力 IPAddress('192.0.2.23')

CIDRでは取り扱いにくいIPレンジをリスト管理する

以下のコマンドでIPレンジをリスト化可能。
list(iter_iprange('レンジの始まりIP', 'レンジの終わりIP'))

ip_list = list(iter_iprange('192.0.2.1', '192.0.2.14'))

作ったリストをCIDRへ変換も可能

cidr_merge(ip_list)
出力 [IPNetwork('192.0.2.1/32'), IPNetwork('192.0.2.2/31'), IPNetwork('192.0.2.4/30'), IPNetwork('192.0.2.8/30'), IPNetwork('192.0.2.12/31'), IPNetwork('192.0.2.14/32')]

IPアドレスのカテゴリを判別する

ユニキャストIPかどうか

IPAddress('192.0.2.1').is_unicast()
出力 True
IPAddress('fe80::1').is_unicast()
出力 True

マルチキャストIPかどうか

IPAddress('239.192.0.1').is_multicast()
出力 True
IPAddress('ff00::1').is_multicast()
出力 True

プライベートIPかどうか

IPAddress('172.24.0.1').is_private()
出力 True
IPAddress('10.0.0.1').is_private()
出力 True
IPAddress('192.168.0.1').is_private()
出力 True
IPAddress('fc00::1').is_private()
出力 True

リザーブド(予約済み)IPアドレスかどうか

IPAddress('253.0.0.1').is_reserved()
出力 True

パブリック(インターネットからアクセスできる)IPアドレスかどうか

ip = IPAddress('62.125.24.5')
ip.is_unicast() and not ip.is_private()

出力 True

ネットマスクかどうか

IPAddress('255.255.254.0').is_netmask()
出力 True

IPアドレスの比較操作

IPAddress('192.0.2.1') == IPAddress('192.0.2.1')
True
IPAddress('192.0.2.1') < IPAddress('192.0.2.2')
True
IPAddress('192.0.2.2') > IPAddress('192.0.2.1')
True
IPAddress('192.0.2.1') != IPAddress('192.0.2.1')
False
IPAddress('192.0.2.1') >= IPAddress('192.0.2.1')
True
IPAddress('192.0.2.2') >= IPAddress('192.0.2.1')
True
IPAddress('192.0.2.1') <= IPAddress('192.0.2.1')
True
IPAddress('192.0.2.1') <= IPAddress('192.0.2.2')
True

IPアドレスのレンジ(範囲)

r1 = IPRange('192.0.2.1', '192.0.2.15')

cidrs()でCIDRへ変換可能
r1.cidrs()
出力 [IPNetwork('192.0.2.1/32'), IPNetwork('192.0.2.2/31'), IPNetwork('192.0.2.4/30'), IPNetwork('192.0.2.8/29')]

list()でリストへ変換可能
list(r1)
出力 [IPAddress('192.0.2.1'), IPAddress('192.0.2.2'), IPAddress('192.0.2.3'), IPAddress('192.0.2.4'), IPAddress('192.0.2.5'), IPAddress('192.0.2.6'), IPAddress('192.0.2.7'), IPAddress('192.0.2.8'), IPAddress('192.0.2.9'), IPAddress('192.0.2.10'), IPAddress('192.0.2.11'), IPAddress('192.0.2.12'), IPAddress('192.0.2.13'), IPAddress('192.0.2.14'), IPAddress('192.0.2.15')]