PythonでIPアドレスを扱う|ipaddressでネットワーク計算を自動化

当ページのリンクには広告が含まれています。
ネットワーク上級編 52/全70記事

この記事は、 「ネットワーク上級編|要件定義・設計・クラウド・自動化へ進む」 の第52回です。

第6章では、Python・Ansible・API・Gitなどを使い、 ネットワーク運用や設定作業を自動化するための基礎を学びます。

NETWORK ADVANCED|CHAPTER 6 AUTOMATION

PythonでIPアドレスを扱う|ipaddressでネットワーク計算を自動化

IPアドレス一覧のチェック、ネットワークアドレスの計算、 同一サブネット判定、サブネット分割、アドレス重複確認。 これらを毎回手作業で行うと、台数が増えたときにミスが発生しやすくなります。 Python標準ライブラリの ipaddress を使えば、ネットワークエンジニアが日常的に行うIPアドレス計算を プログラムで自動化できます。

対象レベル Level 3〜4・上級
想定読了時間 約30分
身につく成果 IPアドレス計算をPythonで自動化できる
前提知識 IP・サブネット・Python基礎
演習環境 Python 3

ネットワーク設計では、 「192.168.10.25/24のネットワークアドレスは何か」 「このIPはこのサブネットに含まれるか」 「/24を/26へ分割するとどうなるか」 といった計算を何度も行います。

数台であれば手計算でも対応できますが、 数十・数百のIPアドレスを扱う設計や移行作業では、 人が毎回計算するより、プログラムに判定させた方が安全です。

今回はネットワーク自動化の最初の実践として、 Pythonの標準ライブラリ ipaddress を使います。

この記事を読み終えるとできること

  • PythonでIPv4・IPv6アドレスを扱える
  • ネットワークアドレスを自動計算できる
  • ブロードキャストアドレスを取得できる
  • IPがネットワークに含まれるか判定できる
  • 利用可能ホストを一覧化できる
  • ネットワークを複数のサブネットへ分割できる
  • ネットワーク同士の重複を検出できる
  • 入力されたIPアドレスの形式を検証できる

なぜPythonでIPアドレスを扱うのか

今回のテーマ

IPアドレス計算や判定をコード化し、 「人が確認する作業」を「プログラムが検証する作業」へ変える。

ネットワークエンジニアは、 設計・構築・移行・障害対応のさまざまな場面でIPアドレスを扱います。

設計時

  • ネットワークアドレスの計算
  • サブネット分割
  • IPアドレス範囲の確認
  • 重複ネットワークの確認
  • アドレス設計表のチェック

構築・移行時

  • 設定値の入力チェック
  • 既存IPアドレスとの重複確認
  • 移行対象機器の一覧生成
  • コンフィグ生成前の検証
  • 試験対象アドレスの生成

例えば、100台の機器に対して 「入力されたIPが正しいか」 「正しいネットワークに所属しているか」 を目視で確認するとします。

1台ずつ確認すれば時間がかかり、 コピー&ペーストや計算ミスも発生します。

手作業から自動チェックへ

IPアドレス一覧 設計表・CSV・入力値
Python 形式・所属・重複を判定
チェック結果 正常・異常を出力
設定生成 次の自動化へ接続

自動化で重要なのは、最初から機器設定を自動投入することではありません。

IPアドレス計算や入力値チェックなど、 結果を確認しやすくリスクの低い作業から自動化すると、 安全にPythonを実務へ取り入れられます。

Pythonのipaddressとは何か

Pythonには、 IPv4・IPv6アドレスやネットワークを扱うための ipaddress モジュールが標準で用意されています。

外部ライブラリを追加インストールしなくても、 Python 3が利用できれば基本的なIPアドレス計算を始められます。

1

ip_address()

1つのIPv4またはIPv6アドレスを扱います。

例:192.168.10.1

2

ip_network()

サブネットやネットワーク範囲を扱います。

例:192.168.10.0/24

3

ip_interface()

プレフィックス付きの端末IPを扱います。

例:192.168.10.25/24

まずimportする

Python
import ipaddress

以降のサンプルでは、 この ipaddress モジュールを利用します。

ライブラリとモジュールという言葉について

