VyOSを使用してSite-to-Site VPNの構築検証してみた in 2025

VyOSを使用してSite-to-Site VPNの構築検証してみた in 2025

2025.08.11

はじめに

こんにちは!毎日とっても暑いですね。
クラウド事業本部コンサルティング部のぐっさんです。

Site-to-Site VPNって社内等のオンプレミス環境拠点との接続に使用するVPNのイメージで、
検証が難しいものだと勝手に想像していました。

しかし!公式ハンズオン資料で素敵なものがあったためこちらの一部構成例をお借りしながら構成を組み立て、1つのAWSアカウント内での構築検証をしてみました。

https://pages.awscloud.com/JAPAN-event-OE-Hands-on-for-Beginners-Network2-2022-reg-event.html?trk=aws_introduction_page

前提

  • VPCなどベースの構成はCDKで作成しSite-to-Site VPNの設定部分のみ手動でコンソールから実施しています。
  • CDKの実行環境は事前に整っているものとして記述を進めます。
  • サクッとVPNの設定確認や動作確認を行いたい場合に利用いただけたら幸いです。
  • 検証環境情報
項目 環境情報
OS macOS
Node.js v22.1.0
npm 10.7.0
aws-cdk 2.1016.1
aws-cdk-lib 2.196.0

AWS Site-to-Site VPNとは

とてもざっくりと説明すると、Virtual Private Network (VPN)を使用してAWS環境と別のネットワーク環境の間に暗号化された専用のトンネルを作成して安全な通信を実現するサービスです。

サービス概要・詳細に関しては以下のブログや、公式資料をご確認ください。

https://dev.classmethod.jp/articles/introduction-2024-aws-site-to-site-vpn/

https://pages.awscloud.com/rs/112-TZM-766/images/202110_AWS_Black_Belt_Site-to-Site_VPN.pdf

構成図

今回の構築環境構成図です。
大阪リージョンをオンプレミス環境、東京リージョンをAWS環境に見立ててその間の通信をSite-to-Site VPNで繋ぎます。
VGW(仮想プライベートゲートウェイ)での設定は公式ハンズオンで行われていたので、今回はTGW(トランジットゲートウェイ)をAWS側のゲートウェイとしてVPNを繋ぐ構成としてみました。
オンプレミス側のゲートウェイとなるCGW(カスタマーゲートウェイ)には、ハンズオンでも使われている仮想環境でルーター機能を提供可能なソフトウェアルーターとしてVyOSのAMIを使ったEC2をデプロイします。

構成図

VyOSについて

バージョン情報

2025年現在、AWSで構築可能な最新バージョン(1.4)で構築しています。
設定方法がアップデートされており、公式ハンズオンで紹介されている設定方法のままですと上手く接続が出来ないため、新バージョンのドキュメントを合わせて確認し検証しました。
今後のバージョンアップでさらに内容が変わる可能性もあるため、最新情報はバージョン毎のユーザーガイドをご確認下さい。

https://docs.vyos.io/en/1.4/

利用方法

AWSではMarketplace経由で簡単にVyOS用のAMIを使用可能です。
注意点として、初回30日間はソフトウェア料金が無料の期間がありEC2インスタンスの使用時間のみに課金ですが、期間が過ぎると追加で料金がかかります。
検証目的の場合は完了後に忘れずサブスクリプションの削除をしましょう。

AMIカタログでVyOSを検索
CDKでVyOSのAMI IDを指定するため、構築予定の大阪リージョンでAMIを検索します。
EC2のコンソールからAMIカタログを確認し、「vyos」と検索するとMarketplaceのタブで該当のAMIがヒットします。この時点ではまだAMI IDを確認できません。「選択」を押下します。

VyOSカタログ_1

購読設定
この画面でAMIに関する詳細や料金情報を確認できます。
内容を確認し、「インスタンス起動時に購読」を押下します。この後すぐにデプロイ検証を行う場合は今すぐ購読でサブスクリプションを開始しても問題ありません。

VyOSカタログ_2

AMI ID確認
購読設定を行うと元の検索画面に戻りますが、AMI IDが出力されています。このIDを使用してEC2を構築します。
もし試しにEC2を手動で作成する場合は、画面右上の「AMIでインスタンスを起動」を選択するとそのまま作成画面に遷移します。

VyOSカタログ_3

VyOSにまつわる参考ブログ

設定情報など参考になるものを載せています。ぜひご確認ください!

