1台のルータから同リージョンの2つのVPCに同時に接続してみた

1台のルータから、(同一リージョンの)2つのVPCへ接続したいというニーズがあると思われるので、試してみました。

用意するもの

  • 仮想ルータ機能を持つルータ
    今回はJuniper SSG5を利用しました。LAN側のCIDRは192.168.1.0/24となっています。
  • 2つのグローバルIPアドレス
    今回はフレッツのISPを2つ用意しました。
  • VPCを2つ
    CIDRは異なるようにしておきましょう。今回は172.21.0.0/16と172.20.0.0/16を使用しています。

ネットワーク構成

こちらのような構成となります。

下準備

ルータを初期化した所から始めます。

インターフェース 用途 Zone VirtualRouter
ethernet0/0 ISP1 Untrust1 untrust-vr
ethernet0/1 ISP2 Untrust2 untrust-vr2
bgroup0(ethernet0/2-6) LAN Trust trust-vr

という構成にします。
各インターフェースでPPPoEの設定をしてください。Auto-connectの設定にしておくとよいでしょう。

VPN connectionの作成(今回のミソ)

VPN connectionを各VPC毎に作成します。普通に作成するとtunnelに使用するアドレス(169.254.252.x)がかぶる可能性が高いので、2つ目のVPN connectionを作る前にダミーのIPアドレスを使って一時的に複数のVPN connectionを1つのVPC用に作り、かぶらないようなトンネルアドレスを使用できるようにします。
何を言ってるかよくわからないと思いますが、VPN connectionを作成する際に、下記のようにして作成します。

  1. 最初のVPC用にCustomer Gatewayの設定と、VPN connectionを作成し、configファイル(ScreenOS用)をダウンロード
  2. 2つめのVPCでCustomer GatewayにダミーのIPアドレス(既存のインスタンスについているIPなどのグローバルIP)で作成
  3. 2つめのVPCでCustomer Gatewayに本命のIPアドレスで作成
  4. 先にダミーのCustomer Gatewayを使用してVPN connectionを作成
  5. 本命のCustomer Gatewayを使用してVPN connectionを作成
  6. configをダウンロードしてみて、1で作成したVPC connectionとトンネルインターフェースのIPアドレスがかぶっていない事を確認
  7. ダミーのVPN connectionを削除
  8. ダミーのCustomer Gatewayを削除

コンフィグの修正

共通事項

今回はフレッツを使っているので、MTU/MSSをそれぞれ1390/1350に調整します。

1つめのコネクション

トンネルが属するゾーンをTrust->Untrust1に読み替えます。またVirtual Routerはuntrust-vrとなります。

$ perl -pe 's/1436/1390/;s/1396/1350/;s/Trust/Untrust1/;s/trust-vr/untrust-vr/;s/^#.+//;s/^\s+$//' < /path/to/vpn1-config.txt

で得られるコンフィグを投入します。

2つめのコネクション

トンネルが属するゾーンをTrust->Untrust2に読み替えます。tunnel.1/2をそれぞれtunnel.3/4と読み替えます。またVirtual Routerはuntrust-vr2となります。

$ perl -pe 's/1436/1390/;s/1396/1350/;s/Trust/Untrust2/;s/trust-vr/untrust-vr/;s/tunnel.1/tunnel.3/;s/tunnel.2/tunnel.4/;s/^#.+//;s/^\s+$//' < /path/to/vpn2-config.txt

で得られるコンフィグを投入します。

Routing設定

このままでは各Virtual Router間はルーティングが行われませんので、Routingの設定を行います。
CUIから入れるなら

set vrouter "trust-vr"
set route 172.21.0.0/16 vrouter "untrust-vr" preference 20 metric 1
set route 172.20.0.0/16 vrouter "untrust-vr2" preference 20 metric 1
exit
set vrouter "untrust-vr"
set route 192.168.1.0/24 vrouter "trust-vr" preference 20 metric 1
exit
set vrouter "untrust-vr2"
set route 192.168.1.0/24 vrouter "trust-vr" preference 20 metric 1
exit

となります。
GUIで入れる場合には、Network > Routing > Virtual Routersから、Route Entriesをクリックし、右上の対象VRを指定してNewを押し、対象CIDRを指定して振り先のvirtual routerを指定してOKを押します。

Policy用オブジェクト作成

Routingされたとしても、Policyがない状態では各Zoneの通信はRejectされてしまうので、Policyを設定していきます。
それに先立って、VPCとInternet上のホストを区別するため、Policy用のオブジェクトを作成していきましょう。
Policy > Policy Elements > Addresses > Listに行き、左上の対象ゾーンを選び、Newを押します。
NameにVPCのID、IPアドレス/マスクをVPCのCIDRを入れていきます。それぞれのVPC毎にオブジェクトを作成しました。

Policy作成

Policy > Policiesに行き、

  • Untrust1->Trust : Src:vpc-xxxxxxxx Dst:Any Service:Any Action:Permit
  • Untrust2->Trust : Src:vpc-yyyyyyyy Dst:Any Service:Any Action:Permit
  • Trust->Untrust1 : Src:Any Dst:Any Service:Any Action:Permit
  • Trust->Untrust2 : Src:Any Dst:Any Service:Any Action:Permit

を投入します。もっと細かくポリシーを設定する場合(プロトコルを絞りたいなど)は、適宜設定しましょう。

疎通確認

$ ssh vyatta@172.20.0.254
Welcome to Vyatta
Linux vyatta 2.6.37-1-586-vyatta-virt #1 SMP Thu Jul 7 22:30:24 PDT 2011 i686
Welcome to Vyatta.
This system is open-source software. The exact distribution terms for 
each module comprising the full system are described in the individual 
files in /usr/share/doc/*/copyright.
Last login: Mon May  7 15:47:47 2012 from 192.168.1.200
vyatta@vyatta:~$ logout
Connection to 172.20.0.254 closed.
$ ssh ec2-user@172.21.0.4
Last login: Mon May  7 15:47:27 2012 from 192.168.1.200

       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|

See /usr/share/doc/system-release/ for latest release notes.
[ec2-user@ip-172-21-0-4 ~]$ logout
Connection to 172.21.0.4 closed.

どちらのVPCにも通信ができている事が確認できました!