LoginSignup
15
12

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-03-18

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')]

15
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
12