こんにちは、かつコーチです。
IPアドレスの仕組みがわかってくると、次にぶつかる壁が「サブネットマスク」と「CIDR表記」です。
255.255.255.0や/24といった表記を見て、何を意味しているのかわからず戸惑った経験はないでしょうか。
この記事では、サブネットマスクとCIDR表記を、住所の「区切り方」に置き換えながら解説します。
読み終える頃には、/24のような表記が何を意味しているのか、自分で判断できるようになります。
サブネットマスクとは?
サブネットマスク=住所の「町までの区切り」を決める線引き
サブネットマスクとは、IPアドレスのうち「どこまでが同じネットワークを表す部分か」を区切るための数値のことです。
たとえるなら、サブネットマスクは「住所の、どこまでが同じ町か」を決める区切り線だとイメージしてください。
「〇〇県〇〇市〇〇町1-2-3」という住所があったとき、「〇〇県〇〇市〇〇町」までが同じ地域を表す部分で、「1-2-3」がその地域の中の個別の番地です。
同じ町に住んでいる人同士は、町内をすぐに行き来できますが、違う町に行くには、もう少し大きな道路(ルーター)を経由する必要があります。
サブネットマスクは、IPアドレスの中の「町までの部分(ネットワーク部)」と「番地の部分(ホスト部)」の境界線を決める役割を果たしています。
なぜサブネットマスクが必要なのか
サブネットマスクがなければ、あるIPアドレスを見たときに、それが「自分と同じネットワーク(同じ町)にいる機器」なのか、「別のネットワーク(別の町)にいる機器」なのかを判断できません。
同じ町にいる機器同士なら直接やり取りできますが、別の町にいる機器とやり取りするには、ルーター(町と町をつなぐ大きな道路の入り口)を経由する必要があります。
サブネットマスクによって、この「町の範囲」を明確にすることで、通信を直接送るべきか、ルーターを経由すべきかを判断できるようになるのです。
CIDR表記を具体例で理解する
CIDR表記=サブネットマスクの省略した書き方
CIDR(Classless Inter-Domain Routing)表記とは、IPアドレスの後ろに/24のような数字を付けて、サブネットマスクを簡潔に表す書き方のことです。
サブネットマスク255.255.255.0は、2進数にすると11111111.11111111.11111111.00000000となり、先頭から24個分が「1」になっています。
この「先頭から何個分が1か」という数字を使って、255.255.255.0を/24と省略して表すのがCIDR表記です。
つまり192.168.1.10/24と書かれていたら、「192.168.1.10というIPアドレスで、先頭24ビット(192.168.1の部分)までが同じ町(ネットワーク)を表す」という意味になります。
CIDRの数字と使える住所の数の関係
CIDRの数字(プレフィックス長)が大きいほど、「町の範囲」であるネットワーク部が広くなり、逆に「番地」であるホスト部として使える範囲が狭くなります。
代表的なCIDRと、実際に機器に割り当てられる住所(ホスト部)の数の目安は、次のとおりです。
| CIDR | サブネットマスク | 使える住所の目安 |
|---|---|---|
| /24 | 255.255.255.0 | 254台 |
| /25 | 255.255.255.128 | 126台 |
| /28 | 255.255.255.240 | 14台 |
| /30 | 255.255.255.252 | 2台 |
/24は、町の範囲が広く、たくさんの家(機器)を収容できる区切り方です。
/30は、町の範囲が非常に狭く、2台の機器だけがぴったり入る、ルーター同士の接続などに使われる区切り方です。
実際のネットワーク情報でサブネットマスクを確認する
自分のパソコンが、どのサブネットマスクで動いているかを確認してみましょう。
ifconfig en0
en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
inet 192.168.1.15 netmask 0xffffff00 broadcast 192.168.1.255
netmask 0xffffff00という部分が、16進数で表されたサブネットマスクです。
0xffは2進数の11111111(8ビットすべてが1)にあたるため、0xffffff00は先頭24ビットが1、つまり/24(255.255.255.0)だとわかります。
よくあるつまずきポイント・エラー対処
Dockerで複数の開発環境を立てたときにIPが衝突した話
私が実際につまずいたのが、Dockerで複数のプロジェクトの開発環境を同時に立ち上げたときのネットワークの衝突でした。
❌ Before
それぞれのプロジェクトで、深く考えずに192.168.1.0/24という同じ範囲のサブネットを指定してコンテナを起動していました。
docker network create --subnet 192.168.1.0/24 project-a-net
docker network create --subnet 192.168.1.0/24 project-b-net
2つ目のネットワークを作成しようとしたところ、範囲が重複しているというエラーが出て起動できませんでした。
Error response from daemon: Pool overlaps with other one on this address space
これは、同じ「町」を2つ作ろうとして、住所の区画が重なってしまった状態でした。
✅ After
それぞれのプロジェクトのネットワークに、重複しない別の範囲を割り当てるようにしました。
docker network create --subnet 192.168.10.0/24 project-a-net
docker network create --subnet 192.168.20.0/24 project-b-net
「同じ町(サブネット)を2つ作ることはできない」という当たり前のルールに気づいてから、複数の開発環境を並行して動かすときは、あらかじめサブネットの範囲を書き出して管理するようになりました。
応用・一歩先の使い方
CIDRを使ったネットワークの分割設計
CIDR表記の考え方を応用すると、1つの大きなネットワークを、目的に応じて複数の小さなネットワークに分割する「サブネッティング」ができます。
たとえば192.168.0.0/24という254台分の広い町を、192.168.0.0/26(62台分)と192.168.0.64/26(62台分)のように分割し、部署ごとやサーバーの用途ごとにネットワークを分ける設計がよく行われます。
こうした設計は、AWSのVPC(仮想ネットワーク)のサブネット設計などでも同じ考え方が使われているため、クラウドインフラを扱う際にも役立つ知識になります。
まとめ
この記事のポイント
- サブネットマスクとは、IPアドレスの「どこまでが同じ町(ネットワーク)か」を区切る境界線
- CIDR表記(
/24など)は、サブネットマスクを簡潔に表す書き方 - CIDRの数字が大きいほど、ネットワークの範囲は狭くなり、使える住所の数も少なくなる
ifconfigのnetmask表示から、現在のCIDR(サブネットマスク)を読み解ける
次に読むべき記事
住所(IPアドレス)の区切り方がわかったら、次は「1台の機器で複数の通信を扱う仕組み」を見ていきましょう。
「ポート番号とは?1台の機器で複数の通信を扱う仕組み」で、マンションの部屋番号にあたる仕組みを解説しています。