厳密には ipaddress はPython標準ライブラリに含まれるモジュールです。 初学者の段階では、 「Pythonに最初から用意されているIPアドレス操作機能」 と考えて問題ありません。

1つのIPアドレスを扱う

最も基本的なのが ipaddress.ip_address() です。

IPv4アドレスを作成
import ipaddress

ip = ipaddress.ip_address("192.168.10.25")

print(ip)
print(type(ip))
print(ip.version)
実行結果192.168.10.25 <class ‘ipaddress.IPv4Address’> 4

文字列だった "192.168.10.25" が、 IPv4Address オブジェクトへ変換されます。

IPアドレスを単なる文字列ではなく 「IPアドレスとして意味を持つデータ」 に変えることがポイントです。

IPv6も同じ方法で扱える

IPv6アドレスを作成
import ipaddress

ip = ipaddress.ip_address("2001:db8::10")

print(ip)
print(type(ip))
print(ip.version)
実行結果2001:db8::10 <class ‘ipaddress.IPv6Address’> 6

ip_address() は入力内容を見てIPv4かIPv6かを判断します。

IPv4用とIPv6用で別々の処理を書かなくても、 基本的な処理では同じ ip_address() を使用できます。

アドレス同士を比較する

IPアドレスオブジェクトは比較できます。

IPアドレスを比較
import ipaddress

ip1 = ipaddress.ip_address("192.168.10.10")
ip2 = ipaddress.ip_address("192.168.10.20")

print(ip1 == ip2)
print(ip1 < ip2)
実行結果False True

これは、IPアドレス一覧を並び替えたり、 範囲を確認したりするときに利用できます。

ネットワークを扱う

ip_network() を使うと、 192.168.10.0/24 のようなネットワークそのものを扱えます。

ネットワーク情報を取得
import ipaddress

network = ipaddress.ip_network("192.168.10.0/24")

print("ネットワーク:", network)
print("ネットワークアドレス:", network.network_address)
print("ブロードキャスト:", network.broadcast_address)
print("サブネットマスク:", network.netmask)
print("プレフィックス長:", network.prefixlen)
print("アドレス総数:", network.num_addresses)
実行結果ネットワーク: 192.168.10.0/24 ネットワークアドレス: 192.168.10.0 ブロードキャスト: 192.168.10.255 サブネットマスク: 255.255.255.0 プレフィックス長: 24 アドレス総数: 256
プロパティ 意味 /24の例
network_address ネットワークアドレス 192.168.10.0
broadcast_address IPv4のブロードキャスト側アドレス 192.168.10.255
netmask サブネットマスク 255.255.255.0
prefixlen プレフィックス長 24
num_addresses ネットワーク内のアドレス総数 256

ホスト部が設定された値を渡すとどうなるか

次の値を考えてみましょう。

そのままではエラーになる例
import ipaddress

network = ipaddress.ip_network("192.168.10.25/24")

192.168.10.25/24 は端末のIPアドレスとしては自然ですが、 /24のネットワークアドレスは 192.168.10.0 です。

ip_network() は標準ではネットワークアドレスとして厳密にチェックするため、 ホスト部が設定された値はエラーになります。

strict=Falseを使用する

ホスト部をネットワークアドレスへ補正
import ipaddress

network = ipaddress.ip_network(
    "192.168.10.25/24",
    strict=False
)

print(network)
実行結果192.168.10.0/24

strict=False を指定すると、 ホスト部を含むアドレスから所属ネットワークを取得できます。

strict=Falseを常に使えばよいわけではありません。

ネットワーク設計表に 「ネットワークアドレスとして192.168.10.25/24が登録されていた」 のであれば、本来は入力ミスを検出したい場合があります。

「誤りを検出したい」のか 「端末IPから所属ネットワークを求めたい」のかで使い分けます。

端末IPとプレフィックスを扱う

ネットワーク機器のインターフェースでは、 次のような値をよく扱います。

インターフェース設定

192.168.10.25/24

これはネットワークアドレスではなく、 「192.168.10.0/24上にある192.168.10.25という端末IP」 を意味します。

このような場合には ip_interface() が便利です。

端末IP+プレフィックスを扱う
import ipaddress

interface = ipaddress.ip_interface("192.168.10.25/24")

