こんにちは、こえじまです。
AWSでEC2をデプロイする上で欠かせないVPCルーター。
なのにVPCルーターって詳しく説明されている記事とかあんまりないんですよね・・・。
AWSで色々試験をして、VPCルーターがどういう仕様なのかをやっと理解出来たので解説します。
ルーターというよりかは全EC2に接続されているL3スイッチのほうがイメージに合っています。
VPCルーターって?
VPCルーターについてはAWSドキュメント内で詳しく書かれていません。
ルートテーブルの章には以下の通り記述があります。
VPC には暗黙的なルーターがあり、ルートテーブルを使用してネットワークトラフィックの送信先を制御します。
ルートテーブル – Amazon Virtual Private Cloud
また、サブネットの章には以下の通り記述があり、各サブネットにおけるネットワークアドレスを除いた最初のアドレスがVPCルーター用に予約されていることが分かります。
各サブネット CIDR ブロックの最初の 4 つの IP アドレスと最後の IP アドレスは使用できず、インスタンスに割り当てることができません。たとえば、CIDR ブロック 10.0.0.0/24 を持つサブネットの場合、次の 5 つの IP アドレスが予約されます。
VPC とサブネット – Amazon Virtual Private Cloud
・10.0.0.0: ネットワークアドレスです。
・10.0.0.1: VPC ルーター用に AWS で予約されています。
・10.0.0.2: AWS で予約されています。DNS サーバーの IP アドレスは、VPC ネットワーク範囲のベースにプラス 2 したものです。複数の CIDR ブロックを持つ VPC の場合、DNS サーバーの IP アドレスはプライマリ CIDR にあります。また、VPC 内のすべての CIDR ブロックに対して、各サブネットの範囲 + 2 のベースを予約します。詳細については、「Amazon DNS サーバー」を参照してください。
・10.0.0.3: 将来の利用のために AWS で予約されています。
・10.0.0.255: ネットワークブロードキャストアドレスです。VPC ではブロードキャストがサポートされないため、このアドレスを予約します。
ここで注意したいのは、VPCの最初のアドレスなのではなく、サブネットの最初のアドレスだということです。
つまり上図のように、10.0.0.0/24のVPC内に10.0.0.0/25のサブネットと10.0.0.128/25のサブネットを作ると、VPCルーターのアドレスは10.0.0.1と10.0.0.129となります。
VPCルーターはサブネットの出口
VPCルーターは多くの場合サブネットの出口となります。
EC2からインターネットにアクセスしたい場合を考えてみましょう。
EC2(10.0.0.5)からインターネットにアクセスしたいときは、以下の4つが必要となります。
- IGW作成&アタッチ
- ルートテーブルの編集
- EC2のルーティング
- EC2(10.0.0.5)へのEIP付与
1つずつ見ていきましょう。
[aside]補足
今回はNATゲートウェイを使わず、インスタンスに直接グローバルIP(EIP)を付与する方針でいきます。
[/aside]
IGW作成&アタッチ
まずInternet Gateway(IGW)を作ります。
IGWとは、EC2からインターネットにアクセス出来るようにする出口(ゲートウェイ)です。
IGWを作り、該当のVPCにアタッチします。
ルートテーブルの編集
VPCルーターのルートテーブルに、インターネット(0.0.0.0/0)向けの通信はIGWに転送するように設定します。
EC2のルーティング
続いて、EC2からインターネットにアクセスする際はVPCルーターにパケットを転送するように設定します。
AmazonLinuxとかなんかだと最初からデフォルトゲートウェイ設定が入っているのであまり気にせずとも使えてるかと思いますが、念の為確認しておきましょう。
Windowsだとコマンドプロンプトで
ipconfig
Linuxだと以下のどちらかで確認できるものが多いです。
ifconfig
ip a
0.0.0.0/0へのルートのネクストホップがVPCルーターに設定されていることを確認しましょう。
[aside]補足
実はこの設定は必須ではありません。
自身のIPが正しく設定されていれば勝手にVPCルーターを経由する仕様となっているからです。
詳しくは後述の物理構成を参照してください。
必須ではありませんが、気持ち悪いので設定しておくことをオススメします。
[/aside]
EC2(10.0.0.5)へのEIP付与
最後に10.0.0.5にElastic IPをひもづけましょう。
このひもづけを忘れるとIGWでNATしてくれないため、インターネットにアクセス出来ません。
これらが全て終わるとようやくインターネットにアクセス出来るようになります。
VPCルーターのルートテーブルの編集は忘れがちなので注意しましょう。(私も何度も設定し忘れて通信できない!となりました。)
他の場合も同じ
VPCピアリングで他のVPCにアクセスしたい時や、Virtual Private Gateway(VGW)でVPN先のオンプレミス機器にアクセスしたい時等も基本的には同じで、EC2から他のVPCや外部へのアクセスはVPCルーターを経由します。
そのため、VPCの外に通信する場合、VPCルーターのルートテーブルへの設定追加が必須です。
例えばVPCピアリングだと下図のようになります。
VPCルーターの構成
さて、VPCルーターの構成についてより詳しく見ていきましょう。
物理構成
[aside]補足
実際はAWSは仮想化されています。
なのでより厳密に書くと、L2スイッチは仮想L2スイッチとなり、ルーターは仮想ルーターとなりますが、今回の記事では省略します。
[/aside]
VPCルーターの物理構成は以下の通りとなっており、各EC2インスタンスはVPCルーターに直結しています。
下図のように、あいだにL2スイッチ(以下L2SW)やハブ等はないのがポイントです。
そのため、同一サブネットにデプロイされたEC2とEC2の通信は必ずVPCルーターを経由します。
今までの例のように、VPCルーターをサブネットの出口としてのみ使う場合はどちらの構成でもあまり問題ないので気にしなくても大丈夫です。
問題となるのはVPC内にファイアウォールやルーター等のネットワーク機器をデプロイさせてルーティングさせたい時です。
実際に私がやろうとした構成に沿ってご説明します。
負荷試験なのに負荷が上がらない・・・?
デプロイしたネットワーク機器(図内ではNetwork Deviceと表記)がどれくらいのスループットを出せるか、という負荷試験をしようとしました。
構成は下図の通りで、ネットワーク機器以外がボトルネックとなることが無いよう、他の機器は性能が高いものにしています。
当初私はサブネット内はL2SW(の機能)があるものだと勝手に思い込んでいたので、以下2つの設定を加えて試験しました。
- ネットワークデバイスを経由するようにインスタンスのネクストホップを変更
- VPCルーターにピアリング用のルートを追加
[aside]補足
右側のVPCの設定については本題から外れるので省略します。
[/aside]
これで負荷試験を実施したところ、スループットが想定よりも高い・・・。しかもネットワーク機器のCPU利用率にまったく変化が見られません。
通信は出来ているのに、何かがおかしい・・・?何が問題だったのでしょうか。
VPCルーターへの設定が漏れていた
物理構成を忠実に書くと、今回の試験構成は下図です。
なので、インスタンスから出た通信は何はともあれVPCルーターを通ります。
ネクストホップをネットワーク機器のIPにしてもそれは変わりません。
なんとVPCルーターは来たパケットの宛先を見て、VPCピアリングの方に転送してしまうのです。
このままだとネットワーク機器を経由した負荷試験が出来ません。
ネットワーク機器を経由させるためには、
- ネットワーク機器のサブネットを分けて、(ルートテーブルも分けて)
- インスタンスのネクストホップはVPCルーターにし、
- VPCルーターにENI向けのルートを設定する
ことが必要となります。
ちなみにですが、この構成だと逆方向(右側から左側)の負荷試験は出来ません。
VPCピアリングからVPCに入る際に、ネットワーク機器を通らずに通信してしまいます。
まとめ
VPCルーターという簡単そうで複雑なAWSコンポーネントについて解説しました。
同一サブネット内でtracerouteをしても1ホップで到達するのでスイッチングをしてそう、かつルーティングをする機器なので、VPCルーターというよりかはVPC L3スイッチの方がイメージとしては近いです。
EC2でネットワーク機器をデプロイしたり、他のEC2を経由させた通信をしたいというときはご注意ください。
コメント
この場合、逆方向(右側から左側)の負荷試験をするためには、間にvpcをかませるしかないのでしょうか?
ご質問いただきありがとうございます。ご返事が遅くなってしまいました。。
VPCは他のVPCから来た通信を転送しないという制約があるため、VPCを間にかますと通信できなくなってしまうかと思います。
あらためて右から左の負荷試験をどうすれば良いか考えていましたがあまり良いアイデアが浮かびませんでした。
負荷試験という意味合いではあまり良くはありませんが、Network DeviceにてNATをするか、右側のVPCにもNetwork Deviceを作ってNetwork Deviceどうしでトンネルを張るというのが良いのではないかと思いましたがいかがでしょうか?