🐕

ルートテーブルのルート情報は行きと戻りの双方向で設定する

2023/10/14に公開

はじめに

複数の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)において行きのルートと戻りのルートが各ルートテーブルに設定されているので、双方向に通信が通ります。

互いのVPC宛ルートを設定した状態での双方向通信の確認

ping疎通確認(ec2-a→ec2-b)
[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
ping疎通確認(ec2-b→ec2-a)
[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への行きのルートが無いので、双方向に通信が通りません。

vpc-a宛のルートを削除した状態での双方向通信の確認

ping疎通確認(ec2-a→ec2-b)
[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
ping疎通確認(ec2-b→ec2-a)
[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