print("IPアドレス:", interface.ip)
print("所属ネットワーク:", interface.network)
print("サブネットマスク:", interface.netmask)
実行結果IPアドレス: 192.168.10.25 所属ネットワーク: 192.168.10.0/24 サブネットマスク: 255.255.255.0
入力 適した関数 意味
192.168.10.25 ip_address() 1つのIPアドレス
192.168.10.0/24 ip_network() ネットワーク全体
192.168.10.25/24 ip_interface() ネットワーク上の端末IP

ネットワークエンジニアの場合、 ip_address()ip_network() だけでなく、 ip_interface()を理解しておくと実務で非常に便利です。

IPアドレスの所属ネットワークを判定する

実務で特に便利なのが、 「このIPアドレスは、このネットワークに含まれるか」 という判定です。

例:192.168.10.25は192.168.10.0/24に含まれるか

所属判定
import ipaddress

ip = ipaddress.ip_address("192.168.10.25")
network = ipaddress.ip_network("192.168.10.0/24")

if ip in network:
    print("ネットワークに含まれています")
else:
    print("ネットワークに含まれていません")
実行結果ネットワークに含まれています

別ネットワークの場合

ネットワーク外のIP
import ipaddress

ip = ipaddress.ip_address("192.168.20.25")
network = ipaddress.ip_network("192.168.10.0/24")

print(ip in network)
実行結果False

どんな場面で使えるのか

設計表の検査

VLAN 100用のネットワークが 10.10.100.0/24 の場合、登録された機器IPがすべてその範囲内か自動確認できます。

ACL生成

入力された送信元IPが許可対象ネットワーク内か確認してから、 ACL設定を生成できます。

監視対象の分類

IPアドレスから拠点・VLAN・用途を自動判定する処理にも利用できます。

移行チェック

新ネットワークへ移行する端末が正しいアドレス範囲へ変更されているか確認できます。

利用可能なホストアドレスを取得する

hosts() を使うと、 ネットワーク内のホストアドレスを順番に取得できます。

分かりやすいように 192.168.10.0/29 を使用します。

ホストアドレスを一覧表示
import ipaddress

network = ipaddress.ip_network("192.168.10.0/29")

for ip in network.hosts():
    print(ip)
実行結果192.168.10.1 192.168.10.2 192.168.10.3 192.168.10.4 192.168.10.5 192.168.10.6

一般的なIPv4の/29ネットワークでは、 ネットワークアドレス 192.168.10.0 とブロードキャストアドレス 192.168.10.7 を除いたアドレスが取得できます。

リストとして保存する

ホスト一覧をlist化
import ipaddress

network = ipaddress.ip_network("192.168.10.0/29")

hosts = list(network.hosts())

print(hosts)
print("ホスト数:", len(hosts))
実行結果[IPv4Address(‘192.168.10.1’), IPv4Address(‘192.168.10.2’), IPv4Address(‘192.168.10.3’), IPv4Address(‘192.168.10.4’), IPv4Address(‘192.168.10.5’), IPv4Address(‘192.168.10.6’)] ホスト数: 6

大きなネットワークを安易にlist化しないようにしましょう。

/8や大きなIPv6ネットワークなどでは、 含まれるアドレス数が非常に多くなります。 必要な範囲だけ処理する設計にすることが重要です。

ネットワークを複数のサブネットへ分割する

subnets() を使うと、 あるネットワークをより小さいネットワークへ分割できます。

192.168.10.0/24を/26へ分割する

/24 → /26へ分割
import ipaddress

network = ipaddress.ip_network("192.168.10.0/24")

for subnet in network.subnets(new_prefix=26):
    print(subnet)
実行結果192.168.10.0/26 192.168.10.64/26 192.168.10.128/26 192.168.10.192/26

/24から/26へプレフィックスを2ビット増やしたため、 4つのサブネットへ分割されました。

192.168.10.0/24 を4分割

Subnet 1

192.168.10.0/26

Subnet 2

192.168.10.64/26

Subnet 3

192.168.10.128/26

Subnet 4

192.168.10.192/26

設計時の利用例

例えば 10.10.0.0/16 を拠点ごとの/24へ分割し、 自動的にネットワーク一覧を作成することもできます。

