Mímisbrunnr知恵の泉

← コンピュータネットワーク 一覧

🎓 レベル:基礎 | 重要度:A(必須・CCNA最重要) 📎 前提:IPアドレスの基礎(IPv4)

要点(BLUF)

サブネット化の基本:マスクを伸ばす

/24 のネットワーク(ホスト254台)を、もっと小さく区切りたいとします。マスクを /26 まで2ビット伸ばすと、2^2 = 4 個のサブネットに分かれ、各サブネットのホストは 2^(32-26) - 2 = 62 台になります。

プレフィックスマスクサブネット内アドレス数利用可能ホスト数
/24255.255.255.0256254
/25255.255.255.128128126
/26255.255.255.1926462
/27255.255.255.2243230
/28255.255.255.2401614
/30255.255.255.25242

/30 はホスト2台ちょうどで、ルータ間のポイントツーポイントリンクに多用します。

ネットワーク/ブロードキャスト/ホスト範囲の求め方

各サブネットには3種のアドレスがあります。

Pythonの ipaddress192.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

200192/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の希少性が、この最適化を必須にしました。

⚠️ よくある誤解

対応 lab

関連