IT の基礎
ルーティング、NAT、ファイアウォール
パケットは、ルーティングテーブルで出口が決まり、NAT でアドレスを書き換えられ、ファイアウォールのルールで通すか止めるかが決まります。ルールは優先度の高い順に見て、最初に一致したもので決まります。
ネットワークの出入口では、パケット 1 つごとに 3 つの処理が走ります。ルーティングで次にどこへ送るかを決め、NAT で送信元や宛先のアドレスを書き換え、ファイアウォールで通すか止めるかを決めます。家庭のルーターは 1 台でこの 3 つを処理し、Google Cloud ではルート、Cloud NAT、VPC のファイアウォールルールという別々の設定になります。
ルーティングテーブルは宛先から出口を選ぶ
ルーター (ネットワークどうしをつなぐ機器) は、ルーティングテーブルという表を持っています。1 行が 1 つのルートで、「この範囲の宛先なら、この出口へ送る」と書いてあります。パケットが届くと、ルーターは宛先の IP アドレスを表と照らし合わせます。
宛先に一致するルートが複数あるときは、範囲がいちばん狭いルート (/ の後ろの数字が大きいもの) を選びます。これを最長一致と呼びます。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) が送信元をルーターの外側のアドレスに書き換えます。
社内の何台もの端末が 1 つの外側のアドレスを共有できるのは、NAT がポート番号も書き換えて、どの端末の通信かを見分けているからです。外から始まった通信は、書き換えた記録が無いので、どの端末に渡せばよいか決められずに捨てられます。社内のサーバーを外に公開するときは、外側のアドレスと社内のアドレスを 1 対 1 で対応させます。
ファイアウォールはルールを優先度の順に見る
ファイアウォールは、決めたルールに合うパケットだけを通す仕組みです。1 つのルールには、方向 (受信か送信か)、相手のアドレスの範囲、プロトコルとポート、許可か拒否か、優先度を書きます。ファイアウォールはルールを優先度の高い順に見て、最初に一致したルールで許可か拒否かを決め、残りのルールは見ません。
いまのファイアウォールの多くはステートフルです。許可した通信を覚えておき、その戻りのパケットは受信のルールに関係なく通します。社内から外の Web サイトを見るとき、受信を許可するルールを書かなくても応答が届くのはこのためです。
下のシミュレーターは、図と同じ社内ネットワークです。送信元、宛先、ポートを変えて、ルート、NAT、ルールの評価がどう進むかを見てください。外部から社内のサーバーの 22 番 (SSH) へ送ったあと、許可ルールを足して優先度を変えると、どのルールで決まるかが入れ替わります。
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 つのルールは表示されません。