/16を/24へ分割
import ipaddress

network = ipaddress.ip_network("10.10.0.0/16")

subnets = network.subnets(new_prefix=24)

for i, subnet in enumerate(subnets, start=1):
    print(i, subnet)

    if i == 5:
        break
実行結果の先頭5件1 10.10.0.0/24 2 10.10.1.0/24 3 10.10.2.0/24 4 10.10.3.0/24 5 10.10.4.0/24

拠点が100か所ある場合でも、 手作業で100個のサブネットを記入する必要はありません。

Pythonでネットワークを生成してから、 拠点名やVLAN番号などと組み合わせて IPアドレス設計表を作ることができます。

ネットワークの重複を確認する

IPアドレス設計で危険なのが、 ネットワーク範囲の重複 です。

例えば次の2つを考えます。

  • 192.168.10.0/24
  • 192.168.10.128/25

2つ目のネットワークは、 1つ目のネットワークの内部に含まれています。

overlaps()で重複確認
import ipaddress

network1 = ipaddress.ip_network("192.168.10.0/24")
network2 = ipaddress.ip_network("192.168.10.128/25")

print(network1.overlaps(network2))
実行結果True

重複していない場合は False が返ります。

複数のネットワークを総当たりで確認する

重複ネットワーク検出
import ipaddress

networks = [
    ipaddress.ip_network("10.10.10.0/24"),
    ipaddress.ip_network("10.10.20.0/24"),
    ipaddress.ip_network("10.10.10.128/25"),
]

for i in range(len(networks)):
    for j in range(i + 1, len(networks)):
        if networks[i].overlaps(networks[j]):
            print(
                "重複:",
                networks[i],
                "<->",
                networks[j]
            )
実行結果重複: 10.10.10.0/24 <-> 10.10.10.128/25

IPアドレス設計表をPythonでチェックするだけでも、 ネットワーク自動化には大きな価値があります。

機器へ設定を投入する前に設計ミスを検出できれば、 本番障害を防ぐことにつながります。

不正なIPアドレスを検出する

ip_address() は、入力値が正しいIPv4またはIPv6形式でなければ ValueError を発生させます。

この仕組みを利用すると、 設計表やユーザー入力のチェックができます。

入力チェック
import ipaddress

ip_text = "192.168.10.300"

try:
    ip = ipaddress.ip_address(ip_text)
    print("正常:", ip)

except ValueError:
    print("不正なIPアドレス:", ip_text)
実行結果不正なIPアドレス: 192.168.10.300

複数IPを確認する

IPアドレス一覧を検証
import ipaddress

ip_list = [
    "192.168.10.1",
    "192.168.10.20",
    "192.168.10.300",
    "10.0.0.1",
    "abc",
]

for ip_text in ip_list:

    try:
        ip = ipaddress.ip_address(ip_text)
        print("OK :", ip)

    except ValueError:
        print("NG :", ip_text)
実行結果OK : 192.168.10.1 OK : 192.168.10.20 NG : 192.168.10.300 OK : 10.0.0.1 NG : abc

実務では、ExcelやCSVから読み込んだIPアドレスを ipaddress へ渡すことで、 数百行の設計値を一括チェックできます。

実務で使えるIPアドレスチェックを作る

ここまで学んだ内容を組み合わせ、 簡単なチェックプログラムを作ります。

要件

VLAN 100のネットワークは 192.168.100.0/24 とします。

次のIPアドレス一覧について、 形式が正しいか、 VLAN 100のネットワーク内に存在するか確認します。

  • 192.168.100.10
  • 192.168.100.20
  • 192.168.200.30
  • 192.168.100.300
実務サンプル:所属ネットワークチェック
import ipaddress

network = ipaddress.ip_network("192.168.100.0/24")

ip_list = [
    "192.168.100.10",
    "192.168.100.20",
    "192.168.200.30",
    "192.168.100.300",
]

for ip_text in ip_list:

    try:
        ip = ipaddress.ip_address(ip_text)

    except ValueError:
        print(f"NG 形式不正 : {ip_text}")
        continue

    if ip in network:
        print(f"OK 所属     : {ip}")

    else:
        print(f"NG 範囲外   : {ip}")
