IPv4サブネッティング チュートリアル:混乱せずにサブネットを計算する方法

Networking tutorial - IT technology blog
Networking tutorial - IT technology blog

クイックスタート:5分でわかるサブネッティング

本番スイッチでVLANを半年間設定し、深夜2時にルーティング問題をデバッグする経験を通じて、一つのことが明確になった。サブネッティングこそが「ネットワークを知っている」と「ネットワークを本当に理解している」の差を分けるものだ。慣れるまでに恥ずかしいほど時間がかかったが、いったん習得したら、ずっと難しく考えすぎていたことに気づいた。

基本的な考え方はこうだ:192.168.1.0/24のようなIPv4アドレスは、ネットワーク部とホスト部の2つに分かれている。/24(CIDR表記)はネットワーク用に24ビットが予約されており、ホスト用に8ビットが残ることを意味する。

今すぐ必要な計算式:

使用可能なホスト数 = 2^(32 - prefix_length) - 2

例:
/24 → 2^8  - 2 = 254 ホスト
/25 → 2^7  - 2 = 126 ホスト
/26 → 2^6  - 2 = 62  ホスト
/27 → 2^5  - 2 = 30  ホスト
/28 → 2^4  - 2 = 14  ホスト
/30 → 2^2  - 2 = 2   ホスト  ← ポイントツーポイントWANリンク

「-2」はネットワークアドレス(最初のIP)とブロードキャストアドレス(最後のIP)を除いたもの。どちらもホストに割り当てることができない。

深掘り:サブネッティングの背後にある2進数計算

2進数が好きである必要はない。しかし、面接中のホワイトボードでサブネット計算を解いたり、本番環境がダウンして誰かが叫んでいる最中に対応できる程度の習熟度は必要だ。

サブネットマスクの仕組み

サブネットマスクは32ビットで構成されており、連続する1の後に連続する0が続く。1のビットがネットワークを識別し、0のビットがそのネットワーク内のホストを識別する。

/24 マスク(2進数):
11111111.11111111.11111111.00000000 = 255.255.255.0

/26 マスク(2進数):
11111111.11111111.11111111.11000000 = 255.255.255.192

ネットワークアドレス、ブロードキャスト、使用可能な範囲の計算

192.168.10.50/26をステップごとに見ていこう。

ステップ1 — 2進数に変換:

IP:   192.168.10.50  = 11000000.10101000.00001010.00110010
Mask: /26            = 11111111.11111111.11111111.11000000

ステップ2 — ネットワークアドレス(ビット単位AND):

  11000000.10101000.00001010.00110010
AND
  11111111.11111111.11111111.11000000
= 11000000.10101000.00001010.00000000
= 192.168.10.0

ステップ3 — ブロードキャストアドレス(ホストビットをすべて1に設定):

  11000000.10101000.00001010.00111111
= 192.168.10.63

ステップ4 — 使用可能な範囲: 192.168.10.1から192.168.10.62 — 62個の使用可能なホストアドレス。

Pythonの組み込みipaddressモジュールでこれを即座に確認できる:

import ipaddress

network = ipaddress.ip_network('192.168.10.50/26', strict=False)
print(f"ネットワーク:       {network.network_address}")
print(f"ブロードキャスト:   {network.broadcast_address}")
print(f"使用可能:          {network.num_addresses - 2}")
print(f"先頭アドレス:      {list(network.hosts())[0]}")
print(f"末尾アドレス:      {list(network.hosts())[-1]}")

出力:

ネットワーク:       192.168.10.0
ブロードキャスト:   192.168.10.63
使用可能:          62
先頭アドレス:      192.168.10.1
末尾アドレス:      192.168.10.62

Linuxでは、ターミナルからipcalcで同じことができる:

ipcalc 192.168.10.50/26

応用編:VLSMと実際のサブネット設計

