コンテンツにスキップするには Enter キーを押してください

Transit VPCをVyOSでやってみた

どうもこんにちは。小原です。以前案件で複数リージョンとお客様のデータセンターを接続するためTransitVPCを組むことがありました。
TransitVPCはAWSが正式に提供しているソリューションで複数リージョンをスター型に接続するものです。今回はVyOSでTransitVPCと同様にスター型のネットワークを構築してみました。

はじめに

はじめにTransitVPCとは何かを説明したいと思います。上記でさらっと説明しましたが公式的にはこのように言っています。

この機能を使用して地理的に離れていたり、別々の AWS アカウントで実行している仮想プライベートクラウド (VPC) をグローバルネットワーク転送センターとして機能する一般的な VPC と接続することができます。このネットワークトポロジーはネットワーク管理を簡略化し、設定と管理を必要とする接続の数を減少することができます。さらに実装は仮想的に行うようになっているので、物理的なネットワーク機器は不要、コロケーション転送ハブの目の前にいる必要もありません

AWS ソリューション – Transit VPC | Amazon Web Services ブログ

このようなソリューションをAWSが提供しており、更にCloudFormationまで提供してくれているのでこのCloudFormationを実行するだけでTransitVPCが出来上がってしまいます。

TransitVPCを利用する際に中心となるVPCにハブとなるルータを設置します。このルータが各拠点と接続することでスター型のネットワークが構築できるということです。その中心となるハブのルータはCisco Cloud Services Router 1000V (CSR) っというCiscoの仮想ルータがハブのルータとして動いています。ではこのCSRのルータがどのように各拠点とつなぐか。それはVPNを各拠点のVGWと接続することでネットワークを構築することができます。

ここのCSRの部分を今回はVyOSにし、構築してみました。その流れを見ていきたいと思います。
全体的な構成は以下のようになります。

TransitVPCは東京リージョンに。
SporkVPCは東京とバーリジニア北部リージョンに設置しました。

TransitVPC

まずは大元となるTransitVPCから見ていきたいと思います。

VPCやらIGWやら

TransitVPCとなるVPCを準備していきます。
通常のコンソールからVPCを作成します。
名前はわかりやすいよう「transit-vpc」とかで作ってみましょう。
CIDRは「10.0.0.0/16」で作成します。
次にサブネットをを作成します。
今回は冗長構成を組むことはないのでとりあえずひとつだけ、サブネットを作っておきましょう(「10.0.0.0/24」とかで作っておけばいいでしょう)

次にIGWを作成し、TransitVPCにアタッチします。
最後にルートテーブルでデフォルトゲートをIGWに向ければOkです。

VyOS

次にメインとなるVyOSの作成を進めていきましょう。
VyOSはAWS Marketplaceにあるのでそれを使っちゃいます。(VyOS (HVM) 1.1.8-66e10eda-0acd-4301-9012-3113b2cfa4f5-ami-220db358.4 (ami-6946f70f)を使いました)
基本的に通常のEC2を作るときと同様にインスタンスタイプ、VPCの指定(ここではTransitVPCを指定)、ボリューム、タグ、セキュリティグループを指定していきます。
(※TransitVPCを組むために特別、セキュリティグループに指定する必要はありません。インバウンドは設定用でSSHするのでそれぐらい開けてれば問題ないです。)
最後にキーペアーを指定します。
次にVyOSにアタッチするEIPを取得し、VyOSにアタッチします。

SporkVPC

次にSporkVPCを作っていきましょう。まずは東京リージョンのSporkVPCから。
VPCを作成します。CIDRは「10.1.0.0/16」としておきましょう。サブネットは「10.1.0.0/24」とかで十分です。
では次に仮想プライベートゲートウェイ(VGW)を作成しましょう。
名前はわかりやすいよう「spork-vpc-1-vgw」とでもつけておきましょう(何でもし)。
次にカスタマーゲートウェイ(CGW)を作成していきます。
名前は「spork-vpc-1-cgw」とでもつけておきましょう。ルーティングはBGPでのルーティングを行わせるため、「動的」に変えておきます。ASは「65000」とでもしておきましょう。
IPアドレスには先程VyOSにアタッチしたEIPのアドレスを指定します。
次にVPN接続の作成を行っていきます。
ここでVPN接続を行わせるためにVGWとCGWを指定します。

次にこのCGWへVyOSからVPNを接続するために設定ファイルをダウンロードします。

ここでは「Vyatta」となっていますが、VyOSはVyattaからの派生ですから問題ないです。
これでVyOSの設定ファイルが手に入りました。
次にSporkVPCのルートテーブルを編集します。

