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

無料レッスン

一つのグローバルIPを共有する(NAT)

このレッスンのあとで: 内側のホストがNATでインターネットへ出る仕組みを説明できる。

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

四十台のPCと一つのアドレス

会社には四十台のノートPCがありますが、通信会社からもらったグローバルアドレスは一つだけです。四十台が同時にウェブを見ています。

ウェブサーバーから見えるのは、一つのアドレスだけです。それでも、返事はちゃんと正しいPCに届きます。

間にいるルーターが、誰が何を頼んだかを表に覚えています。今日はその表を開きます。

このレッスンのゴール

メモ

内側のホストがNATでインターネットへ出る仕組みを説明できる。

重要な言葉

ことばいみれい
プライベートアドレスインターネットでは経路が無いアドレス10.0.0.2
ゲートウェイ内側のネットワークと外側をつなぐルーター
NATパケットの中のアドレスを書き換える仕組み
マスカレードゲートウェイ自身の外側のアドレスを使うNAT
変換表どの接続がどの内側のホストのものか、ゲートウェイが覚えておく表
ポート転送外からの特定のポートへの要求を、内側のホストへ回す決まり

学生が入力するセルは、このプレビューでは空白です。

プライベートアドレスには返せない

私的に使ってよいアドレスの塊が、三つ決まっています。どの家や会社も同じものを使い回し、インターネットのルーターは、それらへの経路を持ちません。

プライベートアドレスからの要求は、サーバーに届きます。でも返事には、帰り道がありません。

例: プライベートの三つの塊

塊アドレス数よく使われる場所
10.0.0.0/8約1,600万大きな組織
172.16.0.0/12約100万中くらいの網
192.168.0.0/16約6万5千家や小さな事務所

学生が入力するセルは、このプレビューでは空白です。

三台の機械を見る

コマンド
netlab status

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

外のサーバーの経路を聞く

コマンド
sudo ip netns exec srv ip route

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

返事の来ない要求を出す

コマンド
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/

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

片方だけ返事が来ない理由

外のサーバーが持つ経路は、自分のケーブルの分だけです。10.0.0.0/24 への経路は無く、10.0.0.2 への返事は行き場がありません。

lan からのcurlは3秒待って、Connection timed out と出します。要求は出ていきましたが、何も帰ってきません。

gw からのcurlには、すぐに outside-server: you are 203.0.113.1 と返事が来ます。このアドレスはサーバー自身のケーブル上にあるので、返事が届きます。

マスカレードは送信元を書き換える

出ていくとき、ゲートウェイは、プライベートの送信元アドレスを自分の外側のアドレスに替えます。送信元ポートは、他の接続が使っていなければそのまま残し、ぶつかるときだけ空いているものに替えます。下の表は替えた例です。

この入れ替えは、変換表に書き込みます。返事が戻ったら、ポートで表を引き、アドレスを元に戻します。

例: 要求とその返事

段階送信元宛先
PCを出る10.0.0.2:41574198.51.100.7:443
ゲートウェイを出る203.0.113.1:50001198.51.100.7:443
返事がゲートウェイに着く198.51.100.7:443203.0.113.1:50001
返事がPCに着く198.51.100.7:44310.0.0.2:41574

学生が入力するセルは、このプレビューでは空白です。

ゲートウェイの記憶を読む

コマンド
sudo ip netns exec gw conntrack -L

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

ゲートウェイが覚えていること

1行が一つの接続です。最初のアドレスの組の後に、同じアドレスを逆にした組が続きます。これは、ゲートウェイが待っている返事の形です。

lan からの要求には SYN_SENT と [UNREPLIED] が付きます。追跡はしていますが、返事は来ていません。gw 自身の要求には TIME_WAIT と [ASSURED] が付きます。返事が来て、閉じた接続です。

行は約2分で消え、その後は 0 flow entries と出ます。この追跡があるから、返事を要求に結び付けられます。

ポート転送は外からの入口

マスカレードは、内側から始まる要求のためのものです。内側にあるウェブページへ、外から来るにはどうするのでしょう。

ポート転送は「ゲートウェイの外側のアドレスの8080番への要求は、内側の一台の80番へ」と決めます。

ゲートウェイは宛先を書き換え、返事は表が連れ戻します。

例: 二つの転送

外から来る要求ゲートウェイが送る先用途
ゲートウェイのアドレス、8080番10.0.0.2の80番店のウェブページ
ゲートウェイのアドレス、2222番10.0.0.9の22番一台のサーバーへの遠隔ログイン
ゲートウェイのアドレス、9999番どこにも送らない決まりが無いので捨てる

学生が入力するセルは、このプレビューでは空白です。

ゲートウェイのルールを読む

コマンド
sudo ip netns exec gw nft list ruleset

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

よくある間違い

注意

「NATは安全のための仕組み」と思う人が多いです。NATはアドレスを書き換えるだけで、通してよいかを決めるのはファイアウォールのルールです。上の出力では、ポリシーがdropのforwardチェーンが、外を締め出しています。

発展: いっぱいの表を読む

ラボでマスカレードのルールが動いたら、lan からcurlを3回走らせます。続けて、gw で conntrack -L を実行しましょう。

各行について、内側の送信元ポートと、逆向きの組で返事が送られるポートを書き出します。そして、返事を正しい場所へ送るために、ゲートウェイが行のどの部分を使うかを説明しましょう。

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

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