ルートテーブルのルート情報は行きと戻りの双方向で設定する
はじめに
複数のVPCを跨った通信を行う場合、サブネットルートテーブルのルート設定には注意が必要です。
ネットワークに詳しい方にとっては当たり前の内容だと思いますが、ルート設定時の注意喚起のため公開します。
ルーティング設計の注意点
サブネットルートテーブルにはルート情報として[送信先]と[ターゲット]を指定しますが、それらによるルーティング制御は以下のように動作します。
- ルートテーブルは、通信がサブネットから出るタイミングで通信の転送先を決定する。
- パケットの宛先IPアドレスとルートの[送信先]を照合して、[ターゲット]に通信をルーティングする。
- インバウンド通信であろうとアウトバウンド通信であろうと、サブネットから出るパケットの宛先IPアドレスを見て転送先が決定される。
したがって、インバウンド通信であろうとアウトバウンド通信であろうと、サブネットから出るパケットの宛先と転送先を正しくルート情報に設定しないと通信が相手先に届かない、という事になります。
特に複数のVPCを跨る通信の場合、VPC間でCIDRが異なりローカルルート(VPC内の通信のデフォルトルート)ではルーティングできないため、行き方向だけでなく戻り方向についても通信の宛先を意識してルーティング設計する必要があります。
ルーティング検証
複数のVPCを跨った通信の構成として、クロスアカウントでTransitGatewayを共有してVPC間の通信が可能か検証を行いました。
- 両方のVPC(vpc-a, vpc-b)にTransitGateway用サブネット、EC2用サブネットを構成
- EC2サブネットにEC2インスタンス(ec2-a, ec2-b)を配置
- TransitGateway経由でEC2インスタンス間の通信が可能となるように各ルートテーブルを設定
- 互いのVPCからのICMP通信を許可するセキュリティグループをEC2インスタンスにアタッチ
- EC2インスタンス間で相互に通信(ping)が通るか検証
検証1:互いのVPC宛ルートを設定した状態で双方向に通信できるか?
両EC2インスタンス間の通信(ec2-a→ec2-b、ec2-b→ec2-a)において行きのルートと戻りのルートが各ルートテーブルに設定されているので、双方向に通信が通ります。
[ec2-user@ip-10-100-1-125 ~]$ ping -c 3 10.200.1.123
PING 10.200.1.123 (10.200.1.123) 56(84) bytes of data.
64 bytes from 10.200.1.123: icmp_seq=1 ttl=126 time=2.17 ms
64 bytes from 10.200.1.123: icmp_seq=2 ttl=126 time=0.800 ms
64 bytes from 10.200.1.123: icmp_seq=3 ttl=126 time=0.926 ms
--- 10.200.1.123 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2031ms
rtt min/avg/max/mdev = 0.800/1.297/2.165/0.615 ms
[ec2-user@ip-10-200-1-123 ~]$ ping -c 3 10.100.1.125
PING 10.100.1.125 (10.100.1.125) 56(84) bytes of data.
64 bytes from 10.100.1.125: icmp_seq=1 ttl=126 time=0.793 ms
64 bytes from 10.100.1.125: icmp_seq=2 ttl=126 time=0.830 ms
64 bytes from 10.100.1.125: icmp_seq=3 ttl=126 time=0.768 ms
--- 10.100.1.125 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2097ms
rtt min/avg/max/mdev = 0.768/0.797/0.830/0.025 ms
検証2:vpc-a宛のルートを削除した状態で双方向に通信できるか?
ec2-a→ec2-bの通信において戻りのルートが無く、またec2-bからec2-aへの行きのルートが無いので、双方向に通信が通りません。
[ec2-user@ip-10-100-1-125 ~]$ ping -c 3 10.200.1.123
PING 10.200.1.123 (10.200.1.123) 56(84) bytes of data.
--- 10.200.1.123 ping statistics ---
3 packets transmitted, 0 received, 100% packet loss, time 2092ms
[ec2-user@ip-10-200-1-123 ~]$ ping -c 3 10.100.1.125
PING 10.100.1.125 (10.100.1.125) 56(84) bytes of data.
--- 10.100.1.125 ping statistics ---
3 packets transmitted, 0 received, 100% packet loss, time 2068ms
検証結果まとめ
検証1,2の結果から、パケットの宛先と転送先を正しくルート情報に設定しないと通信が相手先に届かない、という事が確認できました。
まとめ
ルートテーブルのルーティング設計ではパケットの宛先IPアドレスを意識してルート設定を行う必要があります。
特に、複数のVPCを跨った通信を行う場合のルート指定では、通信の戻り先へのルートも必要なので忘れずに設定しましょう。
Discussion