はじめに
こんにちは!ITスクールRareTECHにてCS(Customer Support)を担当している池村です。今回の記事はIPアドレスでの通信についてです。IPアドレスとNAT/NAPTに関して理解していきましょう。
初心者のIPアドレスの理解レベルについて
よく言われているのはネットワーク上の住所ですよね。
正直初心者の頃はこれだけ知っておけば良いのですが、AWSのVPCなどを触っていくと、この辺りの技術がひょこっと顔を出してきますので、深めに理解することも大事になります。
グローバルIPとプライベートIPについて
IPアドレスは大きく分けてグローバルIPアドレスとプライベートIPアドレスがあります。
グローバルは実際のネットワーク空間で使われるものですが、プライベートは社内とか家の中などで使われるIPアドレスになります。
自宅のIPアドレスがどう切り分けられているか?
家には一つのグローバルIPアドレスがあります。そして、その家のネットワークにつながる機器には、それぞれプライベートIPアドレスがあります。
グローバルIPアドレスは一意です。被りがないということです。プライベートIPアドレスは、家の中では被りがないですが、よその家では同じプライベートIPアドレスがあっても問題ありません。
機器 | 自分の家 | 友人の家 |
---|---|---|
グローバルIP(ルーター) | 203.0.113.228(一意) | 198.51.100.203(一意) |
スマホのIP(プライベート) | 192.168.0.100(LAN内で一意) | 192.168.0.100(LAN内で一意) |
PCのIP(プライベート) | 192.168.0.101 | 192.168.0.101 |
ゲーム機のIP(プライベート) | 192.168.0.102 | 192.168.0.102 |
上記の表で見てほしいのは、グローバルIPアドレスは違う値で、プライベートIPアドレスは一緒という部分です。
LANとWAN
広域のネットワークと家の中などの狭い範囲のネットワークには名前があります。
LAN
ローカルエリアネットワークの略です。
会社内や家の中で使われるネットワークのことを指します。その中の機器を接続するために使われています。
WAN
ワイドエリアネットワークの略です。
世界規模の外部ネットワークのことを指します。
通信がどう送られくるか?
外から通信が送られてくると、家のグローバルIPアドレス宛に届きます。送られた通信は家のルーターが受け取ります。ルーターは、その通信が「どのプライベートIPの機器宛か」を判断して、内部ネットワークに転送します。
このときに使われるのが NAT/NAPT という仕組みです。
ちょっとここから難し目です。
NAT/NAPT
最初に言っておきますが、今使われているのは基本的にNAPTです。
でもNATのことも知っておかないとNAPTがピンとこないので解説します。
NAT
まずNATですが、これはネットワーク アドレス トランスレーションの略です。
こいつの役割は、プライベートIPアドレスとグローバルIPアドレスを相互に変換することにあります。この機能があることによって、LAN内にあるプライベートIPアドレスを持った機器が外部のネットワークと通信ができています。
でもこれって1対1しか対応していないんですよね。
なので、複数の機器が同時に外部のネットワークと接続したい場合は、これだけだと不十分になります。
NAPT
NAPTは、ネットワーク アドレス ポート トランスレーションの略です。
この技術を使うと、複数機器が同時に外部との通信が可能になります。
皆さんの家でも複数のスマホやゲームが同時にネットワークに繋げられていますよね?これはNAPTのおかげです。
これはNATの技術にポートを使うことで可能にしています。
ポートは通信の出入り口のようなものです。
全ての通信にはポート番号というものが振られているので、どの通信がどういった通信かわかるようになっています。
IPアドレスがネットワーク上の住所なら、ポート番号は部屋番号に例えられることが多いですね。
NAPTの場合はどう言ったポートの使い方をしているのか?
プライベートIPアドレスから外部に通信を行う際、以下のようにポートが割り当てられます。
プライベート→グローバル
# 192.168.0.2がプライベートIPアドレス、55001がポート番号です
192.168.0.2:55001(家の中にあるスマホから)
⬇︎
# 203.0.113.10がグローバルIPアドレス、50001がポート番号です
203.0.113.10:50001(ルーターがポートごと変換)
このポート番号の数字に意味があるわけではありません。
今回の場合、スマホから送られた際のポート番号がルーターで変更されていることに着目しましょう。
この変更は、外部と通信するため、必ず一意にするためには必須です。
例えば
同時に同じポート番号で、違うプライベートIPから通信がきた場合①
# 家の各機器側
192.168.0.2:55001(家の中にあるスマホから)
192.168.0.3:55001(家の中にあるPCから)
⬇︎
# ルーター側
203.0.113.10:50001(こっちはスマホ)
203.0.113.10:50002(こっちはPC)
こうやって外部に通信を繋げます。
ルーターにはポート番号を一意に変更する機能が備わっています。
例えば以下のような形にはならないということです。
同時に同じポート番号で、違うプライベートIPから通信がきた場合②
# 家の各機器側
192.168.0.2:55001(家の中にあるスマホから)
192.168.0.3:55001(家の中にあるPCから)
⬇︎
# ルーター側
203.0.113.10:55001
203.0.113.10:55001
これでは外からレスポンスが返ってきた時、どっちの機器に返せば良いのかわからなくなります。なので、ルーターにはポートを変更する機能と、絶対に被らないポートを割り振る機能が備わっています。
さて、この機能に付随して、こういった振り分けがどう記録されているかも解説します。
これらの情報はルーターにあるNATテーブルという場所に記録がされています。
NATテーブル
NATテーブルはプライベートIPアドレスからの通信を記録する機能です。
同時に同じポート番号で、違うプライベートIPから通信がきた場合③
# 家の各機器側
192.168.0.2:55001(家の中にあるスマホから)
192.168.0.3:55001(家の中にあるPCから)
⬇︎
# ルーター側
203.0.113.10:50001(変換して外に出すけど、これは192.168.0.2:55001からの通信だな)
203.0.113.10:50002(変換して外に出すけど、これは192.168.0.3:55001からの通信だな)
NATテーブルに記録されるのは以下の情報です。(今回の場合)
-
送信元プライベートIPアドレス
→今回の場合:192.168.0.2と192.168.0.3 -
送信元ポート番号
→今回の場合:55001と55001 -
宛先IPアドレス(どこに通信を届けたいか)
-
宛先ポート番号(宛先のポート番号、HTTPS通信なら443)
-
変換後グローバルIPアドレス
→今回の場合:203.0.113.10 -
変換後ポート番号
→今回の場合:50001と50002 -
プロトコル(大体TCP/UDPのどちらかで判断)
-
状態/タイマー(Connection State/Timeout)
これらの情報がルーターのメモリにそれぞれの対応通りに保存されています。
ここで使われるポート番号について
ポート番号にはいくつか分類があります。
ウェルノウンポート
これはすでに使う先が決まっているポート番号です。主にサーバーが使うポート番号です。
番号でいうと以下の範囲です。
ウェルノウンポートの範囲
よく出てくるのはHTTPの80番、HTTPSの443、SSHの22番などですね。
これらは基本的に変えることは非推奨です。
レジスタードポート(ユーザーポートとも呼ばれる)
こちらは様々なシステムで使われているポート番号ですね。主にエンジニアなどの開発者が使うポート番号です。
基本的に番号を変えて使うこともありえるポートの範囲です。
レジスタードポートの範囲
MySQLなら3306、PostgreSQLなら5432のような感じです。
FlaskというPythonのフレームワークのポート番号は標準で5000なのですが、最近のMacではAirPlayで5000を使っているので、こう言ったところで競合がおきたりします。別に予約されたポート番号というわけではないので当然の現象ですね。
エフェメラルポート
上記二つとは違って、このポート番号はクライアント側が使うポート番号です。
ですが、基本的に一般ユーザーが意識することはないです。
エフェメラルポートの範囲
クライアント意外だとルーターのNATテーブルが使っているポート番号です。
通信をする際に一瞬使って、すぐ破棄されます。
IPアドレスと関係しているその他の技術
MACアドレス
MACアドレスは個人番号のようなもので、物理的なデータを受け取るために必要な機器の識別子です。IPアドレスは論理的なアドレスと呼ばれます。それぞれの機器に物理的に刻まれている番号なので、動的に変わってしまうIPアドレスとはまた違う要素ですね。IPアドレスは外との通信でしっかり使われますが、MACアドレスはLAN内限定で使われています。
一番わかりやすい説明だと、家のWifiで繋いている時のIPアドレスと、外でWifiに繋いだ時のIPアドレスは違いますよね?IPアドレスは動的に変わるので、最終的にどこにデータを渡すかはMACアドレスによって識別されます。
歴史的な話になると、そもそも世界中にネットワークが広がる前は、研究所などにあるコンピューター同士を識別する必要があったわけで、誕生自体が先なんですよね。
ARPについて
ARPは、プライベートIPアドレスからMACアドレスを探し当てるためのプロトコルです。
- ルーターが、LAN内の 192.168.10.5 に通信を送りたい
- そのIPに対応するMACアドレスが分からなければ、ARPで全端末に確認
- 192.168.10.5の機器だけが、それに反応してMACアドレスを返す
- ルーターはそのMAC宛に通信を送る
です。
最終的に物理的なデータを届けるためにMACアドレスが必要になってくるので、ARPを使って宛先の個人番号を知る必要があります。
おわりに
久しぶりに記事を書きました。
5~6月はお休みする予定でしたが、ちょっと書かないといけないくらいネットワークのこと忘れてきている、、と感じたので書きました。
IPアドレス周りは表記あたりやドメイン周りの話もあるので、続きも書いていきます。
Views: 0