サブネットマスクは、IPv4 アドレスのうち「どこまでがネットワークを表し、どこからが個々の機器(ホスト)を表すか」を示す 32 ビットの値です。左側に 1 が並び、右側に 0 が並びます。1 の部分がネットワーク部、0 の部分がホスト部です。255.255.255.0 という見慣れた値も、2 進数に直すと「1 が 24 個、0 が 8 個」というだけの意味になります。

この記事では、サブネットマスクを 2 進数で読むところから始めて、CIDR 表記との換算、ネットワークアドレスの求め方、基本情報技術者試験の過去問、/31 と /32 の例外、クラウドで使えるアドレス数までを順に説明します。計算結果はすべて IPサブネット計算ツール で求めた値で、サイトのテストがツールのコードで再計算しています。例のアドレスは RFC 1918 のプライベートアドレスと、RFC 5737 の文書用アドレスです。

サブネットマスクとは:ネットワーク部とホスト部の境目

同じネットワークにいる機器どうしは、ルーターを通さずに直接通信します。別のネットワークあての通信はデフォルトゲートウェイ(ルーター)に渡します。機器がこの判断をするときに使うのがサブネットマスクです。自分の IP アドレスと相手の IP アドレスにそれぞれサブネットマスクで論理積(AND)を取り、結果のネットワークアドレスが同じなら同じネットワークと判断します。

サブネットマスクは 1985 年の RFC 950(Internet Standard Subnetting Procedure)で定められました。RFC 950 は 1 のビットが連続していなくてもよいとしつつ、連続させることを推奨していました。現在の CIDR を定めた RFC 4632 は「マスクは左詰めで連続していなければならない」(the mask must be left contiguous)としています。1 が必ず左から連続するので、マスクは「1 の個数」だけで表せます。これが /24 のような CIDR 表記(プレフィックス長)です。

255.255.255.0 を2進数で読む

PC の IP アドレスが 192.168.1.10、サブネットマスクが 255.255.255.0 の場合を 2 進数で並べます。

IPアドレス          11000000.10101000.00000001|00001010   192.168.1.10
サブネットマスク    11111111.11111111.11111111|00000000   255.255.255.0
ネットワーク        11000000.10101000.00000001|00000000   192.168.1.0
ブロードキャスト    11000000.10101000.00000001|11111111   192.168.1.255

縦線の左側 24 ビットがネットワーク部です。ホスト部 8 ビットをすべて 0 にしたものがネットワークアドレス 192.168.1.0、すべて 1 にしたものがブロードキャストアドレス 192.168.1.255 です。この 2 つは機器に割り当てられないので、使えるのは 192.168.1.1 から 192.168.1.254 までの 254 個です。つまり 255.255.255.0 は「この LAN には最大 254 台」という意味でもあります。

マスクを 255.255.255.192 に変えると、1 が 2 個増えて 26 個になります。

ホスト部は 6 ビットに減り、同じ 192.168.1.10 が属するネットワークは 192.168.1.0〜192.168.1.63、使えるホストは 62 個になります。192.168.1.70 は隣のネットワーク(192.168.1.64〜.127)に入るので、2 台の間の通信はルーターを経由します。見た目が似たアドレスでも、マスクが変われば「同じネットワークかどうか」の答えが変わります。

サブネットマスクとCIDR表記の換算表

1 オクテット(8 ビット)の中でマスクが取りうる値は、次の 9 種類しかありません。この表を覚えておくと、どの換算も暗算できます。

1 の個数2 進数10 進数そのオクテットでの刻み幅
0000000000256
110000000128128
21100000019264
31110000022432
41111000024016
5111110002488
6111111002524
7111111102542
8111111112551

CIDR 表記からマスクに直すには、8 ビットごとに 255 を置き、余りを表で引いて、残りを 0 で埋めます。/22 は 8 + 8 + 6 なので 255.255.252.0 です。逆に 255.255.255.240 は 8 + 8 + 8 + 4 で /28 です。255.255.255.200(11001000)のように 1 の間に 0 が挟まる値はマスクとして無効です。

よく使う範囲をまとめると次のとおりです。使えるホスト数は「2 のホスト部ビット数乗 − 2」で、/31 と /32 だけは後述の例外です。

CIDRサブネットマスクアドレス数使えるホスト数
/16255.255.0.065,53665,534
/22255.255.252.01,0241,022
/23255.255.254.0512510
/24255.255.255.0256254
/25255.255.255.128128126
/26255.255.255.1926462
/27255.255.255.2243230
/28255.255.255.2401614
/29255.255.255.24886
/30255.255.255.25242

