クリーム色の背景、色付き表示、高コントラスト、大きな文字のほうが読みやすいですか?配色と文字を選ぶと、すべてのページに一度で反映されます。

無料レッスン

たくさんの機器で一つのアドレスを使う(NAT)

このレッスンのあとで: たくさんの機器が一つのアドレスを共有する仕組みを説明できる。

50分のレッスンコマンド5件NAT ゲートウェイのラボ:nftables でマスカレードとポート転送をブラウザーで学ぶ

家族六人と一つのアドレス

家族の六人がそれぞれスマホを持ち、リビングにはゲーム機とテレビもあります。全部が同時にネットにつながっています。

それなのに、インターネットから見えるのは、家全体で一つのアドレスだけです。それでも動画は、ちゃんと見ている人の画面に届きます。

家のルーターが、パケットごとにうまく中身を差し替えているのです。今日はその仕組みを見ます。

このレッスンのゴール

メモ

たくさんの機器が一つのアドレスを共有する仕組みを説明できる。

重要な言葉

ことばいみれい
グローバルアドレスインターネットで使われるアドレス
ゲートウェイ内側のネットワークとインターネットの間にあるルーター
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 ポート 40000198.51.100.5 ポート 40000
弟のスマホ192.168.1.21 ポート 40000198.51.100.5 ポート 40001
ゲーム機192.168.1.30 ポート 52000198.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 で表を埋めていき、"満杯" が返るまで試しましょう。混み合った家では、何が起きるでしょうか。

このラボとソースについて: NAT ゲートウェイのラボ:nftables でマスカレードとポート転送をブラウザーで学ぶ

授業で使いますか?このモジュールを学生に割り当てると、教員用ガイド、自動採点つきの課題、学生ごとのラボを使えます。