みなさん、こんにちは。
匠部の三原です。

今回は、ハイブリットクラウド風環境の簡単構築方法についてご紹介します。

1章 はじめに

1.1節 目的

クラウドファーストという言葉が流行している時代ですが、まだまだ社内のプライベートネットワーク内に物理サーバを抱え、開発環境や社内システムを構築している企業は多いのではないでしょうか。
もし、プライベートネットワーク環境とクラウドネットワーク環境をVPNで接続できれば、既存のハードウェア資産を活用しつつ、性能検証時のみの一時的なサーバリソースの調達や、災害対策を考慮したバックアップ体制などで柔軟な対応が可能です。

今回は、プライベートネットワーク環境とAWSのVPC環境をVPNで接続する具体的な手順をご紹介します。物理ルータを利用することも当然できますが、今回はOSSの仮想ルータであるVyOSを利用します。
VyOSの推奨スペックは、ストレージ2GB、メモリ512MBと大変軽量なため、わざわざ専用の物理ルータを用意しなくても、社内の余っている仮想環境のリソースを使って稼働できます。また、AWSはVyOSとのVPN接続をサポートしており、VyOS用のVPN設定ファイルを自動生成してくれます。

1.2節 目指す構成図

今回目指す構成は、以下の図の通りです。

構成図

上記の構成で、AWSのVPC環境とプライベートネットワーク環境のサーバがローカルIPで相互に通信できる形にします。
注目するべきポイントとして、社内側にはFW(ルータ)がありVyOSのDMZ側のプライベートIPはグローバルIPと相互にNATされているところです。既存の社内ネットワーク構成に大きな影響を与えないようにするため、GWの役割をしているFWから直接VPNで接続しない構成にしています。
[注意]AWSはNATトラバーザルに対応していないため、FWにESPの穴を空けられなければこの構成は取れません。

1.3節 全体行程

全体の行程は以下の通りです。

  1. AWSのVPC環境構築
  2. 社内側のFW設定変更
  3. プライベートネットワーク環境にvyos設置
  4. VPNの疎通

2章 AWSのVPC環境構築

AWSのVPCコンソールの「Start VPC Wizard」からVPCを作成します。
まず、VPC構成のパターンを選択します。今回は、AWS側から直接インターネットにアクセスしない用途を想定するため、下画面の様にVPNとの接続用のSubnetのみ作成されるパターンを選択します。

aws_vyos_02

次にサブネットのIPレンジなどの設定します。
今回はデフォルトのIPレンジで問題ないので、下の画面の様にVPCの名前だけ入力して次に進みます。

aws_vyos_05
VPN接続先設置

最後に、VPNに関する設定を入力します。
AWSとVPNをつなげるためには、AWSに社内側のVPNの接続先をCustom Gatewayとしてを登録しておく必要があります。社内側のVyOSのIPアドレスのグローバルIPと名前を入力します。また、Routing TypeはDynamic(BGP)を利用します。

VPCの完成後、VPN一覧画面にてVPN用の設定ファイルがダウンロードできます。
ルータ種別で「Vyatta」を選択して、設定ファイルをダウンロードします。

VyOS用の設定をダウンロードする画面

ダウンロードした設定ファイルの30行付近と、110行付近に以下の様な記述があります。

30行目付近: set vpn ipsec site-to-site peer 200.200.200.200 authentication mode 'pre-shared-secret'
110行目付近: set vpn ipsec site-to-site peer 200.200.200.201 authentication mode 'pre-shared-secret'

この行に記載されているIPが、AWS側のVPN接続先のグローバルIPです。
この例では、「200.200.200.200」「200.200.200.201」がVPN接続先のグローバルIPです。
この様に、AWS側のVPN接続先はデフォルトで2箇所作成されます、VyOSのダイナミックルーティングでは、アクティブな方の接続先を使ってVPN上の通信が行われるため、AWS側の接続先は自動的に冗長化できます。

3章 社内側のFW設定変更