Cisco 機器の ACL などで使うワイルドカードマスクは、サブネットマスクの 0 と 1 を反転したものです。各オクテットを 255 から引けば求まり、/22 なら 0.0.3.255 になります。

ネットワークアドレスの求め方:基本情報技術者試験の過去問で練習

IPA の基本情報技術者試験では、この計算が午前問題(現在の科目 A)に繰り返し出ています。IPA が公開している平成29年度秋期の問題冊子の午前 問35 は次の問題です。

次の IP アドレスとサブネットマスクをもつ PC がある。この PC のネットワークアドレスとして,適切なものはどれか。IP アドレス:10.170.70.19 サブネットマスク:255.255.255.240 (ア 10.170.70.0 イ 10.170.70.16 ウ 10.170.70.31 エ 10.170.70.255)

2 進数で AND を取るのが正攻法ですが、刻み幅を使うと速く解けます。マスクが変わる第 4 オクテットは 240 なので、刻み幅は 256 − 240 = 16 です。ネットワークは .0、.16、.32…と 16 ごとに区切られ、19 は 16 と 32 の間にあります。したがってネットワークアドレスは 10.170.70.16、正解はイです。ウの 10.170.70.31 は同じネットワークのブロードキャストアドレスです。

ツールで確かめるときは、マスクを CIDR 表記に直して 10.170.70.19/28 と入力します(スラッシュの後ろに 255.255.255.240 は書けません)。ネットワークアドレス 10.170.70.16、ブロードキャストアドレス 10.170.70.31、使えるホスト 14 個と表示されます。

平成31年度春期の午前 問32 は、ホスト数を問う形です。

192.168.0.0/23(サブネットマスク 255.255.254.0)の IPv4 ネットワークにおいて,ホストとして使用できるアドレスの個数の上限はどれか。 (ア 23 イ 24 ウ 254 エ 510)

ホスト部は 32 − 23 = 9 ビットなので 2⁹ = 512 個、ネットワークアドレスとブロードキャストアドレスを除いて 510 個、正解はエです。ツールでも 192.168.0.0/23 の使用可能ホスト数は 510 です。/23 は 192.168.0.0〜192.168.1.255 の 2 つの /24 をまとめた範囲です。

「2を引く」理由と /31・/32 の例外

ホスト部がすべて 0 のアドレスはネットワークそのもの、すべて 1 のアドレスはネットワーク内の全機器あて(ブロードキャスト)を意味します。RFC 950 はこの解釈を引き継ぎ、ホストには割り当てないとしました。これが「2 を引く」理由です。

ただしルーター同士を 1 対 1 でつなぐリンクには相手が 1 台しかおらず、ブロードキャストが要りません。/30 では 4 個のうち 2 個がネットワークとブロードキャストに消えます。RFC 3021(2000 年)はこうしたポイントツーポイントリンクで 31 ビットのマスクを使うことを認め、2 つのアドレスは「ホストアドレスとして解釈しなければならない」(MUST be interpreted as host addresses)と定めています。

ツールも RFC 3021 に従い、203.0.113.9/31 の使用可能ホスト数を 2(203.0.113.8 と 203.0.113.9)と表示します。/31 と /32 のブロードキャストアドレスの欄は「なし」と理由を表示します。/32 は 1 個のアドレスだけを表し、ホストルートやファイアウォールの許可リストで使います。前の節の過去問 2 問も「2 を引く」前提の問題です。/31 は、対応した機器でルーター間リンクを設定するときの選択肢と考えてください。

サブネット分割(VLSM)の手順

1 つのアドレスブロックを部署ごとに分けるときは、必要なホスト数に合わせてプレフィックス長を変えます(VLSM:可変長サブネットマスク)。例として、事務所に割り当てられた 172.16.0.0/24(256 個)を、営業部 100 台、開発部 50 台、会議室 Wi-Fi 20 台、ネットワーク機器の管理用 5 台、ルーター間リンク 1 本に分けます。

  1. 台数 + 2 が入る最小のブロックを選びます。100 台は /25(126 個)、50 台は /26(62 個)、20 台は /27(30 個)、5 台は /29(6 個)、リンクは /30 です(機器が /31 に対応していれば /31)。
  2. 大きいブロックから順に先頭から割り当てます。2ⁿ 個のブロックは 2ⁿ の倍数から始める必要があるため、大きい順に並べると隙間ができません。
  3. 割り当てた範囲をツールで確認します。
