ネットワークプログラミングで大活躍 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')]