家族六人と一つのアドレス
家族の六人がそれぞれスマホを持ち、リビングにはゲーム機とテレビもあります。全部が同時にネットにつながっています。
それなのに、インターネットから見えるのは、家全体で一つのアドレスだけです。それでも動画は、ちゃんと見ている人の画面に届きます。
家のルーターが、パケットごとにうまく中身を差し替えているのです。今日はその仕組みを見ます。
このレッスンのゴール
メモ
たくさんの機器が一つのアドレスを共有する仕組みを説明できる。
重要な言葉
| ことば | いみ | れい |
|---|---|---|
| グローバルアドレス | インターネットで使われるアドレス | |
| ゲートウェイ | 内側のネットワークとインターネットの間にあるルーター | |
| NAT | パケットの中のアドレスを差し替える仕組み | |
| 送信元ポート | パケットがどの接続のものかを示す番号 | 50001 |
| NATテーブル | どの接続がどの機器のものかを、ゲートウェイが覚えておく表 | |
| ポート転送 | 外の一つのポートを、内側の一台に回す決まり |
学生が入力するセルは、このプレビューでは空白です。
プライベートアドレスには返事が届かない
家の機器はプライベートアドレスを使います。インターネットのルーターは、そこへの経路を持っていません。
だから 192.168.1.20 からの頼みはサーバーまで届きますが、サーバーの返事には行き場がありません。返事は途中で消えてしまいます。
三台の機械を見る
netlab statusここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
内側から外のサーバーに頼む
sudo ip netns exec lan curl --noproxy '*' -sS -m 3 http://203.0.113.2:8000/ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
ゲートウェイから同じサーバーに頼む
sudo ip netns exec gw curl --noproxy '*' -sS -m 3 http://203.0.113.2:8000/ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
返事が来た頼みと来ない頼み
status を見ると、gw には内側の 10.0.0.1 と外側の 203.0.113.1 の二つのアドレスがあります。内側の機械 lan は 10.0.0.2 です。
lan からの curl は三秒待ってから Connection timed out と出します。サーバーには 10.0.0.2 への帰り道が無いからです。
gw からは、すぐに outside-server: you are 203.0.113.1 と返ってきます。
ゲートウェイが送り主を差し替える
NATを使うと、ゲートウェイは出ていくパケットを書き換えます。プライベートアドレスの代わりに、自分のグローバルアドレスを入れるのです。
送信元ポートは、空いていればそのまま使います。二台がぶつかったときは、別の番号を選びます。この差し替えを NATテーブル に書いておきます。
返事が戻ってくると、ゲートウェイはポートで表を引き、アドレスを元に戻します。
例:二台のスマホと一つのアドレス
| 機器 | スマホを出るとき | ゲートウェイを出るとき |
|---|---|---|
| 姉のスマホ | 192.168.1.20 ポート 40000 | 198.51.100.5 ポート 40000 |
| 弟のスマホ | 192.168.1.21 ポート 40000 | 198.51.100.5 ポート 40001 |
| ゲーム機 | 192.168.1.30 ポート 52000 | 198.51.100.5 ポート 52000 |
学生が入力するセルは、このプレビューでは空白です。
ゲートウェイの記憶を読む
sudo ip netns exec gw conntrack -Lここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
ゲートウェイは接続を一つずつ覚える
一行が、ゲートウェイの見た一つの接続です。lan からの頼みには SYN_SENT と [UNREPLIED] が付いていて、返事が来なかったことが分かります。
ゲートウェイ自身の頼みには TIME_WAIT と [ASSURED] が付き、返事が来て閉じたことを表します。
一行はおよそ二分残ります。NATは、この記憶を使って返事を正しい機器に届けます。
ポート転送で一つだけ通す
NATがうまく働くのは、内側から始まった接続です。外から始まった頼みは表のどの行にも合わないので、捨てられます。
家でゲームのサーバーを立てたいときは、ポート転送 を足します。たとえば外のポート 25565 を、一台のゲーム機に回す決まりです。
そもそも何を中に入れてよいかは、ゲートウェイのファイアウォールのルールが決めます。
ゲートウェイのルールを読む
sudo ip netns exec gw nft list rulesetここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
よくある間違い
注意
NATが知らない人を締め出している、と思いがちです。NATがするのはアドレスの差し替えだけで、何を通すかはファイアウォールのルールが決めます。このルールでは、forward チェーンの policy drop が外からの通信を止めています。
さらに挑戦:いっぱいになる表
ポート番号は1から65535までです。あるゲートウェイが、50000 から 50009 までの番号しか貸さないとします。
同時にいくつの接続を持てるでしょうか。自分の next_free_port で表を埋めていき、"満杯" が返るまで試しましょう。混み合った家では、何が起きるでしょうか。