この記事は、 「ネットワーク上級編|要件定義・設計・クラウド・自動化へ進む」 の第52回です。
第6章では、Python・Ansible・API・Gitなどを使い、 ネットワーク運用や設定作業を自動化するための基礎を学びます。
PythonでIPアドレスを扱う|ipaddressでネットワーク計算を自動化
IPアドレス一覧のチェック、ネットワークアドレスの計算、
同一サブネット判定、サブネット分割、アドレス重複確認。
これらを毎回手作業で行うと、台数が増えたときにミスが発生しやすくなります。
Python標準ライブラリの
ipaddress
を使えば、ネットワークエンジニアが日常的に行うIPアドレス計算を
プログラムで自動化できます。
ネットワーク設計では、 「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アドレス計算や入力値チェックなど、 結果を確認しやすくリスクの低い作業から自動化すると、 安全にPythonを実務へ取り入れられます。
Pythonのipaddressとは何か
Pythonには、
IPv4・IPv6アドレスやネットワークを扱うための
ipaddress
モジュールが標準で用意されています。
外部ライブラリを追加インストールしなくても、 Python 3が利用できれば基本的なIPアドレス計算を始められます。
ip_address()
1つのIPv4またはIPv6アドレスを扱います。
例:192.168.10.1
ip_network()
サブネットやネットワーク範囲を扱います。
例:192.168.10.0/24
ip_interface()
プレフィックス付きの端末IPを扱います。
例:192.168.10.25/24
まずimportする
import ipaddress
以降のサンプルでは、
この
ipaddress
モジュールを利用します。
ライブラリとモジュールという言葉について
厳密には
ipaddress
はPython標準ライブラリに含まれるモジュールです。
初学者の段階では、
「Pythonに最初から用意されているIPアドレス操作機能」
と考えて問題ありません。
1つのIPアドレスを扱う
最も基本的なのが
ipaddress.ip_address()
です。
import ipaddress
ip = ipaddress.ip_address("192.168.10.25")
print(ip)
print(type(ip))
print(ip.version)
文字列だった
"192.168.10.25"
が、
IPv4Address
オブジェクトへ変換されます。
IPアドレスを単なる文字列ではなく 「IPアドレスとして意味を持つデータ」 に変えることがポイントです。
IPv6も同じ方法で扱える
import ipaddress
ip = ipaddress.ip_address("2001:db8::10")
print(ip)
print(type(ip))
print(ip.version)
ip_address()
は入力内容を見てIPv4かIPv6かを判断します。
IPv4用とIPv6用で別々の処理を書かなくても、
基本的な処理では同じ
ip_address()
を使用できます。
アドレス同士を比較する
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)
これは、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)
| プロパティ | 意味 | /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)
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()
が便利です。
import ipaddress
interface = ipaddress.ip_interface("192.168.10.25/24")
print("IPアドレス:", interface.ip)
print("所属ネットワーク:", interface.network)
print("サブネットマスク:", interface.netmask)
| 入力 | 適した関数 | 意味 |
|---|---|---|
| 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("ネットワークに含まれていません")
別ネットワークの場合
import ipaddress
ip = ipaddress.ip_address("192.168.20.25")
network = ipaddress.ip_network("192.168.10.0/24")
print(ip in network)
どんな場面で使えるのか
設計表の検査
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)
一般的なIPv4の/29ネットワークでは、
ネットワークアドレス
192.168.10.0
とブロードキャストアドレス
192.168.10.7
を除いたアドレスが取得できます。
リストとして保存する
import ipaddress
network = ipaddress.ip_network("192.168.10.0/29")
hosts = list(network.hosts())
print(hosts)
print("ホスト数:", len(hosts))
大きなネットワークを安易にlist化しないようにしましょう。
/8や大きなIPv6ネットワークなどでは、 含まれるアドレス数が非常に多くなります。 必要な範囲だけ処理する設計にすることが重要です。
ネットワークを複数のサブネットへ分割する
subnets()
を使うと、
あるネットワークをより小さいネットワークへ分割できます。
192.168.10.0/24を/26へ分割する
import ipaddress
network = ipaddress.ip_network("192.168.10.0/24")
for subnet in network.subnets(new_prefix=26):
print(subnet)
/24から/26へプレフィックスを2ビット増やしたため、 4つのサブネットへ分割されました。
192.168.10.0/24 を4分割
192.168.10.0/26
192.168.10.64/26
192.168.10.128/26
192.168.10.192/26
設計時の利用例
例えば
10.10.0.0/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
拠点が100か所ある場合でも、 手作業で100個のサブネットを記入する必要はありません。
Pythonでネットワークを生成してから、 拠点名やVLAN番号などと組み合わせて IPアドレス設計表を作ることができます。
ネットワークの重複を確認する
IPアドレス設計で危険なのが、 ネットワーク範囲の重複 です。
例えば次の2つを考えます。
- 192.168.10.0/24
- 192.168.10.128/25
2つ目のネットワークは、 1つ目のネットワークの内部に含まれています。
import ipaddress
network1 = ipaddress.ip_network("192.168.10.0/24")
network2 = ipaddress.ip_network("192.168.10.128/25")
print(network1.overlaps(network2))
重複していない場合は
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]
)
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を確認する
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)
実務では、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}")
処理の流れ
-
基準ネットワークを作成する
192.168.100.0/24をネットワークオブジェクトへ変換します。 - IPアドレスを1件ずつ読み込む 実務ではCSVやExcelから取得する形へ拡張できます。
- IPアドレス形式を検証する 不正な形式であれば、その時点でNGとします。
-
所属ネットワークを判定する
ip in networkで対象範囲に含まれるか確認します。 - 結果を出力する 正常・形式不正・ネットワーク範囲外に分類します。
この程度の短いコードでも、 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
を扱うために最も適した関数はどれですか。
ip_address()ip_network()ip_interface()hosts()
解答を見る
ip_address()
は1つのIPv4またはIPv6アドレスを扱うための関数です。
問題2.
192.168.10.25/24
のような端末IPとプレフィックスをセットで扱う場合、
最も適した関数はどれですか。
ip_address()ip_interface()overlaps()subnets()
解答を見る
ip_interface()
は特定ネットワーク上の端末IPを扱うのに適しています。
問題3. 次のコードは何を確認していますか。
if ip in network:
print("OK")
解答を見る
IPアドレスが指定したネットワーク範囲に含まれているか確認しています。
問題4.
192.168.10.0/24
を
/26
へ分割すると、いくつのサブネットになりますか。
- 2
- 4
- 8
- 16
解答を見る
/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"},
]
解答例を見る
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})"
)
課題3.さらに改善する
実務で使うなら、次の機能を追加するとより実践的です。
- 同一IPアドレスの重複検出
- ネットワークアドレスの重複検出
- ゲートウェイアドレスの確認
- 結果をCSVへ出力
- エラー件数を最後に表示
- 正常時だけ設定ファイル生成へ進む
ここまでできれば、 単なるPython学習ではなく、 実際のネットワーク設計レビューを補助するツール になっています。
自分の言葉で説明する課題
後輩エンジニアから、 次のように質問されました。
「IPアドレスはExcelでも管理できますよね。 なぜわざわざ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アドレスは例外処理を使って検出できる
- 自動化は設定投入から始めるのではなく、 計算・検証・情報取得などリスクの低い処理から始める
ネットワーク自動化の第一歩は、 コマンドを自動投入することではありません。 人が繰り返している判断や確認を、 プログラムで再現できるようにすることです。
参考資料
上級編では、要件定義・基本設計・BGP・クラウド・セキュリティに加え、 Python、Ansible、REST API、Git、テレメトリー、 AIを活用したネットワーク運用まで順番に学びます。

コメント