IT の基礎

ルーティング、NAT、ファイアウォール

パケットは、ルーティングテーブルで出口が決まり、NAT でアドレスを書き換えられ、ファイアウォールのルールで通すか止めるかが決まります。ルールは優先度の高い順に見て、最初に一致したもので決まります。

ネットワークの出入口では、パケット 1 つごとに 3 つの処理が走ります。ルーティングで次にどこへ送るかを決め、NAT で送信元や宛先のアドレスを書き換え、ファイアウォールで通すか止めるかを決めます。家庭のルーターは 1 台でこの 3 つを処理し、Google Cloud ではルート、Cloud NAT、VPC のファイアウォールルールという別々の設定になります。

ルーティングテーブルは宛先から出口を選ぶ

ルーター (ネットワークどうしをつなぐ機器) は、ルーティングテーブルという表を持っています。1 行が 1 つのルートで、「この範囲の宛先なら、この出口へ送る」と書いてあります。パケットが届くと、ルーターは宛先の IP アドレスを表と照らし合わせます。

インターネット198.51.100.7 などルーター外側 203.0.113.1社内端末10.0.1.10サーバー10.0.2.200.0.0.0/010.0.1.0/2410.0.2.0/24デフォルトゲートウェイ
ルーターは宛先のアドレスで出口を選ぶ。10.0.1.0/24 は端末側、10.0.2.0/24 はサーバー側、どれにも当たらない宛先は 0.0.0.0/0 でインターネットへ出る

宛先に一致するルートが複数あるときは、範囲がいちばん狭いルート (/ の後ろの数字が大きいもの) を選びます。これを最長一致と呼びます。0.0.0.0/0 はすべてのアドレスに一致するので、ほかのどのルートにも当たらなかった宛先だけがここへ流れます。このルートをデフォルトルートと呼びます。

端末の側は、自分のネットワークの外へ送るパケットをすべて 1 台のルーターに渡します。この渡し先をデフォルトゲートウェイと呼び、端末の IP アドレスの設定に含まれています。

NAT は送信元を書き換え、戻りを元に戻す

10.0.0.0/8、172.16.0.0/12、192.168.0.0/16 はプライベートアドレスで、社内や家庭の中で自由に使える代わりに、インターネットには出せません。社内の端末がインターネットと通信するときは、出入口の NAT (Network Address Translation) が送信元をルーターの外側のアドレスに書き換えます。

社内インターネットNAT送信元 10.0.1.10宛先 198.51.100.80送信元 203.0.113.1宛先 198.51.100.80宛先 203.0.113.1送信元 198.51.100.80宛先 10.0.1.10送信元 198.51.100.80
行きで書き換えた対応を NAT が覚えておき、戻りの宛先を社内のアドレスに戻す。外から始まった通信には対応が無いので、社内には届かない

社内の何台もの端末が 1 つの外側のアドレスを共有できるのは、NAT がポート番号も書き換えて、どの端末の通信かを見分けているからです。外から始まった通信は、書き換えた記録が無いので、どの端末に渡せばよいか決められずに捨てられます。社内のサーバーを外に公開するときは、外側のアドレスと社内のアドレスを 1 対 1 で対応させます。

ファイアウォールはルールを優先度の順に見る

ファイアウォールは、決めたルールに合うパケットだけを通す仕組みです。1 つのルールには、方向 (受信か送信か)、相手のアドレスの範囲、プロトコルとポート、許可か拒否か、優先度を書きます。ファイアウォールはルールを優先度の高い順に見て、最初に一致したルールで許可か拒否かを決め、残りのルールは見ません。

いまのファイアウォールの多くはステートフルです。許可した通信を覚えておき、その戻りのパケットは受信のルールに関係なく通します。社内から外の Web サイトを見るとき、受信を許可するルールを書かなくても応答が届くのはこのためです。

下のシミュレーターは、図と同じ社内ネットワークです。送信元、宛先、ポートを変えて、ルート、NAT、ルールの評価がどう進むかを見てください。外部から社内のサーバーの 22 番 (SSH) へ送ったあと、許可ルールを足して優先度を変えると、どのルールで決まるかが入れ替わります。

試すパケットの通り道

送信元
宛先
宛先のポート
「外部のホストからの SSH を許可」するルールを足す

結果: 許可 (一致: 優先度 65535「暗黙: 送信はすべて許可」)

  1. 1. ルート宛先 198.51.100.80 は 0.0.0.0/0 に一致 → インターネット (デフォルトルート) へ
  2. 2. NAT送信元 10.0.1.10 → 203.0.113.1 (ルーターの外側のアドレスを借り、ポート番号で見分ける)

3. ファイアウォール (送信のルールを上から順に)

  1. 65535許可 暗黙: 送信はすべて許可 0.0.0.0/0 すべて一致
送信のルールは優先度 65535 の「暗黙: 送信はすべて許可」に一致して許可。送信元の 10.0.1.10 は社内用のアドレスでインターネットに出せないので、NAT が 203.0.113.1 に書き換えた。戻りのパケットは NAT とファイアウォールが通信を覚えているので、受信のルールを見ずに通る。

Google Cloud の VPC では

VPC ネットワークを作ると、サブネットごとのルートと、デフォルトのインターネットゲートウェイへ向かう 0.0.0.0/0 のルートが自動で入ります。VM にとってのデフォルトゲートウェイは、各サブネットのゲートウェイのアドレス (範囲の 2 番目のアドレス) です。

VPC のファイアウォールルールの優先度は 0 から 65535 の整数で、数字が小さいほど優先されます。指定しなければ 1000 です。同じ優先度の許可と拒否が両方一致したときは、拒否が勝ちます。どの VPC にも優先度 65535 の暗黙のルールが 2 つあり、受信はすべて拒否、送信はすべて許可です。つまり、受信は許可ルールを書いたものだけが通ります。

外部 IP アドレスを付けた VM は、外部 IP と内部 IP が 1 対 1 で対応します。外部 IP の無い VM がインターネットへ出るときは、Cloud NAT を使います。Cloud NAT は送信の変換だけを行うので、インターネットから VM への接続は開きません。設計の判断は VPC の設計 で扱います。

試してみる

Cloud Shell で、default ネットワークのルートとファイアウォールルールを一覧にします。default ネットワークがあるプロジェクトで実行してください。課金は発生しません。

gcloud compute routes list --filter="network=default"
gcloud compute firewall-rules list --filter="network=default" --sort-by=PRIORITY

ルートの一覧には、サブネットごとのルートと 0.0.0.0/0 のルートが並びます。ファイアウォールルールの一覧は優先度の順に並び、暗黙の 2 つのルールは表示されません。

理解度チェック

答えを開く前に、自分で考えてください。結果はこのブラウザにだけ残り、間違えた問題は復習のページでまとめて解き直せます。

思い出す

Google Cloud の VPC で、許可ルールを 1 つも書いていないポートに外から受信のパケットが届きました。このパケットはどうなりますか。理由も答えてください。

状況で選ぶ

社内の方針で、VM には外部 IP アドレスを付けられません。それでも VM からインターネットの更新サーバーへ接続してパッチを取得したく、インターネットから VM への接続は開きたくありません。どうしますか。

説明する

外部からの SSH (22 番) を拒否する優先度 1000 のルールがあります。管理者のアドレスからだけ SSH を許可したいとき、許可ルールの優先度をどう決めますか。理由も説明してください。