https://dev.classmethod.jp/articles/vyos-aws/

https://dev.classmethod.jp/articles/vyos-aws-redundancy/

https://dev.classmethod.jp/articles/vyos-aws-vpn/

https://dev.classmethod.jp/articles/vyos-aws-vpn-static-routing/

ベース環境のデプロイ

以下のネットワーク設定部分以外のVPCベース環境部分は、CDKで用意しました。

  • 手動構築部分
    • Site-to-Site VPNの構築
    • 追加のルーティング設定
    • 一部セキュリティグループの内容編集

構成図_該当部分

CDKのコードは下記リポジトリから確認可能です。

https://github.com/cm-yu-y/aws-vyos-sample/tree/main/aws-vyos-sample

主な留意点としては、VyOSとして使用するEC2インスタンスは「sourceDestCheck(送信元/送信先チェック)」を「false(停止)」とする必要があることです。
通常のEC2インスタンスは「自分宛て以外のトラフィックは処理しない」という設定がデフォルトで、ルーターとして使うには自身が中継地点として機能せねばならずfalseにしないと「自分宛てではない通信」として破棄されてしまいます。

CDKコードaws-vyos-sample/aws-vyos-sample/lib/vyos-for-cgw-stack.tsの80行目

sourceDestCheck: false, // Important for routing

大阪リージョン・東京リージョンのスタックをそれぞれデプロイします。
config配下のパラメータ設定ファイルでアカウントIDの設定を行い、AMIやVPC CIDR等はお好みのものでデプロイください。

dev.tsに設定したパラメータでデプロイする場合のコマンドです。AWS CLIのプロファイルは適切に書き換えて下さい。

cdk deploy "Dev-*" --profile CLI-profile

デプロイ後の確認

東京リージョン

VPC

VPC1のリソースマップ
以下のプライベートサブネットと各ルートテーブルが作成されていることを確認します。

  • TGWのアタッチメント用
  • 疎通確認用のEC2用

VPC_1

VPC2のリソースマップ
VPC1と同じように各リソースが構築されていることを確認します。

VPC_2

EC2へSSMセッションマネージャ経由でログイン確認

各EC2にログインを行いIPアドレスを確認しておきます。

VPC1のEC2インスタンス

EC2_VPC1_1

EC2_VPC1_2

EC2_VPC1_3

VPC2のEC2インスタンス

EC2_VPC2_1

EC2_VPC2_2

EC2同士の通信確認(ping)※失敗すること

デプロイ直後の状態では、セキュリティグループでは互いにICMPの通信を許可していますが
EC2のサブネットにTGWに関するルート情報が設定されていないため異なるVPCのEC2インスタンス同士の通信は失敗します。

VPC1のインスタンスからVPC2へのping
PING_1_to_2

しばらく待ってもプロンプトが返らないためCtrl+Cで止めます。
100% パケットロスが確認できます。

PIGN_1_to_2_fail

VPC2のインスタンスからVPC1へのping
こちらも同様です。

PING_2_to_1

PING_2_to_1_fail

TGWの設定確認

TGW、アタッチメント、TGWルートテーブルが作成されていることを確認します。

TGW_1

TGW_2

ルートテーブルには上記アタッチメントが2つ関連付け・伝播までされていることを確認します。

TGW_3

TGW_4

正しく設定されていれば、「ルート」タブで各VPCのCIDRのルートがアクティブになっています。

TGW_5

EC2が配置されているサブネットのルートテーブル編集

TGWのルートテーブルに設定があっても、EC2のサブネット側で互いのVPCへのルーティングを設定しなければ接続が出来ません。

VPC1のサブネットルートテーブル設定
VPCのコンソールからルートテーブルを設定します。
対象のルートテーブルを選択し、「ルート」タブで「ルートを編集」を押下します。

EC2_VPC1_Route_1

対向VPCのCIDR(172.17.0.0/16)を送信先に設定し、ターゲットをTGWとして作成されたTGWを選び保存します。
これで172.17.0.0/16宛ての通信はTGWを経由することとなります。

EC2_VPC1_Route_2

VPC2のサブネットルートテーブル設定
同じように対向側の設定を入れます。

EC2_VPC2_Route_1

EC2_VPC2_Route_2

EC2同士の通信確認(ping)※成功すること

VPC1のインスタンスからVPC2へのping

PING_1_to_2_succ

VPC2のインスタンスからVPC1へのping