実行結果OK 所属 : 192.168.100.10 OK 所属 : 192.168.100.20 NG 範囲外 : 192.168.200.30 NG 形式不正 : 192.168.100.300

処理の流れ

  1. 基準ネットワークを作成する 192.168.100.0/24 をネットワークオブジェクトへ変換します。
  2. IPアドレスを1件ずつ読み込む 実務ではCSVやExcelから取得する形へ拡張できます。
  3. IPアドレス形式を検証する 不正な形式であれば、その時点でNGとします。
  4. 所属ネットワークを判定する ip in network で対象範囲に含まれるか確認します。
  5. 結果を出力する 正常・形式不正・ネットワーク範囲外に分類します。

この程度の短いコードでも、 IPアドレス設計表のレビューを補助するツール として利用できます。

設計・運用での使いどころ

PythonでIPアドレスを扱えるようになると、 単純なサブネット計算だけでなく、 ネットワーク業務全体へ応用できます。

IPアドレス設計表のレビュー

IPアドレス、プレフィックス、VLAN、 所属ネットワークを自動チェックします。

ネットワーク重複チェック

拠点、VPN、クラウドVPC/VNetなどの CIDR重複を事前に確認します。

コンフィグ生成

IPアドレスを検証してから、 ルーターやスイッチの設定ファイルへ変換します。

監視設定生成

IP一覧から監視対象ホストや ping試験対象を自動生成できます。

ACL・FWルール生成

送信元・宛先ネットワークを検証した上で ルールを生成できます。

クラウドネットワーク設計

VPC、VNet、サブネットなどのCIDRが 既存環境と重複していないか確認できます。

自動化する順番が重要

段階 自動化内容 リスク
STEP 1 IPアドレス計算 低い
STEP 2 設計値チェック 低い
STEP 3 設定ファイル生成 中程度
STEP 4 機器から情報取得 中程度
STEP 5 機器へ設定投入 高い

自動化は「できるか」だけではなく 誤った入力を与えた場合に何が起きるか を考える必要があります。

設定投入を自動化する前に、 今回のような入力検証を組み込むことが重要です。

IPアドレス設計そのものについては、 上級編第11回の 「IPアドレス設計」 もあわせて確認してください。

PythonでIPアドレスを扱うときのよくある失敗

失敗1:IPアドレスを文字列だけで比較する

IPアドレスをすべて文字列として処理すると、 ネットワーク所属判定やサブネット計算を自分で実装する必要があります。

ipaddress オブジェクトへ変換してから処理する方が安全です。

失敗2:ip_network()へ端末IPをそのまま渡す

192.168.10.25/24 は端末IPです。

端末IPとして扱うなら ip_interface() を検討します。

失敗3:例外処理を書かない

CSVなど外部データには、 入力ミスや空欄が含まれる可能性があります。

try / except で入力エラーを処理します。

失敗4:巨大なネットワークをすべてlist化する

大きなIPv4ネットワークやIPv6ネットワークでは、 アドレス数が非常に多くなる場合があります。

必要な範囲だけ処理します。

失敗5:自動化結果を無条件に信用する

コードが正しくても、 入力データや設計要件が間違っていれば、 出力も間違います。

自動化後もレビュー工程は必要です。

失敗6:いきなり本番設定を自動投入する

自動化の学習初期は、 計算・チェック・情報取得から始めます。

変更系処理は十分な検証後に進めます。

顧客・上司への説明方法

Pythonを導入するとき、 「Pythonを使いたいから自動化します」 では説得力がありません。

技術ではなく、 作業時間・品質・リスク に変換して説明します。

技術的な説明

Pythonのipaddressモジュールを使用し、 IPアドレス形式、所属ネットワーク、 CIDR重複などを自動チェックします。

顧客・上司向けの説明

IPアドレス設計表を人手だけで確認すると、 台数が増えるほど確認漏れや計算ミスのリスクが高まります。

そこで、入力値をプログラムでもチェックし、 人によるレビューと自動チェックを組み合わせます。 これにより、設定投入前にアドレスの誤りや重複を検出しやすくします。

