アドレスが重複するVPC間でVPN接続してみた

2016.12.24

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

アドレスレンジが重複する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を実行する時に、どのように疎通されるのか確認します。

  1. InstanceAでは、ping 192.168.20.175を実行します
  2. ルートテーブルにより、UTM Aに転送されます
  3. UTM AでSNAT(送信元アドレス変換)します
  4. UTM BでDNAT(宛先アドレス変換)します
  5. InstanceBでICMPリクエストを受信します

ネットワークが繋がる仕組み-送信

戻りの通信(InstanceB→InstanceA)について、確認します。

  1. InstanceBでは、192.168.10.118に返信します
  2. ルートテーブルにより、UTM Bに転送されます
  3. UTM BでSNAT(送信元アドレス変換)します
  4. UTM AでDNAT(宛先アドレス変換)します
  5. InstanceAでICMPリプライを受信します

ネットワークが繋がる仕組み-返信

Sophos UTMのローンチ

手順の紹介に移ります。 Sophos UTMは、AWS Marketplaceから起動します。
今回は時間課金タイプを利用しました。

ローンチ後、送信元/送信先チェックの無効化とElastic IPの割り当てを行います。

セキュリティグループ

セキュリティグループは以下のように設定しました。

UTM Aのセキュリティグループ
SSH TCP 22 管理拠点のIPアドレス
カスタム TCP ルール TCP 4444 管理拠点のIPアドレス
カスタム UDP ルール UDP 500 UTM BのEIP
すべての ICMP 全て 該当なし UTM BのEIP
すべての ICMP 全て 該当なし InstanceAのセキュリティグループ
Instance Aのセキュリティグループ
SSH TCP 22 管理拠点のIPアドレス
すべての ICMP 全て 該当なし 192.168.20.0/24
UTM Bのセキュリティグループ
SSH TCP 22 管理拠点のIPアドレス
カスタム TCP ルール TCP 4444 管理拠点のIPアドレス
カスタム UDP ルール UDP 500 UTM AのEIP
すべての ICMP 全て 該当なし UTM AのEIP
すべての ICMP 全て 該当なし InstanceBのセキュリティグループ
Instance Bのセキュリティグループ
SSH TCP 22 管理拠点のIPアドレス
すべての ICMP 全て 該当なし 192.168.10.0/24

ルートテーブル

サブネットA

サブネットAのルートテーブルは以下の通りに設定します。
偽のサブネットBアドレスのターゲットをUTM Aとします。

ルートテーブルA

サブネットB

サブネットBのルートテーブルは以下の通りに設定します。
偽のサブネットAアドレスのターゲットをUTM Bとします。

ルートテーブルB

IPsec設定

リモートゲートウェイの登録

対向のUTMであるリモートゲートウェイを登録します。
UTM Aでは、以下のように設定します。

リモートゲートウェイ-A側

ゲートウェイ UTM BのElastic IP
事前共有鍵 UTM AとUTM Bで同じ文字列
VPN ID UTM BのプライベートIPアドレス
リモートネットワーク Subnet Bの偽のネットワークアドレス(192.168.20.0/24)

UTM Bでは、以下のように設定します。

リモートゲートウェイ-B側

ゲートウェイ UTM AのElastic IP
事前共有鍵 UTM AとUTM Bで同じ文字列
VPN ID UTM AのプライベートIPアドレス
リモートネットワーク Subnet Aの偽のネットワークアドレス(192.168.10.0/24)

コネクションの作成

IPsecコネクションを作成します。 UTM Aの設定は以下の通りです。

VPNコネクションの接続-A側

リモートゲートウェイ UTM B
ローカルネットワーク Subnet Aの偽のネットワークアドレス(192.168.10.0/24)

UTM Bも同様に設定します。

VPNコネクションの接続-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)に変換します。

UTMA-SNAT

トラフィック送信元 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)に変換します。

UTMB-SNAT

トラフィック送信元 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)に変換します。

UTMA-DNAT

トラフィック送信元 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)に変換します。

UTMB-DNAT

トラフィック送信元 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)し、偽のアドレスで通信しました。 アドレスの重複回避が難しい環境では、便利に使えそうです。

参考