社内のFWでは、以下の2つの設定が必要です。

  1. VyOSとAWS側のVPN接続先との間で、ESP(プロトコル番号 50)の通信を許可
  2. VyOSとAWS側のVPN接続先との間で、IKE(ポート番号 500)の通信を許可

FWの設定方法は機種によって違います。例としてnetscreenでは以下の様に設定します。

# ESPが使用するポート番号などのサービス定義
 set service "ESP" + 50 src-port 0-65535 dst-port 0-65535
 # AWS側のVPNサーバのIPアドレスの定義
 set address "Untrust" "AWS-VPNGW1" 200.200.200.200 255.255.255.255
 set address "Untrust" "AWS-VPNGW2" 200.200.200.201 255.255.255.255
 set group address "Untrust" "AWS-VPNGW"
 set group address "Untrust" "AWS-VPNGW" add "AWS-VPNGW1"
 set group address "Untrust" "AWS-VPNGW" add "AWS-VPNGW2"
 # AWS側のVPNサーバに対するESPの許可
 set policy id 1 name "AWS-VPNGW" from "Untrust" to "DMZ" "AWS-VPNGW" "MIP(100.100.100.100)" "ESP" permit
 set policy id 1
 set service "IKE"
 exit

4章 プライベートネットワーク環境にVyOS設置

社内のサーバにVyOSをインストールします。
VyOSのインストールイメージは、以下のVyOS公式サイトからダウンロードできます。

VyOS日本語公式サイト

※注意 VyOSのver 1.1.0, 1.1.1では、VPN経由のパケットを正しくルーティングできないという致命的なバグがありました。最新のVyOSでは確認できていませんが、もしVPN経由のパケットがルーティングできない場合には、ver.1.0.5をお使いください。
私は、初めてVyOSに触ったときにこのバグにはまり、丸1日持っていかれました…。

VyOSインストール方法と基本的な操作方法については、以下のサイトに日本語で丁寧に書いているのでご確認下さい。

VyOS日本語ガイド

上記、ガイドに従い、DMZとPrivateネットワークに対してインターフェースを設定します。

5章 VPNの疎通

VyOSを設定モードにして、2章の最後にダウンロードしたVPNの設定ファイルをそのままコピペで入力します。このとき、「IPSec Tunnel #1」と「IPSec Tunnel #2」で一部同じ設定があるため、設定済みという旨の警告が数回発生します。

最後に、以下の2箇所を確認して必要ならば修正します。

1. ipsecのlocal-addressは、VyOSのグローバルIP(100.100.100.100)になっているので、NAT後のプライベートIP(192.168.1.2)に変更します。

 set vpn ipsec site-to-site peer 27.0.1.189 local-address '192.168.1.2'

2. VyOSのDMZ側インターフェースが’eth0’でない場合、ipsecのipsec-interfacesを適切なインターフェースに変更します。

 set vpn ipsec ipsec-interfaces interface 'eth1'

以上で、AWSとのVyOS間でVPNをつなぐ設定は完了です。

それでは、二つのネットワークで相互に通信できることを確認してみましょう。

  1. PriveteネットワークにサーバAを用意
  2. サーバA上でルーティングを変更(linuxの場合: route add -net 10.0.1.0 netmask 255.255.255.0 gw 192.168.0.2 eth0)
  3. AWSのsubnetにインスタンスBを用意
  4. 相互にpingが応答することを確認

もし、うまく接続できないときは、以下のポイントをチェックして原因を調べます。

  1. AWSのセキュリティグループでICMPを禁止していないか
  2. VyOSでVPNの確立は確認できているか(show vpn ike sa、show vpn ipsec sa)
  3. VyOSのVTIに双方向のパケットが流れているか(tcpdumpなどで確認)

6章 まとめ

今回は、VyOSを使ったAWSとのVPN接続の手順についてご紹介しました。
NATやFWの設定方法などのハマり所はあるものの、設定ファイルの自動生成など、AWS側がしっかりサポートしてくれているので、案外簡単に環境を構築できます。

VyOSは、ルータとして必要な機能をひとしきり持っているので、社内のプライベートネットワークを柔軟に構築するツールとして利用を検討しても良いのではないでしょうか。