四十台の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:41574 | 198.51.100.7:443 |
| ゲートウェイを出る | 203.0.113.1:50001 | 198.51.100.7:443 |
| 返事がゲートウェイに着く | 198.51.100.7:443 | 203.0.113.1:50001 |
| 返事がPCに着く | 198.51.100.7:443 | 10.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 を実行しましょう。
各行について、内側の送信元ポートと、逆向きの組で返事が送られるポートを書き出します。そして、返事を正しい場所へ送るために、ゲートウェイが行のどの部分を使うかを説明しましょう。