VPCピアリングでVPC間のTCP接続ができなかった現象の解決に20時間弱を要したので、今後のために記録に残しておきます。
背景
目的
VPC①のプライベートサブネットに配置されたEC2Ⓐから、VPC②のプライベートサブネットに配置されたEC2ⒷのHTTPサーバーに接続したい。
環境
- VPC①とVPC②をVPCピアリングで繋いでいた
- VPC①→VPC②のピアリング設定済み
- VPC②→VPC①のピアリング設定済み
- VPC①からVPC②へのルート設定済み
- VPC①のサブネットについて
- VPC②からVPC①へのルート設定済み
- なし(反対方向は不要と思った)
- EC2Ⓑのセキュリティグループ設定はHTTPについてVPC①のCIDR丸ごと許可
調査に使ったもの
- netcat、EC2ⒷでLISTENしてEC2Ⓐで送信して接続確認
- VPCフローログ
- curlの時間計測
- AWS の Reachbility Analyzer
現象
UDPは接続できるのにTCPやICMPが接続できずタイムアウトになる。
以下は EC2Ⓐ から EC2Ⓑ に ping や netcat で送信した結果。
Protocol | Port | VPC | セキュリティグループ | 結果 |
---|---|---|---|---|
ICMP | n/a | 同じVPC | /32 | 〇 |
HTTP | 80 | 同じVPC | /32 | 〇 |
TCP | 1234 | 同じVPC | /16 | 〇 |
UDP | 1234 | 同じVPC | /16 | 〇 |
ICMP | n/a | 違うVPC | /16 | ✕ |
HTTP | 80 | 違うVPC | /16 | ✕ |
TCP | 1234 | 違うVPC | /16 | ✕ |
UDP | 1234 | 違うVPC | /16 | 〇 |
- VPCフローログは、接続時に全て
ACCEPT OK
だった - curl の計測結果は内訳は全て 0 でトータルだけ130秒くらいかかってタイムアウト
- Reachbility Analyzer でも送信元のEC2から相手先のVPCに接続できていた
- もちろん接続先のHTTPサーバーにはアクセスログは形跡なし
VPCフローログで拒否されていないことからEC2上のOSの設定を疑い、iptables や ufw 、hosts.deny を確認したが問題なし。
ここまでで、インスタンス内の問題でもセキュリティグループ設定の問題でもない...
対応
VPC②からVPC①へのルート設定で、該当EC2のサブネットについてVPC①へのルート設定を追加した。
その結果、VPC①からvPC②へのHTTP通信ができるようになった。
結論
VPCピアリングしている環境で TCP接続 する場合は、双方向のルート設定が必要。