用途必要台数割り当て範囲(ネットワーク〜ブロードキャスト)使えるホスト
営業部100172.16.0.0/25172.16.0.0〜172.16.0.127126
開発部50172.16.0.128/26172.16.0.128〜172.16.0.19162
会議室 Wi-Fi20172.16.0.192/27172.16.0.192〜172.16.0.22330
管理用5172.16.0.224/29172.16.0.224〜172.16.0.2316
ルーター間リンク2172.16.0.232/30172.16.0.232〜172.16.0.2352

172.16.0.236〜172.16.0.255 の 20 個(/30、/28 の 2 ブロック)が残ります。小さいブロックから割り当てると、たとえば管理用の /29 を先頭に置いた時点で /25 を 172.16.0.0 から始められなくなります。

クラウドでは予約アドレスがさらに増える

AWS や Azure などのクラウドでは、サブネットごとにルーターや DNS 用のアドレスが追加で予約されます。ツールの「使用可能ホスト数」から、さらに次の数を引いてください。

サービスサブネットごとの予約/24 で使える数/28 で使える数サブネットの大きさ
一般的な LAN(ツールの表示)2:ネットワーク、ブロードキャスト25414—
AWS VPC5:先頭 4 個と最後の 1 個25111/28〜/16
Azure Virtual Network5:ネットワーク、既定ゲートウェイ、Azure DNS 用 2 個、ブロードキャスト25111最小 /29、最大 /2
Google Cloud VPCプライマリ範囲で 4:ネットワーク、ゲートウェイ、最後から 2 番目、ブロードキャスト25212/29〜/4

AWS のドキュメントは 10.0.0.0/24 を例に、.0 がネットワークアドレス、.1 が VPC ルーター、.2 が DNS サーバー、.3 が将来の利用のための予約、.255 は VPC がブロードキャストをサポートしないため予約、と説明しています。AWS の最小サブネット /28 では、16 個のうち 11 個しか EC2 などに割り当てられません。Google Cloud はセカンダリ範囲では全アドレスを使えます。

クラスフルからCIDRへ:RFC 950・RFC 1878・RFC 4632

かつての IPv4 アドレスは、先頭のビットでネットワークの大きさが決まる「クラス」方式でした。クラス A は /8、クラス B は /16、クラス C は /24 に固定され、2,000 台のネットワークにはクラス B(65,536 個)を割り当てるか、クラス C を何個も並べるしかありませんでした。RFC 4632(2006 年、1993 年の RFC 1519 を置き換え)は、すべてのネットワークをプレフィックス長つきで表し、2 のべき乗の大きさなら何でも使えるようにしました。RFC 4632 自身が、旧クラス B の 172.16.0.0 は「プレフィックス 172.16.0.0/16 として定義される」と例示しています。

古い参考書では、サブネットの数からも 2 を引く説明が残っています。これは RFC 950 が「サブネット部がすべて 0 またはすべて 1 の値は実際のサブネットに割り当てるべきではない」としていたためです。1995 年の RFC 1878 はこの慣行について「This practice is obsolete!」と明記し、現在のソフトウェアはすべてのサブネットを使えるとしています。/24 を 3 ビット借りて分ければ、サブネットは 8 個です。

CIDR のもう 1 つの柱は最長一致です(RFC 4632 5.1 節)。ルーティングテーブルに 10.0.0.0/8 と 10.20.1.0/24 の両方があれば、10.20.1.9 あてのパケットは一致するビットが多い /24 に従います。サブネットが重なっていてもエラーにならず、より細かい経路が黙って優先されるため、重複は気づきにくいトラブルになります。

よくある間違い

  • ツールや設定画面に 255.255.255.240 をそのまま入れる。 このツールはスラッシュの後ろに /28 のようなプレフィックス長を求めます。上の換算表で直してから入力してください。
  • 先頭に 0 を付ける。 192.168.001.010 は、このツールも Python の ipaddress も無効として扱います。古い実装には 010 を 8 進数の 8 と読むものがあり、同じ文字列が別の機器を指すおそれがあります。
  • ワイルドカードマスクとサブネットマスクの取り違え。 ACL に 0.0.0.255 と書くべきところを 255.255.255.0 と書くと、まったく別のアドレス群に一致します。
  • 重複した範囲で拠点やクラウドをつなぐ。 両方が 10.0.0.0/16 を使っていると VPN やピアリングが成立しません。AWS のドキュメントも、IPv4 または IPv6 の CIDR ブロックが一致または重複する VPC 間ではピアリング接続を作成できないとしています。

ツールは IPv4 のサブネットを 1 つずつ計算します。ブロックの分割や範囲の重なりの判定は行わないので、VLSM の表は上の手順で作り、各行をツールで確認する使い方になります。