技術 業務上の価値
IP形式チェック 入力ミスの早期発見
所属ネットワーク判定 VLAN・サブネット設定ミスの削減
CIDR重複チェック 拠点・VPN・クラウド接続時の設計リスク低減
サブネット自動生成 設計作業の効率化
設定生成前の検証 誤設定の本番投入防止

実務で使う英語表現

Pythonの公式ドキュメントや海外ベンダー資料を読むときに、 次の単語がよく登場します。

英語 意味
IP address IPアドレス
Network address ネットワークアドレス
Prefix length プレフィックス長
Netmask サブネットマスク
Host address ホストアドレス
Subnet サブネット
Network range ネットワーク範囲
Overlap 重複する
Valid IP address 有効なIPアドレス
Invalid IP address 不正なIPアドレス
Host bits ホスト部のビット

コードレビューで使える表現

Check whether the IP address belongs to the subnet.
IPアドレスがそのサブネットに属しているか確認してください。

Validate the IP address before generating the configuration.
設定を生成する前にIPアドレスを検証してください。

These two network ranges overlap.
この2つのネットワーク範囲は重複しています。

Convert the address to an IPv4 network object.
そのアドレスをIPv4ネットワークオブジェクトへ変換してください。

理解度チェック

コードを暗記するのではなく、 どの関数をどの場面で使うのか を理解できているか確認しましょう。

問題1. 1つのIPアドレス 192.168.10.1 を扱うために最も適した関数はどれですか。

  1. ip_address()
  2. ip_network()
  3. ip_interface()
  4. hosts()
解答を見る
正解:A

ip_address() は1つのIPv4またはIPv6アドレスを扱うための関数です。

問題2. 192.168.10.25/24 のような端末IPとプレフィックスをセットで扱う場合、 最も適した関数はどれですか。

  1. ip_address()
  2. ip_interface()
  3. overlaps()
  4. subnets()
解答を見る
正解:B

ip_interface() は特定ネットワーク上の端末IPを扱うのに適しています。

問題3. 次のコードは何を確認していますか。

Python
if ip in network:
    print("OK")
解答を見る

IPアドレスが指定したネットワーク範囲に含まれているか確認しています。

問題4. 192.168.10.0/24/26 へ分割すると、いくつのサブネットになりますか。

  1. 2
  2. 4
  3. 8
  4. 16
解答を見る
正解:B

/24から/26へ2ビット増やすため、 2の2乗で4つのサブネットになります。

問題5. ネットワークAとネットワークBのアドレス範囲が 重複しているか確認したい場合、 使用できるメソッドは何ですか。

解答を見る

overlaps() を使用できます。

network1.overlaps(network2)

実践演習:IPアドレス設計表をPythonでチェックする

あなたは、新しい拠点ネットワークの設計レビューを担当しています。

設計条件

VLAN 用途 ネットワーク
100 営業部 10.10.100.0/24
200 技術部 10.10.200.0/24
300 サーバー 10.10.30.0/24

登録された端末

機器 VLAN IPアドレス
PC-A 100 10.10.100.10
PC-B 100 10.10.200.20
PC-C 200 10.10.200.30
Server-A 300 10.10.30.10
Server-B 300 10.10.30.999

課題1.目視で誤りを見つける

Pythonを書く前に、 設計表を確認して問題がある箇所を挙げてください。

問題がある機器: ________________________
解答例を見る
  • PC-B: VLAN 100なのに 10.10.200.20 が設定されている
  • Server-B: 10.10.30.999 は正しいIPv4アドレス形式ではない

課題2.Pythonでチェックする

次の辞書を使用し、 IPアドレス形式とVLAN所属をチェックするプログラムを作ってください。

演習データ
networks = {
    100: "10.10.100.0/24",
    200: "10.10.200.0/24",
    300: "10.10.30.0/24",
}

devices = [
    {"name": "PC-A", "vlan": 100, "ip": "10.10.100.10"},
    {"name": "PC-B", "vlan": 100, "ip": "10.10.200.20"},
    {"name": "PC-C", "vlan": 200, "ip": "10.10.200.30"},
    {"name": "Server-A", "vlan": 300, "ip": "10.10.30.10"},
    {"name": "Server-B", "vlan": 300, "ip": "10.10.30.999"},
]
使用するもの: ipaddress.ip_address() / ipaddress.ip_network() / try-except / in
解答例を見る
解答例
import ipaddress

