🎓 レベル:基礎 | 重要度:A(必須・CCNA最重要) 📎 前提:IPアドレスの基礎(IPv4)
要点(BLUF)
- サブネット化は、1つのネットワークを必要な分だけ小さく分割し、アドレスを無駄なく割り当てる技術です。CCNA最頻出スキル。
- プレフィックスを1ビット伸ばすごとにサブネット数は2倍、ホスト数は約半分になります。ホスト数は
2^(32-prefix) - 2(ネットワークアドレスとブロードキャストの2つを除く)。 - 必要ホスト数に応じてマスク長を変えるVLSMで、アドレスを最適に配ります。
サブネット化の基本:マスクを伸ばす
/24 のネットワーク(ホスト254台)を、もっと小さく区切りたいとします。マスクを /26 まで2ビット伸ばすと、2^2 = 4 個のサブネットに分かれ、各サブネットのホストは 2^(32-26) - 2 = 62 台になります。
| プレフィックス | マスク | サブネット内アドレス数 | 利用可能ホスト数 |
|---|---|---|---|
| /24 | 255.255.255.0 | 256 | 254 |
| /25 | 255.255.255.128 | 128 | 126 |
| /26 | 255.255.255.192 | 64 | 62 |
| /27 | 255.255.255.224 | 32 | 30 |
| /28 | 255.255.255.240 | 16 | 14 |
| /30 | 255.255.255.252 | 4 | 2 |
/30 はホスト2台ちょうどで、ルータ間のポイントツーポイントリンクに多用します。
ネットワーク/ブロードキャスト/ホスト範囲の求め方
各サブネットには3種のアドレスがあります。
- ネットワークアドレス:ホスト部が全0(そのサブネットの名前。端末には割り当てない)。
- ブロードキャストアドレス:ホスト部が全1(サブネット内全員宛て)。
- 利用可能ホスト:その間の値。
Pythonの ipaddress で 192.168.1.0/24 を4つの /26 に分割し、各範囲を出します(言語明示)。
import ipaddress
net = ipaddress.ip_network("192.168.1.0/24")
for sub in net.subnets(new_prefix=26):
hosts = list(sub.hosts())
print(f"{sub} network={sub.network_address} "
f"broadcast={sub.broadcast_address} "
f"range={hosts[0]}-{hosts[-1]} usable={sub.num_addresses - 2}")
実行結果:
192.168.1.0/26 network=192.168.1.0 broadcast=192.168.1.63 range=192.168.1.1-192.168.1.62 usable=62
192.168.1.64/26 network=192.168.1.64 broadcast=192.168.1.127 range=192.168.1.65-192.168.1.126 usable=62
192.168.1.128/26 network=192.168.1.128 broadcast=192.168.1.191 range=192.168.1.129-192.168.1.190 usable=62
192.168.1.192/26 network=192.168.1.192 broadcast=192.168.1.255 range=192.168.1.193-192.168.1.254 usable=62
「ブロックサイズ64ごとに区切れる」という規則性(0, 64, 128, 192)が、手計算でのサブネット境界の見つけ方そのものです。
あるIPがどのサブネットに属するか
/26 の世界で 192.168.1.200 はどのサブネットか。マスクを掛けてネットワークアドレスを求めます。
import ipaddress
iface = ipaddress.ip_interface("192.168.1.200/26")
print("address :", iface.ip)
print("network :", iface.network.network_address)
print("broadcast :", iface.network.broadcast_address)
print("is this the network/broadcast?:",
iface.ip in (iface.network.network_address, iface.network.broadcast_address))
実行結果:
address : 192.168.1.200
network : 192.168.1.192
broadcast : 192.168.1.255
is this the network/broadcast?: False
200 は 192/26(192〜255)のサブネットに属し、端末用として使えるアドレスです。
VLSM:必要数から設計する
1つの /24 を、部署ごとに必要ホスト数が違うまま割るのがVLSM(可変長サブネットマスク)。大きい要求から先に切るのがコツです。
要件:営業100台 / 開発50台 / 管理25台 / ルータ間リンク2台。
import ipaddress
base = ipaddress.ip_network("192.168.1.0/24")
needs = [("Sales", 100), ("Dev", 50), ("Admin", 25), ("P2P", 2)]
next_addr = int(base.network_address)
for name, n in needs:
bits = 1
while (2 ** bits) - 2 < n: # 必要ホスト数を満たす最小のブロックビット
bits += 1
prefix = 32 - bits
block = 2 ** bits
if next_addr % block != 0: # ブロック境界へ整列
next_addr += block - (next_addr % block)
sub = ipaddress.ip_network((next_addr, prefix))
print(f"{name:6} -> {sub} usable={block - 2}")
next_addr += block
実行結果:
Sales -> 192.168.1.0/25 usable=126
Dev -> 192.168.1.128/26 usable=62
Admin -> 192.168.1.192/27 usable=30
P2P -> 192.168.1.224/30 usable=2
100台には /25(126)、50台には /26(62)、25台には /27(30)、2台には /30 がそれぞれ最小で足り、重ならずに収まりました。大きい要求から順に、ちょうど足りるブロックを割る——これがVLSM設計の型です。
なぜサブネット化するのか(設計の直観)
平坦に /24 を1つ配ると、(1) ブロードキャストが254台に届いて非効率、(2) 部署間にセキュリティ境界がない、(3) 余ったアドレスが死蔵される。サブネット化はブロードキャスト範囲・障害範囲・セキュリティ境界を必要サイズに整え、アドレスを節約します。IPv4の希少性が、この最適化を必須にしました。
⚠️ よくある誤解
- 「ホスト数は 2^(32-prefix)」ではない。必ず**-2**(ネットワークとブロードキャスト)。ただし
/31はP2P専用に2台使える例外(RFC 3021)、/32は単一ホスト。 - 「VLSMは小さい要求から割る」ではない。大きい要求から割らないと、後で大きいブロックが連続して取れず断片化します。
- 「マスクはどこで区切ってもよい」ではない。マスクは先頭から連続する1でなければならず、
255.255.0.255のような飛び地は不正です。
対応 lab
[[networking-study/labs/03-02_subnetting.py]]— /26分割・所属判定・VLSM設計の実証
関連
- 前:
[[03-01_IPアドレスの基礎]]/次:[[03-03_ルーティングの基礎]] - 経路の集約に直結:
[[06-04_ルーティングの比較と再配布]]/設計演習:[[08-04_総合演習]]