【AWSネットワークの基礎】削除できない「ローカルルート」の正体:パケットがVPC内を迷わず届く裏側の仕組み
こんにちは。数々の修羅場(深夜の障害対応とルートテーブル迷子)をくぐり抜けてきたシニアSREの私です。
Web APIの設計やインフラの構築に日々奔走している皆さん、AWSのVPC(Virtual Private Cloud)を構築する際、ルートテーブルを意識しない日はありませんよね。「パブリックサブネットにはインターネットゲートウェイ(IGW)への 0.0.0.0/0 を向けて……」「プライベートにはNATゲートウェイを……」と、お決まりのルーティングをTerraformやAWS CDKでサクッと書き上げていることでしょう。
しかし、ルーティングテーブルをマネジメントコンソールやCLIで覗いたとき、「あれ、この見慣れないルート、自分で書いた覚えがないぞ?」と思ったことはありませんか?
そう、送信先(Destination)に自身のVPC CIDRが鎮座し、ターゲット(Target)が local になっているあのエントリです。
今回は、この「ローカルルート(Local Route)」の自動生成と削除不可という仕様について、パケットの挙動や実務でのハマりどころを交えて徹底的に解説します。教科書には載っていない現場のノウハウを、しっかりとお伝えしていきましょう。
—
1. ローカルルートとは何か?:RFCとAWSの抽象化の魔法
まず、ネットワークの基本に立ち返りましょう。私たちが普段何気なく使っているIPネットワークは、IETFが定めるRFC(Request for Comments)、例えばIPv4の基本である RFC 791 やルーティングの基本仕様に基づいて設計されています。
通常、ルーターやL3スイッチで異なるサブネット間や同一セグメントの通信をルーティングする場合、ネットワークエンジニアは手動で、あるいはOSPFやBGPといったルーティングプロトコル(動的ルーティング)を用いて経路情報を教え込む必要があります。
しかし、AWSのVPCは「ソフトウェア定義のネットワーク(SDN)」です。ユーザーがVPCを作成した瞬間、AWSのコントロールプレーンは魔法のように裏側で何をやっているでしょうか?
ここで登場するのがローカルルートです。
自動生成と削除不可の鉄則
VPCを作成すると、システムは自動的にそのVPCのCIDRブロック(例:10.0.0.0/16)を送信先とし、ターゲットを local とするルートをルートテーブルに生成します。
このルートには、いくつかの絶対的な仕様があります。
1. 削除・変更が不可能:マネジメントコンソールやAWS CLI、Terraformからこのルートを削除しようとしても、APIレベルで拒絶されます。
2. すべてのカスタムルートテーブルに強制付与:VPC作成時に作られるメインルートテーブルだけでなく、後から自分で作成したカスタムルートテーブルにも、このローカルルートは自動的に内包(または暗黙的に適用)されます。
「なぜ削除できないのか?」
答えはシンプルです。これがなくなると、VPC内のEC2インスタンスやコンテナ(ECS/EKS)同士が、同じネットワーク内にいるにもかかわらずお互いの存在を見失い、通信不能(完全な孤立)に陥るからです。
—
2. パケットの旅:VPC内通信におけるローカルルートの挙動
では、この local という見慣れないターゲットを持つパケットは、AWSの巨大な物理・仮想ネットワークインフラの中でどのように処理されているのでしょうか。そのシーケンスを覗いてみましょう。
シナリオ:プライベートサブネット内のWeb APIサーバーからDBサーバーへのリクエスト
例えば、10.0.1.0/24 に配置されたWeb APIサーバー(Python製アプリ)から、同一VPC内の 10.0.2.0/24 にいるRDSやデータベースサーバーへAPI経由でデータを保存しに行く場面を想像してください。
ここで、アプリから発行されたコード(例:Pythonの requests ライブラリ)の挙動を見てみます。
import os
import requests
from requests.exceptions import RequestException
# 同一VPC内の別サブネットに配置された内部API/DBプロキシのエンドポイント
INTERNAL_DB_API_URL = "http://10.0.2.50:8080/v1/items"
def post_item_to_database(payload: dict):
try:
# パケットがOSのネットワークスタックからVPC仮想ネットワークへ送り出される
response = requests.post(INTERNAL_DB_API_URL, json=payload, timeout=3.0)
response.raise_for_status()
return response.json()
except RequestException as e:
# ネットワーク層やルーティングに異常がある場合、ここに落ちる
print(f"Failed to communicate with internal database API: {e}")
raise
このコードが実行されたとき、OSは宛先IPアドレス 10.0.2.50 が自身のNICのIP・サブネットマスクと照らし合わせ、直接届く範囲(同一セグメント)か、あるいはルーター(デフォルトゲートウェイ)へ投げるべきかを判断します。
AWSの仮想環境において、EC2インスタンスのカーネルは、AWSが提供する仮想ルーター(ハイパーバイザー層)をデフォルトゲートウェイとして認識しています。
1. パケット生成:Web APIサーバーから 10.0.2.50 宛てのパケットが送出される。
2. ルートテーブルのヒット:サブネットに関連付けられたルートテーブルが参照される。
- 送信先
10.0.2.50は、ルートテーブルにある10.0.0.0/16の範囲に完全に合致する。 - ターゲットは
localである。
3. AWSのハイパーバイザー(SDN)による処理:
- ターゲットが
localであるため、AWSのネットワークファブリックは「この通信はVPCの境界外(インターネットや他VPC、VPNなど)に出ていかない、VPC内(Intra-VPC)のトラフィックだ」と即座に判断します。 - 外部のインターネットゲートウェイ(IGW)や仮想プライベートゲートウェイ(VGW)を経由せず、AWSのハイパーバイザー間を直結する超高速なバックボーンネットワーク(SDNデータプレーン)を経由して、宛先のEC2インスタンスへダイレクトにパケットを配送します。
この仕組みがあるおかげで、VPC内のトラフィックは極めて低遅延(Low Latency)かつ高スループットで維持されています。
—
3. 実務で遭遇する「ローカルルートの罠」とトラブルシューティング
「ローカルルートが自動でやってくれるなら安心だね」と思ったそこのあなた。甘いですね。現場では、このローカルルートの仕様が原因で、何度インフラエンジニアを泣かせてきたか分かりません。
ここからは、実務でよくある「ハマりどころ」と、そのデバッグ手順を伝授します。
ハマりどころ1:VPC CIDRの重複・拡張時のルーティング衝突
初期設計時に 10.0.0.0/16 でVPCを切ったものの、サービス拡大に伴いIPアドレスが枯渇し、後から 10.1.0.0/16 などのセカンダリCIDRブロックを追加するケースがあります。
このとき、カスタムルートテーブルに特定のルートを追加する際や、AWS Transit Gateway(TGW)やVPCピアリングを設定する際に、ローカルルートの範囲(プライマリ+セカンダリ)と競合するようなカスタムルートを設定しようとしてエラーになることがあります。
トラブルシューティングTips:
- 症状:AWS CLIやTerraformでルートを追加しようとすると、「Route already exists」や「InvalidParameterValue: The route conflicts with an existing route」といったエラーが出る。
- 原因:VPCのCIDRに含まれるアドレス範囲を、あえて別のターゲット(例:TGWやVPN)に向けようとしている。AWSでは、ローカルルート(VPC CIDR)の優先度が常に最上位としてハードコードされているため、VPC CIDRに含まれる特定の細かいIPレンジ(例:
10.0.1.0/24)をlocal以外のターゲットに強制ルーティングすることはできません。 - 対策:VPCピアリングやTGWでルーティングを行う際は、相手側のVPC CIDRと自VPCのCIDRが重複していないか、またローカルルートの優先原則に反していないかをアーキテクチャ設計の段階で厳密にチェックすること。
ハマりどころ2:「あれ、外部APIと通信できない!」と思ったらローカルだった件
まれに、オンプレミスのレガシーなネットワーク設計を引きずったエンジニアが、「自社システムのIPレンジ(例:192.168.0.0/16)」をそのままAWSのVPC CIDRとして割り当て、のちにそのレンジ内にある外部のオンプレミスサーバーや閉域網APIへアクセスしようとしてハマるケースがあります。
[AWS VPC (CIDR: 192.168.0.0/16)]
──> 宛先が 192.168.100.50 なので「local」ルートがヒット!
──> 外部のオンプレミスへ出ていかず、VPC内の存在しないEC2を探してタイムアウト...
デバッグ手順(curlによる疎通確認と経路追跡)
もし「VPC内から特定のプライベートIPへ繋がらない」という事象が発生したら、まずは対象のIPがVPCのCIDR(ローカルルートの範囲)に含まれていないか確認します。その上で、以下の手順でデバッグを行います。
1. インスタンス内からのルーティングテーブル確認
# Linuxインスタンスのカーネルが持つルーティングテーブルを確認
ip route show
2. ネットワーク経路のシミュレーション(AWS Systems Managerを使う場合が安全)
AWSのマネジメントコンソールにある「VPC Reachability Analyzer(到達可能性アナライザー)」を使用するのが最も確実です。
- ソースに問題のEC2インスタンスを指定
- デスティネーションに接続先IPを指定
アナライザーは、ローカルルートの存在やセキュリティグループ、NACLの評価を含めて、パケットがどこでドロップしているかを一発で視覚化してくれます。
—
4. まとめ:インフラ自動化時代こそ「足元」の仕様を理解せよ
今回は、AWS VPCにおけるローカルルートの自動生成と削除不可の仕様について解説しました。
- ローカルルートはVPC CIDRに対して自動生成され、削除・変更はできない。
- その目的は、VPC内のトラフィックをAWSの超高速なSDNバックボーン経由でダイレクトにルーティングし、低遅延を担保するため。
- VPC CIDRの設計ミスやセカンダリCIDRの追加時には、ローカルルートとの競合に細心の注意を払う必要がある。
TerraformやAWS CDKといったIaC(Infrastructure as Code)の普及により、私たちは数行のコードでVPCという巨大な仮想ネットワークを瞬時に構築できるようになりました。しかし、その抽象化されたレイヤーの「下」で何が起きているのか、パケットがどのようにルーティングされているのかを深く理解しているかどうかが、プロのSREと、ただツールを使っているだけのエンジニアを分ける決定的な境界線となります。
次回のインフラ設計やトラブルシューティングの際には、ぜひこの「ローカルルート」の存在と挙動を思い出してください。皆さんのクラウドライフが、迷子のパケットのない快適なものになることを願っています!
コメント