Vyatta on EC2からVPC にVPN接続をする

東京リージョンのVyatta on EC2とUS EASTのVPCとの間でVPN接続を実現する。最近ではよく試されていることだと思うが、VyattaもAWSもほとんど触ったことが無いので、仕事用の検証と練習を兼ねて。

参考にした、ここ( Amazon EC2(Vyatta)からAmazon VPCに接続してみた - log4moto )に書かれていることそのものです。Twitterでも質問に答えて下さり、本当にお世話になりました。

というわけで、設定に入っていく。

EIPの準備

VPCで利用できるVPN接続は、site-to-siteで固定IPが必要なため、予め東京リージョン側でElastic IPを準備しておく。(この時点ではEC2インスタンスを準備してある必要はない)

f:id:matetsu:20111219210821p:plain

VPCを作成

  • "Get Started creating VPC" または "Create Another VPC" ボタンから、VPCを作成する。

f:id:matetsu:20111219210854p:plain

  • 今回は、 "VPC with Public and Private Subnets and Hardware VPN Access" を選択

f:id:matetsu:20111219210920p:plain

  • 先ほどの Elastic IP の IP アドレスを Customer Gateway として設定する。

f:id:matetsu:20111219210945p:plain

  • サブネットは好みのものを指定(Customer Gatewayの内部セグメントと被らないように)。AZは特に指定しない。

f:id:matetsu:20111219211002p:plain

  • VPCの作成が始まる。

f:id:matetsu:20111219211108p:plain

  • 作成が完了すると、ルータに投入する設定をダウンロードできる。
    • 通常は、自分の利用するベンダーの機器を指定するのだが、今回は Vyatta を利用するので、Generic を指定する。ここでダウンロードしたファイルから、 http://gen-vyatta-conf.fluxflex.com/ を利用して Vyatta の設定ファイルを生成する。

f:id:matetsu:20111219211126p:plain

f:id:matetsu:20111219211252p:plain

  • "Yes, Download" を選択すると、VPN connection IDが名前となったテキストファイルがダウンロードされる。

Vyatta用の設定を生成

f:id:matetsu:20111219211355p:plain

  • "作成" を押すと、Vyattaに流し込むための設定ファイルとVPN経由のルーティング設定用スクリプトが生成される。

f:id:matetsu:20111219211412p:plain

一部修正が必要な点があるので、それはその際に説明をする。EIPもリリースしたし、特に伏せる情報ではないと思うが、なんとなく伏せておいた。

Vyatta インスタンスの起動と初期設定

  • AMI ID ami-0204b003 の Vyatta Core 6.3 rev.11のAMIを用いてインスタンスを作成する。

f:id:matetsu:20111219211551p:plain

ほとんどデフォルト設定のmicro-instanceで。Name を vyatta-vpc としておく。Key-Pair新規作成か既存の最新のものを利用する(AMI中の設定で利用しているkey-pairが最新のものをさしているため)。
Security Groupはまずは、SSHのみをAnyから許可した設定で新規作成。

  • インスタンスが出来上がったら、早速Elastic IPを割り当てて、ログインをする。
$ ssh -i path/to/private_key vyatta@EIP
  • とりあえず、Time ZoneをJSTに変更して保存する。
$ configure
[edit]# set system time-zone Asia/Tokyo
[edit]# commit
[edit]# save
[edit]# exit
  • 上で生成した設定ファイルを微修正する。
    • http://d.hatena.ne.jp/j3tm0t0/20110502/1304328905 こちらのエントリを参考に、自分の環境に合わせて修正をする。
      1. interface loopback lo に内部セグメント用のIPアドレスを追加で設定。
      2. vpn ipsec site-to-site peer * local-ip にEIPのグローバルIPが設定されているので、インスタンスの Private IP (eth0 の IP)を設定する(ここは起動のたびに変更されるため、自動化したい場合は更に手を加える必要あり)。今回は 10.152.94.170 。
      3. vpn ipsec site-to-site peer (2つめのpeer) ike group IKE2
      4. vpn ipsec site-to-site peer (2つめのpeer) tunnel 1 esp-group ESP2
      5. vpn ipsec site-to-site peer (2つめのpeer) tunnel 2 esp-group ESP2
    • 3~5はIKE2とESP2が使用されていないので、このように変更したが、意味のある変更かどうかは未検証(接続は問題なくできる)
  • 設定を流し込む。
$ configure
[edit]# merge /home/vyatta/vpc2vpn.txt
Warning: file does NOT appear to be a valid config file.
Do you want to continue? [no] Y
Loading configuration from '/home/vyatta/vpn2vpc.txt'...
Merge complete.  Use 'commit' to make changes active.
[edit]# commit
[edit]# exit
(起動のたびに設定が変わるので、saveは実行しない)
  • ルーティングの設定スクリプトを実行する。
# sh ./connect.sh

これで、Management Console の VPC タブにある VPN Connections の 設定した VPN ID で Tunnel 1 と Tunnel 2 が UP になっていればOK。

f:id:matetsu:20111219211928p:plain

  • Pingで IPSec のIPで疎通が出来るかどうかを確認する。
$ ping 169.254.255.1
OK!
$ ping 169.254.255.5
OK!

VPC内のサブネットとの通信を確認する

Private Subnetにインスタンスを作成

Private Subnetにインスタンスを作成して、Vyattaの内部IPと通信が出来るかどうか確認する。IPアドレスは手動で設定する(今回は 172.16.1.11)。Secrity GroupはICMPとSSHをAnyから許可。

Private Subnetの Security Group と Route Table を設定
  • Security Group
    • Vyatta 内部セグメントからのAll Traficを許可(inbound)
  • Route Table
    • Vyatta 内部セグメントへは vgw を経由するよう設定(MainがYesのほう)
    • 172.16.1.0/24 を Associate
Private Subnetの疎通確認
  • PingでICMPの確認
$ ping 172.16.1.11
OK!
  • SSHでのログイン確認
    • 秘密鍵を Vyatta に配置
$ vi .ssh/priv-key.pem
$ chmod 600 .ssh/priv-key.pem
  • ログイン確認
vyatta$ ssh -i .ssh/priv-key.pem ec2-user@172.16.1.11
ip-172-16-1-11$ 
OK!
Public Subnetにインスタンスの作成

インスタンスを作成して、Vyattaの内部IPと通信が出来るかどうかの確認と、EIPを割り当ててインターネットとの通信を確認する。プライベートIPは手動で設定する(今回は 172.16.0.11)。Secrity GroupはVyattaの内部セグメントからの All Traffic を許可。

Public SubnetにElastic IPの割り当て

VPC内部から外部と通信するためには、EIPが必須。

Public SubnetのSecurity Group と Route Table を設定
  • Security Group
    • Vyatta 内部セグメントからのAll Traficを許可(inbound)
  • Route Table
    • Vyatta 内部セグメントへは vgw を経由するよう設定(MainがNoのほう)
Public Subnetの疎通確認
  • PingでICMPの確認
$ ping 172.16.0.11
OK!
  • SSHでのログイン確認(秘密鍵はprivateと共通)
    • ログイン確認
vyatta$ ssh -i .ssh/priv-key.pem ec2-user@172.16.0.11
ip-172-16-0-11$ 
OK!
  • インターネットへのアクセス
$ ping www.google.co.jp
OK!
NATインスタンスの作成

Private Subnetからインターネットにアクセスするためには、Public Subnetに配置された EIP を持った NAT インスタンスにNATしてもらう必要がある。

NATインスタンスはAMIが提供されているので、それを利用する。(Amazon Images から NATで検索)

f:id:matetsu:20111219212632p:plain

もちろん、Public Subnetに配置されるようにする。プライベートIPは 172.16.0.10 を割り当てる。Security GroupはNAT用に新たに生成(Privateからの通信を許可するようにする)。

NATインスタンスに EIP の割り当て

これ必要。

インスタンスの設定変更

NATインスタンスとして動作させるための設定。 "Change Source / Dest Chek" を Disable にする。

Private Subnetの Route Table変更

デフォルト(0.0.0.0/0)のルーティングをNATインスタンスに向けるようにする。

NATインスタンスを経由しての疎通確認
  • Private Subnetからインターネットへのアクセス
$ ping www.google.co.jp
OK!

設定完了!

これであとは、Public <-> Private 間のSecurity Group設定と、Public Subnetに対する外部からのアクセスを設定すれば、問題なし!


最初に試したときに、Vyattaの内部セグメントを 10.2.0.0/16 とかにしたら、戻りパケットが来なかったので、多分AWS内部のSubnetとかぶってしまったのではないかと予測。今回のサブネット設定であれば、特に何の問題もなく設定できた。最初から通しても2~3時間くらいでできた!

こんな簡単にこんなに素敵な環境が手に入るなんて、AWSってやっぱすげーや。
ほぼ初めて触っても、簡単に環境構築ができるって素晴らしい。


という訳で、ここまで検証ができたので、すべてのインスタンスやらEIPやらVPCやらを削除します!w

参考にさせていただいたページ

その他にも、Twitterでアドバイスしてくださった @j3tm0t0 さん、@ar1 さん、@shot6 さん、@oko_chang さん、ありがとうございました!!
(Twitter IDにリンクできない。。。)