networks = {
    100: "10.10.100.0/24",
    200: "10.10.200.0/24",
    300: "10.10.30.0/24",
}

devices = [
    {"name": "PC-A", "vlan": 100, "ip": "10.10.100.10"},
    {"name": "PC-B", "vlan": 100, "ip": "10.10.200.20"},
    {"name": "PC-C", "vlan": 200, "ip": "10.10.200.30"},
    {"name": "Server-A", "vlan": 300, "ip": "10.10.30.10"},
    {"name": "Server-B", "vlan": 300, "ip": "10.10.30.999"},
]

for device in devices:

    name = device["name"]
    vlan = device["vlan"]
    ip_text = device["ip"]

    network = ipaddress.ip_network(networks[vlan])

    try:
        ip = ipaddress.ip_address(ip_text)

    except ValueError:
        print(
            f"{name}: NG "
            f"IPアドレス形式不正 "
            f"({ip_text})"
        )
        continue

    if ip in network:
        print(f"{name}: OK")

    else:
        print(
            f"{name}: NG "
            f"VLAN {vlan} のネットワーク外 "
            f"({ip})"
        )
期待される結果PC-A: OK PC-B: NG VLAN 100 のネットワーク外 (10.10.200.20) PC-C: OK Server-A: OK Server-B: NG IPアドレス形式不正 (10.10.30.999)

課題3.さらに改善する

実務で使うなら、次の機能を追加するとより実践的です。

  • 同一IPアドレスの重複検出
  • ネットワークアドレスの重複検出
  • ゲートウェイアドレスの確認
  • 結果をCSVへ出力
  • エラー件数を最後に表示
  • 正常時だけ設定ファイル生成へ進む

ここまでできれば、 単なるPython学習ではなく、 実際のネットワーク設計レビューを補助するツール になっています。

自分の言葉で説明する課題

後輩エンジニアから、 次のように質問されました。

「IPアドレスはExcelでも管理できますよね。 なぜわざわざPythonを使うんですか?」

Pythonを使う理由は、 ________________________________。
説明例を見る

ExcelはIPアドレスを一覧として管理するのに便利ですが、 Pythonを使うと、IPアドレス形式の確認、 所属ネットワーク判定、サブネット計算、 ネットワーク重複チェックなどを自動化できます。

特に台数や拠点数が多い案件では、 人が1件ずつ確認するより、 プログラムによるチェックを併用することで 作業時間と確認ミスを減らせます。

ExcelとPythonはどちらか一方を選ぶものではなく、 Excelを入力・管理表として使用し、 Pythonで内容を検証するという組み合わせも有効です。

まとめ

  • Python標準の ipaddress を使うと、IPv4・IPv6をプログラムで扱える
  • ip_address() は1つのIPアドレスを扱う
  • ip_network() はネットワーク全体を扱う
  • ip_interface() は端末IPとプレフィックスをセットで扱う
  • ip in network でIPアドレスの所属ネットワークを確認できる
  • hosts() でホストアドレスを取得できる
  • subnets() でネットワークを複数のサブネットへ分割できる
  • overlaps() でネットワーク範囲の重複を確認できる
  • 不正なIPアドレスは例外処理を使って検出できる
  • 自動化は設定投入から始めるのではなく、 計算・検証・情報取得などリスクの低い処理から始める

ネットワーク自動化の第一歩は、 コマンドを自動投入することではありません。 人が繰り返している判断や確認を、 プログラムで再現できるようにすることです。

次の記事:Pythonで設定ファイルを作る

今回は、Pythonを使って IPアドレスやネットワークを計算・検証する方法を学びました。

次は一歩進み、 IPアドレス、VLAN番号、インターフェース名などの パラメータから、 ネットワーク機器の設定ファイルを自動生成します。

同じ設定を何十台分も手作業で作るのではなく、 「パラメータを入力するとコンフィグが生成される」 仕組みを作っていきます。

参考資料

ネットワーク上級編 52/全70記事

上級編では、要件定義・基本設計・BGP・クラウド・セキュリティに加え、 Python、Ansible、REST API、Git、テレメトリー、 AIを活用したネットワーク運用まで順番に学びます。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

目次