ネットワーク●○○○○

IPアドレス

IP Address ・ あいぴーあどれす

通信の宛先と差出人を表す番号。前半でネットワークを、後半でその中の機器を指す。

✦ 30秒で試す — 航海同じ番号の住所でも、どこで区切るかで「ご近所」が変わる機器に割り当てられる番号は、いくつ?予想してみる

概要

IPアドレスは、ネットワークにつながる機器一つひとつに割り当てられる番号で、通信の「宛先」と「差出人」を表します。手紙でいえば住所にあたるもので、Webページの閲覧もメールの送信も、あらゆる通信は「どのIPアドレスからどのIPアドレスへデータを送るか」を決めるところから始まります。

普段私たちは「example.com」のような名前でサイトにアクセスしますが、これはDNSが裏で名前をIPアドレスに変換してくれているからです。ネットワークの世界で実際に相手を特定しているのは、常にIPアドレスのほうです。開発の現場でも「サーバのIPを固定する」「このIPからのアクセスだけ許可する」のように、機器やアクセス元を指し示す基本の語彙として毎日のように登場します。

なぜ生まれたか

コンピュータネットワークが生まれたばかりの頃、機器の識別方法はネットワークごとにばらばらでした。ある組織のネットワークと別の組織のネットワークをつなごうとしても、「相手をどう名指しするか」の共通ルールがなければ、データをどこへ運べばよいのか決められません。異なる規格のネットワーク同士を相互接続する——つまり「インターネット(inter-network)」を作る——ためには、どのネットワークにいても通用する、世界共通の住所体系が必要でした。

そこでTCP/IPの設計の中で、物理的なネットワークの種類に依存しない論理的な識別子としてIP(Internet Protocol)アドレスが定義されました(現在の IPv4 は1981年の RFC 791)。各ネットワークの内部事情がどうであれ、IPアドレスさえ分かれば経路上の機器がバケツリレー式にデータを運べる。この抽象化こそが、世界中のネットワークを一つにつないだ土台です。

このときの工夫が、アドレスを「どのネットワークか」と「その中のどの機器か」の二段構えにしたことです。世界中の機器の居場所を1台ずつ覚えるのは不可能でも、ネットワーク単位なら覚えられます。当初はこの区切りを先頭の数ビットで決まる「クラス」(A・B・Cの3種類)で固定していましたが、中規模の組織には C(254台)では小さすぎ B(6万5千台)では大きすぎるという無駄が生まれ、アドレスの消費と経路表の肥大が問題になりました。そこで1993年に、区切りの位置を1ビット単位で自由に決められる CIDR(Classless Inter-Domain Routing)が導入され、今日の「/24」のような書き方が生まれました。

詳細

IPv4とIPv6

現在広く使われているIPv4アドレスは32ビットの数値で、人間が読みやすいように「192.0.2.1」のような4つの数字(各0〜255)で表記します。4つの数字はそれぞれ8ビット(オクテット)を2進数から10進数に直したもので、機械の側ではあくまで32個の0と1の並びとして扱われます。32ビットで表せるのは約43億通りですが、インターネットの爆発的な普及によりこの数では足りなくなり、2011年前後から「IPv4アドレスの枯渇」が現実になりました。

その根本対策として設計されたのがIPv6です。128ビットに拡張され、「2001:db8::1」のような16進数表記を使います。理論上は事実上無限といえる数のアドレスを割り当てられますが、既存のIPv4網との互換性がないため移行は一朝一夕には進まず、現在も両者が併用されています。

グローバルアドレスとプライベートアドレス、NAT

IPv4の枯渇をしのぐ実務上の工夫が、アドレスの二層構造です。インターネット上で一意な「グローバルIPアドレス」に対し、家庭や社内のLANでは「192.168.x.x」「10.x.x.x」などの「プライベートIPアドレス」を自由に使い、外に出るときだけルータがNAT(Network Address Translation、アドレス変換)で1つのグローバルアドレスに束ねます。自宅の複数台の機器が1つの回線契約でインターネットを使えるのはこの仕組みのおかげです。

プライベートネットワークからインターネット上のサーバへ届くまでの経路は、次のような構図になります。

家庭内LANプライベートIPアドレスインターネットグローバルIPアドレス自宅PC192.168.1.10スマホ192.168.1.11ルータNATで送信元をグローバルIPに書き換え経路上のルータ群バケツリレーで中継宛先サーバ203.0.113.5点線: 応答はルータが変換の記録をもとに元の機器へ振り分けて返す
NATによる二層構造。LAN内はプライベートIP、外に出るときだけルータがグローバルIPに束ねる

ネットワーク部とホスト部、CIDR

IPアドレスは前半が「どのネットワークか」、後半が「そのネットワークの中のどの機器か」を表す二段構えになっています。境目の位置は「192.168.10.0/24」のようにCIDR表記で示し、スラッシュの後ろの数(プレフィックス長)が前半、つまりネットワーク部のビット数です。同じことを、ネットワーク部を1、ホスト部を0で並べた32ビットの「サブネットマスク」(/24 なら 255.255.255.0)で表すこともあります。経路上のルータは全機器の場所を知っているわけではなく、ネットワーク部だけを見て「この範囲宛てはあちらへ」と大まかに転送します。これがルーティングです。クラウドでVPCのサブネットを切るときに出てくる「/24」「/16」はまさにこの話です。