PING_2_to_1_succ

パケットロスが0%となり、ping応答が返ってくるようになりました。
東京リージョンはTGW経由で互いのEC2インスタンスが通信できることを確認できたため準備完了です。

大阪リージョン

VPC

VPCのリソースマップ
CGWとなるVyOS用のインスタンスを配置するパブリックサブネットと稼働確認用のオンプレサーバに見立てたEC2を配置するプライベートサブネット及び各ルートテーブルが存在することを確認します。

OSAKA_VPC_1

稼働確認用EC2へSSMセッションマネージャ経由でログイン確認

「OnPremServer」のインスタンスにログイン確認をします。

ONP_EC2_1

ONP_EC2_2

ログインができたら、VyOS用のインスタンスのプライベートIPへpingを飛ばしてみます。
セキュリティグループでICMPを許可しているため、疎通が取れることを確認します。

ONP_EC2_3

VyOSのEC2セキュリティグループを編集

デプロイ段階でVyOSのインバウンドルールは、自身が属すVPCからのping接続のみを許可している状態です。
VyOSへのログインはSSHとキーペアを使用してローカルPCのターミナルから実施するため、マイIPからのSSHを許可します。
※Windows利用の場合はTera Term等を使用してSSH接続を行います。

VyOS用のセキュリティグループで該当ローカルからのICMPのみ許可されていることを確認し、「インバウンドのルールを編集」を押下

VYOS_SG_1

マイIPからのSSHを許可する設定を追加

VYOS_SG_2

キーペアの確認・ローカルへのファイル作成

今回VyOS用のインスタンスのキーペアはSSMパラメータストアへ保管するような設定を入れてあります。
該当のパラメータを確認し、鍵情報をローカルPCの任意の場所にコピーします。

CloudFormationスタックの出力からキーペアのパラメータ名を確認

osaka_stack_1

SSMパラメータストアで該当のパラメータを選択

SSM_P_1

「複合化された値を表示」して値を取得

SSM_P_2

ローカルの任意のフォルダに鍵ファイルを作成し、パラメータの値を貼り付け保存
ファイル名は任意ですが「.pem」で作成します。

vi key.vyos.pem

SSH実行可能とするためファイルの権限を「400」とします。
他ユーザの読み取り権限があるとエラーとなります。

chmod 400 key.vyos.pem

VyOSへのSSH接続確認

VyOSに接続します。
コマンドは以下となります。
ssh -i <キーファイル名> vyos@<EC2のパブリックIP>

今回の場合は以下のコマンドで接続します。

ssh -i key.vyos.pem vyos@15.168.xxx.xxx

初回接続確認に「yes」応答をします。

The authenticity of host '15.168.xxx.xxx (15.168.xxx.xxx)' can't be established.
ED25519 key fingerprint is SHA256:xxxxxxxxxxxxxxxxxxxxxxxx.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? 

接続に成功すると以下のようなVyOSのプロンプトが返ってきます。

Welcome to VyOS!

   ┌── ┐
   . VyOS 1.4.3
   └ ──┘  sagitta

 * Documentation:  https://docs.vyos.io/en/sagitta
 * Project news:   https://blog.vyos.io
 * Bug reports:    https://vyos.dev

You can change this banner using "set system login banner post-login" command.