VLSM(可変長サブネットマスク)は、サブネッティングが理論から実践に変わる瞬間だ。均等なブロックに分けるのではなく、実際の需要に合わせてサブネットのサイズを決める。40人規模のオフィスで1つの/24を十数個のVLANに分割したことがあるが、VLSMなしでは誰も必要としない大きすぎるブロックに100以上のアドレスが永遠に眠ることになっていた。

VLSM:実践的なシナリオ

192.168.1.0/24があり、4つの部門にサブネットを割り当てる必要があるとしよう:

  • 営業部:100ホスト
  • IT部:50ホスト
  • 管理部:10ホスト
  • WANリンク:2ホスト

フラグメンテーションを避けるために、常に最大のサブネットから割り当てる:

営業部(100ホスト):
  必要:2^7 = 128アドレス → /25
  サブネット:192.168.1.0/25
  範囲:192.168.1.1 – 192.168.1.126
  ブロードキャスト:192.168.1.127

IT部(50ホスト):
  必要:2^6 = 64アドレス → /26
  サブネット:192.168.1.128/26
  範囲:192.168.1.129 – 192.168.1.190
  ブロードキャスト:192.168.1.191

管理部(10ホスト):
  必要:2^4 = 16アドレス → /28
  サブネット:192.168.1.192/28
  範囲:192.168.1.193 – 192.168.1.206
  ブロードキャスト:192.168.1.207

WANリンク(2ホスト):
  必要:2^2 = 4アドレス → /30
  サブネット:192.168.1.208/30
  範囲:192.168.1.209 – 192.168.1.210
  ブロードキャスト:192.168.1.211

合計:128 + 64 + 16 + 4 = 256個中212アドレスを使用。無駄のない、効率的な割り当てだ。

/24を等しいブロックに分割する

均等なサブネットがまさに必要な場合もある。ホスト部からビットを借用するたびに、サブネット数が2倍になる:

# 10.0.0.0/24を4つの等しい/26サブネットに分割する
# ホスト部から2ビットを借用(2^2 = 4サブネット)

python3 -c "
import ipaddress
net = ipaddress.ip_network('10.0.0.0/24')
for subnet in net.subnets(new_prefix=26):
    print(subnet)
"

出力:

10.0.0.0/26
10.0.0.64/26
10.0.0.128/26
10.0.0.192/26

本番ネットワークから得た貴重な教訓

教科書には載っていないこと:

  • ポイントツーポイントWANリンクには/30を使う(/31ではなく)— 両端がRFC 3021をサポートしていると確認済みでない限り。古いデバイスの多くは/31のトラフィックを黙って破棄する。
  • 本番に適用する前に検証する。ルーターやファイアウォールの設定を変更する前に、ipcalcや上記のPythonコードで確認しよう。サブネットマスクの1桁間違いで3時間のデバッグを強いられた経験がある。
  • サブネットを自然な境界に合わせる。VLAN 10は10.0.10.0/24に、VLAN 20は10.0.20.0/24にきれいに対応させる。パターンベースのアドレス設計により、深夜2時のトラブルシューティングが格段に楽になる。
  • 割り当てを文書化する。NetBoxとphpIPAMはまさにこのために作られている。スプレッドシートでも構わない。どちらにせよ必ず記録しておくこと — 文書化されていないサブネットのIPアドレス競合は、解決に丸一日かかることがある。
  • /24から/30を暗記する。実際には、サブネッティング作業の約95%がこの範囲に収まる。それ以外はその場で計算できる。

クイックリファレンス チートシート:

プレフィックス | マスク              | アドレス数 | 使用可能
/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
/29           | 255.255.255.248   | 8         | 6
/30           | 255.255.255.252   | 4         | 2

直感を定着させるために、2進数を手動で何回か計算してみよう。その後は、本番環境に関わる作業はipcalcとPythonに任せればいい。サーバーがダウンしているときに暗算しても誰も褒めてはくれない。

Share: