kikumotoのメモ帳

インフラ・ミドル周りを中心に、興味をもったことを適当な感じで。twitter : @takakiku

さくらのVPSにVyattaを入れて、Amazon VPCにVPN接続

第8回JAWS-UGに参加して、そこで富士ソフトの飯尾さんが話したVPCの話題、面白かったです。

ということで、年内にAWS東京リージョンに追加されるはずのVPCを試しおかなきゃ、、、、

といっても、ネットワーク装置なんて持ってないので、さくらのVPSにVyattaを入れて接続することを試みたのでそれをメモしておく。

さくらのVPSにVyattaをインストール

これは、

を参考にして実施。

Amazon VPCの構築

今回は、AWS Management Consoleを使ってVPCを構築する。

以下のような流れで画面を操作する。

  • VPC タブを選択
  • Region は "US East" を選択
  • "Get started creating a VPC" ボタンをクリック
  • "VPC with a Private Subnet Only and Hardware VPN Access" を選択して、"Continue"。
  • "Customer Gateway" にさくらのVPSのIPを入力して、"Continue"。
  • デフォルトをそのまま受け入れて、"Create VPC"。

以上で、VPCの構築がはじまるのでしばし待つ。

構築が終わると、Customer Gateway を設定するための設定データをダウンロードできる。

  • "Download Configutaion" をクリック。
  • "Vendor" を "Generic" に変更。
  • "Yes, Download" をクリック。

ダウンロードしたファイルは後で使うので保存しておく。

VPCのSecurity Groups

VPCの構築後、そのVPC内で立ち上げるEC2 インスタンスのためのSecurity Groupsを設定する。

これも AWS Management Console の VPC タブで以下のように操作をする。

  • 左ペインの"Security Groups"をクリック。
  • "default"にチェック。
  • 下ペインに表示される"Inbound"タブをクリック。
  • "Create a new rule"で"SSH"を選択。
  • "Source"を"172.22.0.0/24"に変更。
    • 今回、さくらのVPSにダミーで用意した内部ネットワークのアドレス帯が"172.22.0.0/24"。
  • "Add Rule"をクリック。
  • 引き続き、"Create a new rule"で"Custom ICMP rule"を選択。
    • このルールは、単にインスタンスへのPingによる疎通確認を行いたいので追加している。
  • "Type"を"Echo Request"に変更。
  • "Source"を"172.22.0.0/24"に変更。
  • "Add Rule"をクリック。
  • "Apply Rule Changes"をクリック。

これでSecurity Groupsの設定は完了。

VPC内にEC2インスタンスを起動

AWS Management ConsoleのEC2タブから、"US East" Regionにインスタンスを作成する。

今回の手順。

  • "Launch Instance"をクリック
  • "Basic 32-bit Amazon Linux AMI 2011.02.1 Beta"を選択。
  • "Launch Instances Into Your Virtual Private Cloud"を選択する。SubnetID はここまでの手順であれば1つしか作っていないので、そのままにして "Continue"。
  • "IP Adderess"はからのままで "Continue"。
  • Tag は必要であれば適宜入力して "Continue"。
  • Key Pairsは適宜設定して "Continue"。
  • "Choose one or more of your existing Security Groups"から、先に修正した default Security Groupsを選択して"Continue"。
  • 最後に内容を確認して "Launch"。

Vyattaを構成

VyattaでAmazon VPCに接続するために参考にさせてもらったのは以下のページ

まずさくらのVPS側の情報としては以下を使う。

 グルーバルIPv4アドレス: 49.212.xx.xx/23
 Gateway        : 49.212.22.1

なお、今回はさくらのVPSサーバ内に仮想的なプライベートアドレスとして 172.22.0.101/24 も用意している。

また、先にVPCの構成時にダウロードしたファイルから使う値(ファイル毎に違うもの)は以下の通り。
ちなみに、今回使うのは IPSec Tunnel #1 の情報のみ。(Pre-Shared Key は本来秘密にしておくもの。以下のKeyはすでに破棄したVPCのKeyです)

 Pre-Shared Key           : vvFWtUb7xtBcKkYsTInb8g.6CveKDdS0

 Outside IP Addresses:
   - Customer Gateway:        : 49.212.xx.xx 
   - VPN Gateway              : 72.21.209.225
		
 Inside IP Addresses
   - Customer Gateway         : 169.254.255.2/30
   - VPN Gateway              : 169.254.255.1/30

 BGP Configuration Options:
   - Customer Gateway ASN     : 65000 
   - VPN Gateway ASN          : 7224
   - Neighbor IP Address      : 169.254.255.1

あと、VPCのネットワーク情報としては、

 10.0.0.0/16

を使う。

これらの情報をもとにすると、Vyattaに流し込む設定は以下のようになる。

interfaces {
    ethernet eth0 {
        address 49.212.xx.xx/23
        address 172.22.0.101/24
        address 169.254.255.2/32
    }
}
protocols {
    bgp 65000 {
        neighbor 169.254.255.1 {
            remote-as 7224
            update-source 169.254.255.2
        }
        network 0.0.0.0/0 {
        }
    }
    static {
        route 0.0.0.0/0 {
            next-hop 49.212.22.1 {
            }
        }
    }
}
vpn {
    ipsec {
        disable-uniqreqids
        esp-group ESP1 {
            compression disable
            lifetime 3600
            mode tunnel
            pfs enable
            proposal 1 {
                encryption aes128
                hash sha1
            }
        }
        ike-group IKE1 {
            lifetime 28800
            proposal 1 {
                dh-group 2
                encryption aes128
                hash sha1
            }
        }
        ipsec-interfaces {
            interface eth0
        }
        site-to-site {
            peer 72.21.209.225 {
                authentication {
                    mode pre-shared-secret
                    pre-shared-secret vvFWtUb7xtBcKkYsTInb8g.6CveKDdS0
                }
                ike-group IKE1
                local-ip 49.212.xx.xx
                tunnel 1 {
                    allow-nat-networks disable
                    allow-public-networks disable
                    esp-group ESP1
                    local-subnet 169.254.255.2/32
                    remote-subnet 169.254.255.1/30
                }
                tunnel 2 {
                    allow-nat-networks disable
                    allow-public-networks disable
                    esp-group ESP1
                    local-subnet 172.22.0.101/24
                    remote-subnet 10.0.0.0/16
                }
            }
        }
    }
}

これをファイルに記述して scp などで Vyatta のサーバにアップし

$ configure
# merge /path/to/vpc.config
# commit

すればよい。

さらにパケットの転送制御をするために、以下の内容のファイルをアップする。

#!/bin/sh

BGP_LOCAL_IP_SUBNET=169.254.255.0
BGP_LOCAL_IP_1=169.254.255.2
VPN_1_IP=72.21.209.225
MY_WAN_IP=49.212.xx.xx
MY_LOCAL_SUBNET_IP=172.22.0.101
VPC_CIDR=10.0.0.0/16


ip xfrm policy update dir fwd src $BGP_LOCAL_IP_SUBNET/30 dst $BGP_LOCAL_IP_1/32 tmpl src $VPN_1_IP dst $MY_WAN_IP proto esp level required mode tunnel
ip xfrm policy update dir in src $BGP_LOCAL_IP_SUBNET/30 dst $BGP_LOCAL_IP_1/32 tmpl src $VPN_1_IP dst $MY_WAN_IP proto esp level required mode tunnel
ip xfrm policy update dir fwd src $VPC_CIDR dst $MY_LOCAL_SUBNET_IP/24 tmpl src $VPN_1_IP dst $MY_WAN_IP proto esp level required mode tunnel
ip xfrm policy update dir in src $VPC_CIDR dst $MY_LOCAL_SUBNET_IP/24 tmpl src $VPN_1_IP dst $MY_WAN_IP proto esp level required mode tunnel 

これを Vyatta サーバ上で実行する。

以上で、うまくいっていれば

ping -I 169.254.255.2 169.254.255.1

で、VPN Gateway との疎通が確認できる。

さらに

ping -I 172.22.0.101 10.0.1.111

で(10.0.1.111 は EC2 インスタンスのIP)、インスタンスとの疎通が確認できる。

ここまでくれば、あとは EC2 インスタンスssh でログインできる。

sudo ssh -i /path/to/key.pem ec2-user@10.0.1.111

netstat で確認したら、172.22.0.101 からの接続があるので、IPSec VPN 接続が成功しているようだ。

長くなったけど、こんな感じでVPCを試すことができた。

最後に、、、

VPC、早く東京に来い!