VyOS is a free software distribution that includes multiple components,
you can check individual component licenses under /usr/share/doc/*/copyright
vyos@ip-172-20-0-106:~$ 

CDKデプロイ後の確認は以上です。いよいよSite-to-Site VPNを手動で設定します。

Site-to-Site VPN構築

東京リージョンのVPCのコンソールでVPN接続を設定していきます。

カスタマーゲートウェイ作成

仮想プライベートネットワーク(VPN)の配下にある「カスタマーゲートウェイ」の設定から、「カスタマーゲートウェイを作成」を押下

CGW_1

任意の名前とIPアドレスを設定。IPアドレスは大阪のVyOSインスタンスの「パブリックIP」を入力。他はデフォルトのまま

CGW_2

Nameタグが自動で入っていることを確認し「カスタマーゲートウェイを作成」を押下

CGW_3

作成後、状態が「利用可能」となることを確認

CGW_4

VPN接続作成

「Site-to-Site VPN接続」の設定から、「VPN 接続を作成する」を押下

VPN_1

各設定を入力

  • 名前タグ: 任意
  • ターゲットゲートウェイ: TGW
    • 作成した既存のTGWを選択
  • カスタマーゲートウェイ: 既存
    • 作成したCGWを選択

VPN_2

今回はBGPを使ったルーティングを試すためその他設定はデフォルトのまま進みます。

VPN_3

タグを確認し「VPN 接続を確認する」を押下

VPN_4

VyOSのVPN設定投入

ここが肝です。VyOS1.4の設定内容が過去のものと変わっていたためこの設定を作るのに苦労しました。
まずVPNを選択の上でトンネル詳細のステータスがダウンしていることを確認し、右上の「設定をダウンロードする」を押下します。
VyOS側にまだVPN設定が入っていないため、この時点ではトンネルが開通していません。

設定サンプルのダウンロード

VPN_5

ベンダーは「Vyatta」を選択し、「ダウンロード」を押下

VPN_6

ダウンロードしたファイルをお好きなエディタで開く
この設定はあくまでサンプルで最新バージョンのVyOSにはそのまま使うことはできません。
新しい設定構文に書き換える必要があります。

ファイルを開くと「!」でコメントアウトされた行と実際の設定行が確認できます。
トンネル2つ分の設定例が入っており、一部の設定は共通設定のため不要な行も存在します。
このファイルから設定に必要な情報を取得します。

2025年8月時点で取得可能な設定ファイルの必要な情報の行数と設定部分を以下に表します。
※設定ファイルが更新された場合は行数が前後する可能性があります。

行数(L=Lines) 該当の設定 備考
L41 set vpn ipsec site-to-site peer 3.112.xxx.xxx(トンネル1の外部IP) authentication pre-shared-secret 'xxxxxxx' トンネル1の外部IP及び事前共有キーシークレット
L78 set interfaces vti vti0 address '169.254.xxx.xxx/30' トンネル1のVTIアドレス
L100-103 set protocols bgp 65000 neighbor 169.254.xxx.xxx・・・(略) トンネル1のBGP neighborのIPアドレス
L135 set vpn ipsec site-to-site peer 13.230.xxx.xxx(トンネル2の外部IP) authentication pre-shared-secret 'xxxxxxx' トンネル2の事前共有キーシークレット
L172 set interfaces vti vti1 address '169.254.xxx.xxx/30' トンネル2のVTIアドレス
L194-197 set protocols bgp 65000 neighbor 169.254.xxx.xxx・・・(略) トンネル2のBGP neighborのIPアドレス

上記で取得した情報をもとに、新バージョンに適した設定を入れていきます。

私が接続に成功した最終的な設定テンプレートは以下となります。
この設定をベースに、★マークの部分を実際のIPの値や上記で取得した固有の情報に置き換えてください。
実際の設定を入れ込む際はコメントアウト行は削除してください。
以下では各種共通設定を登録した後、トンネル毎の設定を入れる順で記載しています。

! IKE Setting
set vpn ipsec ike-group AWS key-exchange 'ikev2'
set vpn ipsec ike-group AWS ikev2-reauth
set vpn ipsec ike-group AWS proposal 1 dh-group '14'
set vpn ipsec ike-group AWS proposal 1 encryption 'aes256'
set vpn ipsec ike-group AWS proposal 1 hash 'sha256'

! ESP Setting
set vpn ipsec interface 'eth0'
set vpn ipsec esp-group AWS lifetime '3600'
set vpn ipsec esp-group AWS mode 'tunnel'
set vpn ipsec esp-group AWS pfs 'enable'
set vpn ipsec esp-group AWS proposal 1 encryption 'aes256'
set vpn ipsec esp-group AWS proposal 1 hash 'sha256'
set vpn ipsec ike-group AWS dead-peer-detection action 'restart'
set vpn ipsec ike-group AWS dead-peer-detection interval '15'
set vpn ipsec ike-group AWS dead-peer-detection timeout '30'

! BGP Setting
set protocols bgp system-as '65000'
set protocols bgp address-family ipv4-unicast network ★172.20.0.0/16(デフォルトで0.0.0.0/0となっている想定だがここはVyOSのVPC CIDRを入力)

! Option
set vpn ipsec option disable-route-autoinstall

! Tunnel1 IKE Setting
set vpn ipsec site-to-site peer Tunnel1 authentication mode 'pre-shared-secret'
set vpn ipsec authentication psk Tunnel1 id '★3.112.xxx.xxx(トンネル1の外部IP from L41)'
set vpn ipsec authentication psk Tunnel1 secret '★xxxxxxxxx(トンネル1の事前共有キーシークレットfrom L41)'
set vpn ipsec site-to-site peer Tunnel1 authentication local-id '★172.20.0.106(VyOSのプライベートIP)'
set vpn ipsec site-to-site peer Tunnel1 authentication remote-id '★3.112.xxx.xxx(トンネル1の外部IP from L41)'
set vpn ipsec site-to-site peer Tunnel1 description 'VPC tunnel 1'
set vpn ipsec site-to-site peer Tunnel1 ike-group 'AWS'
set vpn ipsec site-to-site peer Tunnel1 local-address '★172.20.0.106(VyOSのプライベートIP)'
set vpn ipsec site-to-site peer Tunnel1 remote-address '★3.112.xxx.xxx(トンネル1の外部IP from L41)'
set vpn ipsec site-to-site peer Tunnel1 vti bind 'vti0'
set vpn ipsec site-to-site peer Tunnel1 vti esp-group 'AWS'

! Tunnel1 Interface(VTI) Setting
set interfaces vti vti0 address '★169.254.xxx.xxx/30(トンネル1のVTIアドレス from L78)'
set interfaces vti vti0 description 'VPC tunnel 1'
set interfaces vti vti0 mtu '1399'

! Tunnel1 BGP Setting
set protocols bgp neighbor ★169.254.xxx.xxx(トンネル1のBGP neighborのIPアドレス from L100-103) remote-as '64513'
set protocols bgp neighbor ★169.254.xxx.xxx(トンネル1のBGP neighborのIPアドレス from L100-103) address-family ipv4-unicast soft-reconfiguration inbound
set protocols bgp neighbor ★169.254.xxx.xxx(トンネル1のBGP neighborのIPアドレス from L100-103) timers holdtime '30'
set protocols bgp neighbor ★169.254.xxx.xxx(トンネル1のBGP neighborのIPアドレス from L100-103) timers keepalive '10'

! Tunnel2 IKE Setting
set vpn ipsec site-to-site peer Tunnel2 authentication mode 'pre-shared-secret'
set vpn ipsec authentication psk Tunnel2 id '★13.230.xxx.xxx(トンネル2の外部IP from L135)'
set vpn ipsec authentication psk Tunnel2 secret '★xxxxxxxxx(トンネル2の事前共有キーシークレット from L135)'
set vpn ipsec site-to-site peer Tunnel2 authentication local-id '★172.20.0.106(VyOSのプライベートIP)'
set vpn ipsec site-to-site peer Tunnel2 authentication remote-id '★13.230.xxx.xxx(トンネル2の外部IP from L135)'
set vpn ipsec site-to-site peer Tunnel2 description 'VPC tunnel 2'
set vpn ipsec site-to-site peer Tunnel2 ike-group 'AWS'
set vpn ipsec site-to-site peer Tunnel2 local-address '★172.20.0.106(VyOSのプライベートIP)'
set vpn ipsec site-to-site peer Tunnel2 remote-address '★13.230.xxx.xxx(トンネル2の外部IP from L135)'
set vpn ipsec site-to-site peer Tunnel2 vti bind 'vti1'
set vpn ipsec site-to-site peer Tunnel2 vti esp-group 'AWS'

! Tunnel2 Interface(VTI) Setting
set interfaces vti vti1 address '★169.254.xxx.xxx/30(トンネル2のVTIアドレス from L172)'
set interfaces vti vti1 description 'VPC tunnel 2'
set interfaces vti vti1 mtu '1399'

! Tunnel2 BGP Setting
set protocols bgp neighbor ★169.254.xxx.xxx(トンネル2のBGP neighborのIPアドレス from L194-197) remote-as '64513'
set protocols bgp neighbor ★169.254.xxx.xxx(トンネル2のBGP neighborのIPアドレス from L194-197) address-family ipv4-unicast soft-reconfiguration inbound
set protocols bgp neighbor ★169.254.xxx.xxx(トンネル2のBGP neighborのIPアドレス from L194-197) timers holdtime '30'
set protocols bgp neighbor ★169.254.xxx.xxx(トンネル2のBGP neighborのIPアドレス from L194-197) timers keepalive '10'

設定項目の補足

  • IKE (Internet Key Exchange)

    • VPNトンネル確立時の通信の暗号化キー交換プロトコル
    • VPN接続時のトンネルの認証と暗号化パラメータを決定
    • サンプルファイルはプロトコルが古く鍵長が短かったためセキュリティ強化のためドキュメントを参考により複雑なものに変更
  • ESP (Encapsulating Security Payload)

    • IPSecでやりとりされる「データ」を暗号化・認証するプロトコル
    • 実際のデータ通信の保護を担当
    • こちらも同様にセキュリティ強化した設定を追加
  • VTI (Virtual Tunnel Interface)

    • VPNトンネルを仮想インターフェースとして扱う機能
    • ルーティングやファイアウォール設定が容易になる
  • BGP (Border Gateway Protocol)

    • 異なるネットワーク間のルーティング情報を交換
    • この構成では東京・大阪間の経路情報を動的に学習する

環境固有の設定が完成したら、実際にVyOSに設定を入れます。

事前確認

設定前にshow ip routeコマンドでルートテーブルを確認しておきます。
VPCルーターを向くデフォルトゲートウェイと自身が属するプライベートサブネットのCIDRに関するルートしかないことがわかります。

vyos@ip-172-20-0-106:~$ show ip route
Codes: K - kernel route, C - connected, S - static, R - RIP,
       O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP,
       T - Table, v - VNC, V - VNC-Direct, A - Babel, F - PBR,
       f - OpenFabric,
       > - selected route, * - FIB route, q - queued, r - rejected, b - backup
       t - trapped, o - offload failure

S>* 0.0.0.0/0 [210/0] via 172.20.0.1, eth0, weight 1, 03:53:39
C>* 172.20.0.0/24 is directly connected, eth0, 03:53:39
vyos@ip-172-20-0-106:~$ 

show interfacesコマンドでインターフェース情報も見ておきます。
eth0とループバックアドレスの設定が表示されます。

vyos@ip-172-20-0-106:~$ show interfaces 
Codes: S - State, L - Link, u - Up, D - Down, A - Admin Down
Interface    IP Address       MAC                VRF        MTU  S/L    Description
-----------  ---------------  -----------------  -------  -----  -----  -------------
eth0         172.20.0.106/24  0e:fe:bd:a2:fc:3f  default   1500  u/u
lo           127.0.0.1/8      00:00:00:00:00:00  default  65536  u/u
             ::1/128
vyos@ip-172-20-0-106:~$ 

show ip bgpでBGPの設定も確認します。設定を入れていないためまだありません。

vyos@ip-172-20-0-106:~$ show ip bgp
Default BGP instance not found

設定投入
VyOSに設定を入れていきます。

configureでコンフィグモードにします。
「[edit]」と表示されれば設定を入れていくことが可能です。

vyos@ip-172-20-0-106:~$ configure 
[edit]
vyos@ip-172-20-0-106# 

固有の設定を反映したテンプレートの内容をコピーして貼り付けます。

ペーストした後に「[edit]」と表示されれば投入が成功しています。
構文が誤っている場合はエラーメッセージが表示されます。

vyos@ip-172-20-0-106# set vpn ipsec ike-group AWS key-exchange 'ikev2'
[edit]
vyos@ip-172-20-0-106# 

全ての設定を入れ終えたら、commitsaveコマンドを実行し保存します。

vyos@ip-172-20-0-106# commit
[edit]
vyos@ip-172-20-0-106# save
[edit]

設定モードをexitで抜けます。

vyos@ip-172-20-0-106# exit
exit

設定後確認

ルートテーブルを確認します。
トンネルの内部IPがルーティングに追加されていることがわかります。

vyos@ip-172-20-0-106:~$ show ip route
Codes: K - kernel route, C - connected, S - static, R - RIP,
       O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP,
       T - Table, v - VNC, V - VNC-Direct, A - Babel, F - PBR,
       f - OpenFabric,
       > - selected route, * - FIB route, q - queued, r - rejected, b - backup
       t - trapped, o - offload failure

S>* 0.0.0.0/0 [210/0] via 172.20.0.1, eth0, weight 1, 04:20:03
C>* 169.254.xxx.x0/30 is directly connected, vti1, 00:02:50 ★追加された
C>* 169.254.xxx.xx6/30 is directly connected, vti0, 00:02:49 ★追加された
C>* 172.20.0.0/24 is directly connected, eth0, 04:20:03
vyos@ip-172-20-0-106:~$ 

インターフェースを確認します。
vti0とvti1が追加されており、ステータス(S/L)がUP(u/u)状態となっていることがわかります。

vyos@ip-172-20-0-106:~$ show interfaces 
Codes: S - State, L - Link, u - Up, D - Down, A - Admin Down
Interface    IP Address          MAC                VRF        MTU  S/L    Description
-----------  ------------------  -----------------  -------  -----  -----  -------------
eth0         172.20.0.106/24     0e:fe:bd:a2:fc:3f  default   1500  u/u
lo           127.0.0.1/8         00:00:00:00:00:00  default  65536  u/u
             ::1/128
vti0         169.254.xxx.xxx/30  n/a                default   1399  u/u    VPC tunnel 1 ★追加された
vti1         169.254.xxx.xxx/30  n/a                default   1399  u/u    VPC tunnel 2 ★追加された
vyos@ip-172-20-0-106:~$ 

BGPを確認します。
まだVPNをTGWのルートテーブルに紐づけていないため、ローカルのIPしか確認できません。

vyos@ip-172-20-0-106:~$ show ip bgp
BGP table version is 1, local router ID is 172.20.0.106, vrf id 0
Default local pref 100, local AS 65000
Status codes:  s suppressed, d damped, h history, * valid, > best, = multipath,
               i internal, r RIB-failure, S Stale, R Removed
Nexthop codes: @NNN nexthop's vrf id, < announce-nh-self
Origin codes:  i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found

    Network          Next Hop            Metric LocPrf Weight Path
 *> 172.20.0.0/16    0.0.0.0                  0         32768 i

Displayed  1 routes and 1 total paths
vyos@ip-172-20-0-106:~$ 

VPNトンネルの確認

ではコンソールでトンネルの状況を確認しましょう。

VPN_7

先ほどダウン状態だったトンネルが両方アップとなっています!
これでカスタマーゲートウェイとのVPNトンネルが通りました。

TGWのルートテーブル設定

次にTGWのルートテーブルにVPN接続に関するルートを追加します。

Site-to-Site VPNを作成した段階で、VPN用のTGWアタッチメントが自動で生成されています。

VPNアタッチメントの確認

TGW_6

TGWルートテーブルの関連付けを作成

TGW_7

VPN用のアタッチメントを選択して関連付けを作成する

TGW_8

TGWルートテーブルの伝播を作成
アタッチメントを関連付けただけでは通信できません。伝播を設定して動的にルーティングを行います。

TGW_9

VPN用のアタッチメントを選択して伝播を作成する

TGW_10

伝播を作成すると自動で「ルート」タブのルーティングで大阪リージョンのVPCのCIDRが紐付けられる

TGW_11

VyOSのルート確認

VyOSのルートテーブルを確認してみます。
「B」がBGPで学習したルート情報ですが、東京側のVPCのCIDRへのルートが追加されていることがわかります!

vyos@ip-172-20-0-106:~$ show ip route
Codes: K - kernel route, C - connected, S - static, R - RIP,
       O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP,
       T - Table, v - VNC, V - VNC-Direct, A - Babel, F - PBR,
       f - OpenFabric,
       > - selected route, * - FIB route, q - queued, r - rejected, b - backup
       t - trapped, o - offload failure

S>* 0.0.0.0/0 [210/0] via 172.20.0.1, eth0, weight 1, 04:51:06
C>* 169.254.xxx.x0/30 is directly connected, vti1, 00:33:53
C>* 169.254.xxx.xx6/30 is directly connected, vti0, 00:33:52
B>* 172.16.0.0/16 [20/100] via 169.254.xxx.xxx, vti1, weight 1, 00:08:12 ★追加された
  *                        via 169.254.xxx.xxx, vti0, weight 1, 00:08:12 ★追加された
B>* 172.17.0.0/16 [20/100] via 169.254.xxx.xxx, vti1, weight 1, 00:08:12 ★追加された
  *                        via 169.254.xxx.xxx, vti0, weight 1, 00:08:12 ★追加された
C>* 172.20.0.0/24 is directly connected, eth0, 04:51:06

BGPの設定を見てみます。こちらでも東京VPCの経路が追加されていることがわかります!

vyos@ip-172-20-0-106:~$ show ip bgp
BGP table version is 5, local router ID is 172.20.0.106, vrf id 0
Default local pref 100, local AS 65000
Status codes:  s suppressed, d damped, h history, * valid, > best, = multipath,
               i internal, r RIB-failure, S Stale, R Removed
Nexthop codes: @NNN nexthop's vrf id, < announce-nh-self
Origin codes:  i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found

    Network          Next Hop            Metric LocPrf Weight Path
 *= 172.16.0.0/16    169.254.xxx.xxx        100             0 64513 i ★追加された
 *>                  169.254.xxx.xxx        100             0 64513 i ★追加された
 *= 172.17.0.0/16    169.254.xxx.xxx        100             0 64513 i ★追加された
 *>                  169.254.xxx.xxx        100             0 64513 i ★追加された
 *> 172.20.0.0/16    0.0.0.0                  0         32768 i

Displayed  3 routes and 5 total paths
vyos@ip-172-20-0-106:~$ 

各EC2サブネットのルートテーブルを編集

では最後、疎通確認に入ります。

まず、事前にまだ疎通ができないことを確認しながら各種疎通確認用のルートテーブルを編集します。

東京リージョン

VPC1のインスタンス→大阪オンプレミス用EC2への疎通確認

PING_VPC1_to_ONP

VPC2のインスタンス→大阪オンプレミス用EC2への疎通確認

PING_VPC2_to_ONP

VPC1のプライベートサブネットのルートテーブルを編集

EC2_VPC1_Route_3

大阪リージョンのVPC CIDR宛ての通信ターゲットをTGWへ設定し保存

EC2_VPC1_Route_4

VPC2のプライベートサブネットのルートテーブルを編集

EC2_VPC2_Route_3

大阪リージョンのVPC CIDR宛ての通信ターゲットをTGWへ設定し保存

EC2_VPC2_Route_4

大阪リージョン

オンプレミスのサーバに見立てた稼働確認用インスタンス→東京の各EC2への疎通確認
どちらもパケットロスとなり失敗しています。

PING_ONP_to_tokyo

EC2インスタンスが存在するプライベートサブネットのルートテーブルを編集

ONP_Route_1

東京側の各VPCへの宛先ターゲットをVyOSのEC2インスタンスに設定

ONP_Route_2

疎通確認

それでは最終確認です!

東京リージョン

VPC1のインスタンス→大阪オンプレミス用EC2への疎通確認

PING_VPC1_to_ONP_2

VPC2のインスタンス→大阪オンプレミス用EC2への疎通確認

PING_VPC2_to_ONP_2

無事ping応答が返ってきます!!

大阪リージョン

オンプレミスのサーバに見立てた稼働確認用インスタンス→東京の各EC2への疎通確認

PING_ONP_to_tokyo_2

こちらも問題なさそうですね!
これで一通りの設定・疎通確認は完了です。

後片付け

手動で作成したリソースを削除し、その後CDKスタックを削除します。

東京リージョン

Site-to-Site VPN接続を削除
VPN接続を選択し「アクション」から「VPN 接続を削除する」を選択

DEL_1

「削除」と入力し右下の削除ボタンを押下

DEL_2

削除済みになったことを確認

DEL_3

カスタマーゲートウェイ削除
同じように「アクション」から「カスタマーゲートウェイを削除」を選択

DEL_4

「削除」と入力し右下の削除ボタンを押下

DEL_5

削除済みになったことを確認

DEL_7

VPN接続を削除するとTGWのVPN用アタッチメントも自動で削除される

DEL_8

TGWのルートテーブルからも消えている

DEL_9

この状態になったらスタックを削除します。

東京リージョンのスタックを削除

DEL_10

DEL_11

大阪リージョン

大阪リージョンのスタックを削除

DEL_12

DEL_13

サブスクリプションの削除(必要に応じて)

検証が完了し、もうVyOSのイメージを起動しない場合はサブスクリプションを忘れずにキャンセルします。

MarketplaceのコンソールでVyOSの製品名を押下

sub_1

製品情報を確認できるため契約を選択し「詳細を表示」を押下

sub_2

「アクション」から「サブスクリプションをキャンセル」を押下

sub_3

「確認」を入力しキャンセル手続きを終わらせる

sub_4

終わりに

最も手こずったのはVyOSの新設定でした。
今後も更新が入ると思うので、最新情報をドキュメントから確認して試してみていただければと思います。
この記事が少しでもSite-to-Site VPNの設定を試してみたい方の参考になったら幸いです!

この記事をシェアする

facebookのロゴhatenaのロゴtwitterのロゴ

© Classmethod, Inc. All rights reserved.