※0.0.0.0/0をIGWに向けているのは最終的にSporkVPC間で通信できるか確認するためSporkVPC内のインスタンスにSSHするためです。

東京リージョンのSporkVPC同様にバージニア北部リージョンにもSporkVPCを作成していき、VyOSの設定ファイルをダウンロードします。(バージニア北部では10.3.0.0/16でVPCを作成しています)

設定ファイルの修正

ここで設定ファイルを修正します。
まずは東京リージョンのSporkVPCの設定ファイルから。ここではlocal-addressとなっている部分EIPのアドレスからVyOSのローカルアドレスに変更します。

set vpn ipsec site-to-site peer 13.115.207.130 local-address '10.0.0.199'
set vpn ipsec site-to-site peer 52.197.155.231 local-address '10.0.0.199' 

ではこの設定ファイルをVyOSに流してみます。

vyos@VyOS-AMI:~$configure
vyos@VyOS-AMI:~#source [ファイル名]
・・・
vyos@VyOS-AMI:~#commit
vyos@VyOS-AMI:~#save

これで東京リージョンのSporkVPCへの接続の設定が完了しました。
少し時間をあけてVPNの設定を見るとこのようにあっているはずです。

ここまでで接続が完了となります。
次にバージニア北部の設定ファイを少し変更します。
local-addressの設定は東京リージョンと同様にVyOSのローカルアドレスに変更します。
次にVirtual intefaceの名前の変更をします。先程の東京リージョンの設定時にVirtual Interfaceを作成したのですがその名前がかぶってしまうと作成に失敗してしまします。
なので「vti0」「vti1」となっているのを「vti2」「vti3」としましょう。

set vpn ipsec site-to-site peer 34.197.65.197 vti bind 'vti2' 
・・・
set interfaces vti vti2 address '169.254.46.222/30'
set interfaces vti vti2 description 'VPC tunnel 1'                                   
set interfaces vti vti2 mtu '1436'   
・・・
set vpn ipsec site-to-site peer 52.70.217.181 vti bind 'vti3'    
・・・
set interfaces vti vti3 address '169.254.47.6/30'
set interfaces vti vti3 description 'VPC tunnel 2'
set interfaces vti vti3 mtu '1436' 

この設定ファイルをVyOSに流します。
少し時間をあけてVyOSの設定を見てみると以下のようになっているはずです。

vyos@VyOS-AMI:~$ show ip bgp
BGP table version is 0, local router ID is 10.0.0.199
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
              r RIB-failure, S Stale, R Removed
Origin codes: i - IGP, e - EGP, ? - incomplete
   Network          Next Hop            Metric LocPrf Weight Path
*> 0.0.0.0          10.0.0.1                 0         32768 i
*  10.1.0.0/16      169.254.24.73          200             0 64512 i
*>                  169.254.27.161         100             0 64512 i
*  10.3.0.0/16      169.254.47.5           200             0 64512 i
*>                  169.254.46.221         100             0 64512 i
Total number of prefixes 3

これで2つのSporkVPC間をVPNで接続することができました。
最後に疎通確認をしてみましょう。

[ec2-user@ip-10-1-0-127 ~]$ ping 10.3.0.136
PING 10.3.0.136 (10.3.0.136) 56(84) bytes of data.
64 bytes from 10.3.0.136: icmp_seq=1 ttl=253 time=164 ms
64 bytes from 10.3.0.136: icmp_seq=2 ttl=253 time=164 ms
64 bytes from 10.3.0.136: icmp_seq=3 ttl=253 time=164 ms
64 bytes from 10.3.0.136: icmp_seq=4 ttl=253 time=164 ms
64 bytes from 10.3.0.136: icmp_seq=5 ttl=253 time=164 ms
64 bytes from 10.3.0.136: icmp_seq=6 ttl=253 time=164 ms
64 bytes from 10.3.0.136: icmp_seq=7 ttl=253 time=164 ms
64 bytes from 10.3.0.136: icmp_seq=8 ttl=253 time=164 ms

見事に疎通ができました!!

まとめ

サクサク進むかと思ったのですが以下のようなトラブルが発生してしまっていました、、

  • VyOSで複数のBGPピアを接続できないみたいで、2つめを作ろうとしたときにエラーになってしまいました。どうやらこれは仕様のようです。。。

ただ、VyOSの知識やBGPの知識がなくてもすすめることができましたし、VGWでのVPN接続の手順をおさらいできたので知見としてたまりました。
今の所、されるがままにVyOSに設定ファイルを流していったので設定ファイルの中身を見てどこかでまとめたいと思います。

インフラメインでやってるつもりです。特にネットワークとかとか。Erlang、Elixir、Golang書いてます。

チーム Atlasに所属

コメントする

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です