1つのネットワークに含まれるアドレスは、ホスト部のビット数で決まります。/24 ならホスト部は8ビットで256個、/26 なら6ビットで64個です。ただし、ホスト部が全部0のアドレス(先頭)はネットワークそのものを指す「ネットワークアドレス」、全部1のアドレス(末尾)はそのネットワークの全員宛ての「ブロードキャストアドレス」に予約されているので、機器に割り当てられるのは2個少ない数になります。/24 で機器に使えるのが 254 台なのはこのためです。

プレフィックス長がいちばん効いてくるのは、機器が送信するときの最初の判断です。送り手は、自分のアドレスと宛先のアドレスをサブネットマスクで切り取り、ネットワーク部が一致するかを比べます。一致すれば相手は同じネットワークにいるので、ARPで相手のMACアドレスを調べて直接フレームを送ります。一致しなければ、相手は別のネットワークにいるので、デフォルトゲートウェイ(ルータ)に託します。つまりプレフィックス長は「どこまでが直接届く仲間か」を決める線引きです。この線がずれると、同じ部屋の機器なのに届かない、あるいは別のネットワーク宛てのパケットをルータに渡さずに迷わせる、といった設定ミスになります。

下の部品で、この境界を動かしてみてください。金の縦線をドラッグしてプレフィックス長を伸ばすと、192.168.10.0〜255 の格子がサブネットのブロックに割れていき、2台のホストが同じブロックにいるか、ルータを経由しなければならないかが変わります。

⚡ 体験: 境界線を動かして、同じネットワークの範囲を決める
ホスト A 192.168.10.2011000000101010000000101000010100ホスト B 192.168.10.14011000000101010000000101010001100サブネットマスク(/24)11111111111111111111111100000000AB← ネットワーク部 24 ビットホスト部 8 →⇔192.168.10.0〜2551マス=1アドレス.0.32.64.96.128.160.192.224ルータ使われないAB
ネットワーク部ホスト部境界より左で食い違うビットホストに使えないアドレス(先頭・末尾)
A のネットワーク192.168.10.0/24B のネットワーク192.168.10.0/241ブロックのアドレス数256A → B直接届く

金の縦線(ネットワーク部とホスト部の境界)を右へドラッグして、プレフィックス長を /25、/26…と伸ばしてみてください。下の格子(192.168.10.0〜255)がブロックに割れ、A から B への道が変わります。A・B も格子の上でドラッグできます。

実務での使いどころと落とし穴

サーバ運用では、IPアドレスは固定的に割り当てる場合と、DHCPという仕組みで起動時に自動割り当てする場合があります。クラウドではサーバ(インスタンス)を停止・起動するとIPが変わることがあるため、公開サービスには固定のIPやDNS名を紐付けるのが定石です。サブネットを切るときは、あとから機器が増えても足りるように余裕を持たせます。クラウドのサブネットは、ネットワークアドレス・ブロードキャストアドレスに加えて、事業者がゲートウェイや DNS 用に先頭のいくつかを予約するので、使える数はさらに少なくなります。

落とし穴としてよくあるのは、IPアドレスを「1ユーザ=1アドレス」と思い込むことです。NATの下では多数のユーザが同じグローバルIPを共有しますし、逆に1人が移動やスマホの回線切替でIPを頻繁に変えることもあります。そのため「IPアドレスでユーザを識別する」設計(アクセス制限やレート制限など)は、便利ですが精度に限界があることを前提に使う必要があります。また、IPアドレスは宛先の特定までしかしません。同じ機器の中のどのアプリケーションに届けるかはポート番号の仕事で、この2つが揃って初めて通信の宛先が完成します。

試問

上に2台のホスト A(192.168.10.20)・B(192.168.10.140)の32ビットとサブネットマスクが並び、金の縦線(ネットワーク部とホスト部の境界)を左右にドラッグできます。下の格子は 192.168.10.0〜255 の256アドレスで、境界を伸ばすとブロック(ネットワーク)に割れていきます。A・B は格子の上でドラッグして置き直せます。

✦ 命題挑戦中

境界を /27 以上へ伸ばしたうえで、ホスト A と B を同じネットワークに入れ、ルータを通らずに届くようにせよ

  • 境界を /27 以上へ伸ばす(1ブロック 32 アドレス以下)
  • そのうえで A と B が同じネットワーク(ルータを通らず直接届く)
⚡ 体験: 小さなネットワークに、2台をそろえて入れる
ホスト A 192.168.10.2011000000101010000000101000010100ホスト B 192.168.10.14011000000101010000000101010001100サブネットマスク(/24)11111111111111111111111100000000AB← ネットワーク部 24 ビットホスト部 8 →⇔192.168.10.0〜2551マス=1アドレス.0.32.64.96.128.160.192.224ルータ使われないAB
ネットワーク部ホスト部境界より左で食い違うビットホストに使えないアドレス(先頭・末尾)
A のネットワーク192.168.10.0/24B のネットワーク192.168.10.0/241ブロックのアドレス数256A → B直接届く

金の縦線(ネットワーク部とホスト部の境界)を右へドラッグして、プレフィックス長を /25、/26…と伸ばしてみてください。下の格子(192.168.10.0〜255)がブロックに割れ、A から B への道が変わります。A・B も格子の上でドラッグできます。