2026年7月28日
2026年7月28日
サブネットマスクとCIDR表記の計算方法(ネットワーク・ブロードキャスト・ホスト数)
サブネットの計算は「プレフィックス長からブロックの大きさを出し、そのブロックのどこにアドレスが入るかを見る」だけで、2進数を毎回書き出さなくても求められます。この記事では、CIDR表記とサブネットマスクの対応、ネットワークアドレス・ブロードキャストアドレス・使えるホスト数の出し方を手計算の手順で説明し、最後にコマンドとPythonで検算する方法まで紹介します。ファイアウォールやnginxのアクセス制限で 203.0.113.0/24 のような指定を書く前の確認に使ってください。
CIDR表記とサブネットマスクの関係
IPv4アドレスは32ビットです。CIDR表記の /24 は「先頭24ビットがネットワーク部、残り8ビットがホスト部」という意味で、サブネットマスクではネットワーク部のビットを1、ホスト部を0にした値 255.255.255.0 で表します。どちらも同じ情報を別の書き方で表しているだけです。
マスクの各オクテット(8ビットの区切り)に現れる値は、次の9種類しかありません。
| 1のビット数 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
|---|---|---|---|---|---|---|---|---|---|
| マスク値 | 0 | 128 | 192 | 224 | 240 | 248 | 252 | 254 | 255 |
たとえば /26 は 8+8+8+2 なので 255.255.255.192、/20 は 8+8+4 なので 255.255.240.0 です。この表を覚えておくと、相互の変換はすぐにできます。
よく使うプレフィックス長の早見表
| CIDR | サブネットマスク | アドレス総数 | 使えるホスト数 |
|---|---|---|---|
| /16 | 255.255.0.0 | 65,536 | 65,534 |
| /20 | 255.255.240.0 | 4,096 | 4,094 |
| /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 |
| /32 | 255.255.255.255 | 1 | (単一ホスト指定) |
アドレス総数は 2 の(32 − プレフィックス長)乗です。通常のサブネットでは先頭がネットワークアドレス、末尾がブロードキャストアドレスとして予約されるため、ホストに割り当てられるのは総数から2を引いた数になります。
例外として、2台を直結するポイントツーポイント回線では /31 の2アドレスを両方ホストに使う方式(RFC 3021)があります。また /32 はファイアウォールなどで「この1台だけ」を指定するときに使います。
手計算の手順(例: 192.168.10.77/26)
ここからが本題です。192.168.10.77/26 が属するネットワークを求めてみます。
- 区切りが入るオクテットを特定する:/26 は 24 を超えるので、第4オクテットの中で区切られます。
- ブロックサイズを出す:256 − マスク値で求めます。/26 のマスク値は192なので、256 − 192 = 64。第4オクテットは 0、64、128、192 の4つのブロックに分かれます。
- アドレスがどのブロックに入るかを見る:77 は 64〜127 のブロックに入ります。
- 結果を読み取る:
- ネットワークアドレス:192.168.10.64 - ブロードキャストアドレス:192.168.10.127 - ホストに使える範囲:192.168.10.65〜192.168.10.126(62個)
ポイントは「ブロックサイズの倍数のうち、対象の値を超えない最大のもの」がネットワークアドレスになることです。次のブロックの先頭から1を引いたものがブロードキャストアドレスです。
第3オクテットで区切られる場合(例: 172.16.37.10/20)
プレフィックス長が16〜23のときは、第3オクテットで同じ計算をします。
- /20 は 8+8+4 なので、第3オクテットのマスク値は240。ブロックサイズは 256 − 240 = 16 です。
- 第3オクテットは 0、16、32、48 … と16刻みになり、37 は 32〜47 のブロックに入ります。
- 区切りより後ろのオクテット(第4オクテット)は、ネットワークアドレスでは0、ブロードキャストアドレスでは255になります。
結果は、ネットワークアドレス 172.16.32.0、ブロードキャストアドレス 172.16.47.255、ホストに使える範囲は 172.16.32.1〜172.16.47.254 の4,094個です。第4オクテットが0や255のアドレスでも、範囲の途中にあればホストとして使える点は誤解されやすいところです。
設定で使うときに注意したい点
ホスト部が0でない指定
ufw allow from 203.0.113.77/24 のように、ホスト部に値が残ったままのCIDRを書くと、ツールによってネットワークアドレスに丸められたり、エラーになったりします。意図しない範囲を許可していないか確認するため、設定には 203.0.113.0/24 のようにネットワークアドレスで書くのが無難です。
複数のネットワークをまとめる(集約)
192.168.0.0/24 と 192.168.1.0/24 は、まとめて 192.168.0.0/23 と書けます。ただし集約できるのは、ブロックの境界がそろっている場合だけです。192.168.1.0/24 と 192.168.2.0/24 は隣り合っていても /23 にはまとめられません(192.168.0.0/23 と 192.168.2.0/23 の別ブロックにまたがるため)。
ワイルドカードマスク
ルーターの設定などではサブネットマスクのビットを反転した「ワイルドカードマスク」を使うことがあります。/26 なら 255.255.255.192 を反転して 0.0.0.63 です。
クラウドの予約アドレス
AWSのVPCでは、各サブネットの先頭4つと末尾1つのアドレスがクラウド側で予約されます。Azureの仮想ネットワークも同様に5つを予約する仕様です(2026年10月現在)。/28 のような小さいサブネットを作ると実際に使える数がかなり減るため、各サービスのドキュメントで最新の仕様を確認してから設計してください。
プライベート範囲の重複
DockerやVPNを使うサーバーでは、既定で割り当てられるプライベートアドレスが社内ネットワークと重なり、特定の宛先にだけつながらなくなることがあります。設計時に、使う範囲を一覧にして重複がないか計算しておくと防げます。
コマンドとPythonで検算する
手計算の結果は、ツールで検算する習慣をつけると設定ミスを減らせます。Linuxでは ipcalc が手軽ですが、ディストリビューションによって別の実装が入っており、オプションや出力形式が異なります。
# Debian/Ubuntu: sudo apt install ipcalc RHEL系: 標準で入っていることが多い
ipcalc 192.168.10.77/26
環境に依存せず確かめたいときは、Python標準の ipaddress モジュールが便利です。
import ipaddress
iface = ipaddress.ip_interface("192.168.10.77/26")
net = iface.network
print(net) # 192.168.10.64/26
print(net.netmask) # 255.255.255.192
print(net.hostmask) # 0.0.0.63(ワイルドカードマスク)
print(net.network_address) # 192.168.10.64
print(net.broadcast_address) # 192.168.10.127
print(net.num_addresses - 2) # 62
# 2つのネットワークを集約できるか
nets = [ipaddress.ip_network("192.168.0.0/24"), ipaddress.ip_network("192.168.1.0/24")]
print(list(ipaddress.collapse_addresses(nets))) # [IPv4Network('192.168.0.0/23')]
ipaddress.ip_network("192.168.10.77/26") のようにホスト部が残った値を渡すと ValueError になります。これは「ネットワークの指定としては不正」という意味で、設定ファイルの書き間違いを見つけるのに役立ちます。ホストのアドレスとして扱いたいときは上の例のように ip_interface を使うか、strict=False を指定します。
IPv6でも考え方は同じで、LANには一般に /64 を割り当てます。ホスト部が64ビットあるため、ホスト数を数えることより、プレフィックスの境界(/48、/56、/64 など)を正しく区切ることが設計の中心になります。
まとめ
- CIDRの
/nは先頭nビットがネットワーク部という意味で、サブネットマスクは同じ情報の別表記です。 - マスク値は 0・128・192・224・240・248・252・254・255 の9種類。256から引けばブロックサイズが出ます。
- ネットワークアドレスはブロックサイズの倍数、ブロードキャストは次のブロックの1つ手前、ホスト数は総数から2を引いた数です。
- 設定にはネットワークアドレスで書き、集約はブロック境界がそろう場合だけ可能です。
- クラウドの予約アドレスやプライベート範囲の重複も考慮し、
ipcalcや Python のipaddressで検算してから反映してください。