アドレスが重複するVPC間でVPN接続してみた
はじめに
アドレスレンジが重複するVPC間でVPN接続をしてみました。
VPNとNATを設定できるSophos UTMを利用します。
VPC Peeringは利用出来ない
VPC間でプライベートIPアドレスで接続する場合、まずVPC Peeringを検討しますが、今回は利用出来ません。
Peeringの制限として、ネットワークアドレスが一致または重複するVPC間ではピア接続を作成出来ません。
ローカルルートが最優先
VPCのルートテーブルの仕様を確認します。
ルートテーブルを作成すると、VPCアドレスのエントリが作成されます。
これをローカルルートと呼びます。
ローカルルートは変更/削除が出来ず、エントリの中で最優先されます。
以下の例ではローカルルートに含まれる192.168.1.16/28
は無効です。
Destination | Target |
192.168.1.0/24 | local |
0.0.0.0/0 | インターネットゲートウェイ |
192.168.1.16/28 | 仮想プライベートゲートウェイ |
構成図
InstanceAからInstanceBにVPN経由で通信させます。
それぞれのVPCはアドレスが重複(192.168.1.0/24)しています。
VPN接続とNATが出来るSophos UTMを導入します。
前述のローカルルートの仕様をクリアするために、偽のアドレスを利用します。
VPCAを"192.168.10.0/24"、VPCBを"192.168.20.0/24"とします。
InstanceAからInstanceBに接続する場合、192.168.20.175
を指定します。
InstanceBからInstanceAに接続する場合、192.168.10.118
を指定します。
ネットワークがつながる仕組み
InstanceAからInstanceBにpingを実行する時に、どのように疎通されるのか確認します。
- InstanceAでは、
ping 192.168.20.175
を実行します - ルートテーブルにより、UTM Aに転送されます
- UTM AでSNAT(送信元アドレス変換)します
- UTM BでDNAT(宛先アドレス変換)します
- InstanceBでICMPリクエストを受信します
戻りの通信(InstanceB→InstanceA)について、確認します。
- InstanceBでは、
192.168.10.118
に返信します - ルートテーブルにより、UTM Bに転送されます
- UTM BでSNAT(送信元アドレス変換)します
- UTM AでDNAT(宛先アドレス変換)します
- InstanceAでICMPリプライを受信します
Sophos UTMのローンチ
手順の紹介に移ります。
Sophos UTMは、AWS Marketplaceから起動します。
今回は時間課金タイプを利用しました。
ローンチ後、送信元/送信先チェックの無効化とElastic IPの割り当てを行います。
セキュリティグループ
セキュリティグループは以下のように設定しました。
SSH | TCP | 22 | 管理拠点のIPアドレス |
カスタム TCP ルール | TCP | 4444 | 管理拠点のIPアドレス |
カスタム UDP ルール | UDP | 500 | UTM BのEIP |
すべての ICMP | 全て | 該当なし | UTM BのEIP |
すべての ICMP | 全て | 該当なし | InstanceAのセキュリティグループ |
SSH | TCP | 22 | 管理拠点のIPアドレス |
すべての ICMP | 全て | 該当なし | 192.168.20.0/24 |
SSH | TCP | 22 | 管理拠点のIPアドレス |
カスタム TCP ルール | TCP | 4444 | 管理拠点のIPアドレス |
カスタム UDP ルール | UDP | 500 | UTM AのEIP |
すべての ICMP | 全て | 該当なし | UTM AのEIP |
すべての ICMP | 全て | 該当なし | InstanceBのセキュリティグループ |
SSH | TCP | 22 | 管理拠点のIPアドレス |
すべての ICMP | 全て | 該当なし | 192.168.10.0/24 |
ルートテーブル
サブネットA
サブネットAのルートテーブルは以下の通りに設定します。
偽のサブネットBアドレスのターゲットをUTM Aとします。
サブネットB
サブネットBのルートテーブルは以下の通りに設定します。
偽のサブネットAアドレスのターゲットをUTM Bとします。
IPsec設定
リモートゲートウェイの登録
対向のUTMであるリモートゲートウェイを登録します。
UTM Aでは、以下のように設定します。
ゲートウェイ | UTM BのElastic IP |
事前共有鍵 | UTM AとUTM Bで同じ文字列 |
VPN ID | UTM BのプライベートIPアドレス |
リモートネットワーク | Subnet Bの偽のネットワークアドレス(192.168.20.0/24) |
UTM Bでは、以下のように設定します。
ゲートウェイ | UTM AのElastic IP |
事前共有鍵 | UTM AとUTM Bで同じ文字列 |
VPN ID | UTM AのプライベートIPアドレス |
リモートネットワーク | Subnet Aの偽のネットワークアドレス(192.168.10.0/24) |
コネクションの作成
IPsecコネクションを作成します。 UTM Aの設定は以下の通りです。
リモートゲートウェイ | UTM B |
ローカルネットワーク | Subnet Aの偽のネットワークアドレス(192.168.10.0/24) |
UTM Bも同様に設定します。
リモートゲートウェイ | UTM A |
ローカルネットワーク | Subnet Bの偽のネットワークアドレス(192.168.20.0/24) |
リンクアップの確認
IPsecがリンクアップしていることを確認します。
NAT設定
ネットワークからネットワークへのマッピングを行う1:1NATルールを設定します。
SNAT
送信元IPアドレスを変換するSNATを設定します。
UTM Aでは、以下のように設定します。
送信元アドレスを元のアドレス(192.168.1.0/24)から、偽のアドレス(192.168.10.0/24)に変換します。
トラフィック送信元 | Internal(Network) | 192.168.1.0/24 |
トラフィック宛先 | UTM B - LAN | 192.168.20.0/24 |
マップ先 | UTM A - LAN | 192.168.10.0/24 |
UTM Bも同様に設定します。
送信元アドレスを元のアドレス(192.168.1.0/24)から、偽のアドレス(192.168.20.0/24)に変換します。
トラフィック送信元 | Internal(Network) | 192.168.1.0/24 |
トラフィック宛先 | UTM A - LAN | 192.168.10.0/24 |
マップ先 | UTM A - LAN | 192.168.20.0/24 |
DNAT
宛先IPアドレスを変換するDNATを設定します。
UTM Aでは、以下のように設定します。
宛先アドレスを偽のアドレス(192.168.10.0/24)から、VPCAの本当のアドレス(192.168.1.0/24)に変換します。
トラフィック送信元 | UTM B - LAN | 192.168.20.0/24 |
トラフィック宛先 | UTM A - LAN | 192.168.10.0/24 |
マップ先 | Internal(Network) | 192.168.1.0/24 |
UTM Bでは、以下のように設定します。
宛先アドレスを偽のアドレス(192.168.20.0/24)から、VPCBの本当のアドレス(192.168.1.0/24)に変換します。
トラフィック送信元 | UTM A - LAN | 192.168.10.0/24 |
トラフィック宛先 | UTM B - LAN | 192.168.20.0/24 |
マップ先 | Internal(Network) | 192.168.1.0/24 |
疎通テスト
InstanceAからInstanceBにpingを送信します。
[ec2-user@ip-192-168-1-118 ~]$ ping 192.168.20.175 PING 192.168.20.175 (192.168.20.175) 56(84) bytes of data. 64 bytes from 192.168.20.175: icmp_seq=2 ttl=253 time=1.54 ms
InstanceBでは、"192.168.10.118"からICMPリクエストを受け取り、"192.168.10.118"にICMPリプライを送信します。
[root@ip-192-168-1-175 ~]# tcpdump icmp tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes 05:40:29.062698 IP ip-192-168-10-118.ap-northeast-1.compute.internal > ip-192-168-1-175.ap-northeast-1.compute.internal: ICMP echo request, id 2738, seq 111, length 64 05:40:29.062716 IP ip-192-168-1-175.ap-northeast-1.compute.internal > ip-192-168-10-118.ap-northeast-1.compute.internal: ICMP echo reply, id 2738, seq 111, length 64
InstanceBからInstanceAへのpingも同様に疎通出来ます。
おわりに
VPCのアドレス設計は重複が無いように気をつける必要があります。
アドレスが重複した環境では、VPC PeeringやVPN、Direct Connect接続が出来ないためです。
アドレスの重複を回避出来ない場合は、まずはVPCの再作成を検討します。
アドレス設計はAmazon VPC IPアドレス設計レシピをご覧下さい。
今回は、Sophos UTMでVPNとアドレス変換(NAT)し、偽のアドレスで通信しました。 アドレスの重複回避が難しい環境では、便利に使えそうです。