クラウドインテグレーション部クラウドソリューション2課の川井です。
今回は、AWSの Sit-to-Site VPN(以降、AWS VPN)と VPNデバイスの FortiGateを使用して、IPsecVPNで 両サーバー間の接続をさせてみようと思います。
また、ネットワーク間の接続は動的ルーティングのBGPを使用します。
最後に、テスト検証として AWS側に仮想PCとしてWindowsサーバを立てて、そこから FortiGate内のInternalのIPアドレスにVPN経由で接続出来るか確認していきます。
構築する上で、1点注意点がございます。
FortiGateに関して実機を所持していませんので、Amazon EC2インスタンスのイメージとして、AWSが提供している FortiGateのAMIを使用してEC2を起動して、FortiGateは代用していきます(多少の差異はありますが、殆ど実機と遜色ありませんので問題ないと思います)
構成は以下の通りとなります。
本来であれば、プライベートサブネットに仮想PCを配置し接続させるべきですが、
今回は検証なので、全てのリソースをパブリックサブネットに配置させていただきます。
各サーバの配置箇所は FortiGateインスタンスを東京リージョンに、AWS VPNをバージニア北部に配置していきます。
また、バージニア北部には 仮想PCに見立てた Windowsサーバも配置して、VPNを通って FortiGateインスタンスに接続できるか試していきます。
それでは、まずFortiGateインスタンスの構築をしていきます。
※VPC、サブネット、インターネットゲートウェイ、セキュリティグループなどの作成は省略致します。
AWS マネジメントコンソールにログインし、EC2ダッシュボードに移動し、「インスタンスの起動」をクリックします。
AmazonマーケットプレイスからFortiGateの仮想ファイアウォールのAMIを検索します。
例: 「FortiGate」または「Fortinet」で検索して、FortiGateのイメージを選択します。(ARM64/Gravitonの方が値段が安いのでおすすめです)
FortiGateのパフォーマンスに合ったインスタンスタイプ(例: c5.largeなど)を選択します。
FortiGateの推奨インスタンスタイプに従ってください。
今回は「t4g.large」にしましたが、スペックが低いため CPU使用率が高騰し、操作性が低下していました。
快適に使用するためには、最低でも「c6g.large」以上を選択することをお勧めします。
OSの中に入ることはないので「キーペアはなし」を指定します。
ネットワーク設定には以下の情報を入力します。
VPCやサブネット:FortiGateインスタンスが配置されるネットワークセグメントを指定します。
※パブリックサブネットに配置します。
パブリックIPアドレスの自動割り当て:有効にします
セキュリティグループ:作成したものを選択します(ログインするためのインターフェイスなので、セキュリティグループの受信許可ポートは80番と443番だけで問題ありません)
それ以外の設定値はDefaultのものを設定しています。またVPNの接続のためにしか使用しないので、
IAMロールの付与もしていません。これでインスタンスを起動します。
※補足
EC2を起動した際に作成されるインターフェイスにも「Elastic IP」を付与する事をおすすめします。
一旦EC2を停止した後に起動すると、追加したインターフェースにElastic IPが付与されている場合、既存のインターフェイスにパブリックIPが付与されなくなってしまいます。
次に、FortiGateインスタンスに VPN用のインターフェイスを追加するため、新しいネットワークインターフェイスを作成します。EC2インスタンスが起動した際に自動で作成されるインターフェイスはログインの際に使用しているため、別途VPN用のインターフェイスを作成します。
EC2ダッシュボードに移動し、左側メニューの「ネットワークインターフェイス」をクリックします。
「ネットワークインターフェイスの作成」をクリックし、以下の情報を入力します。
サブネット: FortiGateの追加インターフェイスを接続するサブネットを選択します。
※先程作成したFortiGateインスタンスと同じサブネット指定します。
プライベートIPアドレス: 自動割り当てを選択します(カスタムでも問題ありません)
後はDefault値で設定しています。
作成したネットワークインターフェイスをFortiGateインスタンスにアタッチします。
作成したFortiGateインスタンスを選択し、「アクション」 > 「ネットワーキング」 > 「インターフェースをアタッチ」を選択します。
FortiGateインスタンスを選択して、作成したインターフェイスをアタッチします。
次に、追加したインターフェイスにElastic IPを割り当てます。 AWS側でオンプレ側のグローバルIPアドレスを指定するので、
「グローバルの"固定"IPアドレス」が必要になります。
したがって、VPN用に追加したインターフェースにはElastic IPを割り当てます。
EC2ダッシュボードの左側メニューから「Elastic IP」を選択し、「Elastic IPの割り当て」をクリックします。
必要項目を入力して割り当てをクリックすると、Elastic IPが作成されます。
※Nameタグをつけて作成すると自分が作ったものがどれか判別しやすいのでおすすめです。
割り当てたElastic IPを選択し、「アクション」 > 「アドレスの関連付け」をクリックし、以下の情報を入力します。
リソースタイプ:「ネットワークインターフェース」を選択します
ネットワークインターフェース:先程作成したネットワークインターフェイスを選択します
プライベートIPアドレス:好きなIPアドレス指定します。
そして、「関連付け」をクリックして、Elastic IPをネットワークインターフェイスに関連付けます。
これでFortiGateインスタンスの構築は完成です。
※補足
VPN側で使用するインターフェイスのセキュリティグループについてですが、AWS VPNの外部IPアドレスとBGPピアで使用するIPアドレスの許可が最低限必要です。
そのため、一旦広い範囲で許可設定したセキュリティグループを付与していただき、AWS VPNの外部IPアドレスとBGPピアで使用するIPアドレス分かり次第、許可範囲絞っていただければと思います。どちらも、この後の「VPN 接続の構築」が完了すれば確認できます。
作成したFortiGateインスタンスに、パブリックIPでFortiGateのダッシュボードへ接続します。
https://[パブリックIPアドレス]
この構成ですと パブリックIPが2つ付与されていますので、EC2インスタンスのインスタンス概要画面で「パブリック IPv4 アドレス」に記載されている方のIPアドレスで接続します。基本的には、EC2を起動した際に自動的に付与されるインターフェイスのパブリックIPが選択されているはずです。
まず、接続すると このような画面になりますが FortiGateにインストールされている ローカルCA証明書が信頼できるものと認識出来ないために表示されるものです。表示させたくない場合は、FortiGateからローカルCAのルート証明書をPCにインポートしてください。
「詳細設定」をクリックすれば、「パブリックIPアドレスに進む」で表示されるのでクリックします。
接続すると、username と password を求められるので、
username:admin(全員共通)
password:インスタンスID(作成したEC2インスタンスのインスタンスIDをそのまま入力)
問題なくログインが出来れば、初期パスワード変更や初期セットアップ画面になるので実施していきますと、
無事FortiGateのダッシュボードにログインできます。
以降では、AWS VPNの構築をしていきます。
※VPC、サブネット、インターネットゲートウェイなどの作成は省略致します。
AWSの「カスタマーゲートウェイ」とは、AWSにおいて、オンプレミスのVPNデバイス(今回で言えばFortigateインスタンス)の情報を登録するエンティティとして機能するものです。カスタマーゲートウェイをAWSに設定することで、AWS側はオンプレミスのどのデバイス(IPアドレス)とVPN接続を行うかを認識できるようになり、これにより、オンプレミス側のデバイスがAWSの仮想プライベートゲートウェイと安全に接続できるようになります。
少し勘違いしやすいですが、AWSの「カスタマーゲートウェイ」は物理的なハードウェアではなく、AWS側に論理的に定義された設定項目であり、オンプレミスのデバイスを指し示すためのものです。この設定をAWS上に作成することで、オンプレミスのVPNデバイスがAWS側で認識され、相互に通信するためのトンネルが設定されます。
AWSの「仮想プライベートゲートウェイ」とは、AWS Virtual Private Cloud(VPC)とオンプレミスのネットワーク間でVPN接続を確立するためのゲートウェイです。 仮想プライベートゲートウェイの役割は、AWSのVPCにおけるネットワークトラフィックの入口・出口の役割を果たします。オンプレミスや他のネットワークからAWSのVPCにトラフィックをルーティングする際に、仮想プライベートゲートウェイがその中継ポイントとして機能します。
次からは、AWS VPNに必要な各リソースの構築をしていきます。
AWS カスタマーゲートウェイを設定するための手順は以下の通りです。
まず、AWSとVPN接続を確立するために、オンプレミスのルーターやファイアウォールなどのデバイスを準備します。今回はFortiGateインスタンスがその役割を担います。このデバイスがカスタマーゲートウェイとして機能します。
サポートされているデバイスは、Cisco、Juniper、FortinetなどのVPN対応の物理デバイスや仮想アプライアンスが使用できます。また、カスタマーゲートウェイには、インターネット経由でアクセスできる固定のグローバルIPアドレスが必要です。このIPアドレスは、カスタマーゲートウェイの設定時に指定します。
AWSコンソールにログインし、VPCダッシュボードに移動します。 左メニューから「カスタマーゲートウェイ」を選択し、「カスタマーゲートウェイを作成」ボタンをクリックします。そして以下の設定項目を入力します。
名前: カスタマーゲートウェイの名前を入力します。
BGP ASN: オンプレ側で使用するBGP(Border Gateway Protocol)のAS番号を指定します。
IPアドレス: オンプレミス側(Fortigateインスタンス)の固定グローバルIPアドレスを入力します。
デバイス:デバイス名入力します(好みで好きなように入力)
問題なく作成されると、状態が「利用可能」になります。
AWS 仮想プライベートゲートウェイを設定するための手順は以下の通りです。
次に、AWS側でVPN接続を確立するためのエンドポイントである仮想プライベートゲートウェイを作成します。 VPCダッシュボードの左側メニューから「仮想プライベートゲートウェイ」を選択し、「仮想プライベートゲートウェイの作成」ボタンをクリックします。そして以下の設定項目を入力します。
名前:仮想プライベートゲートウェイの名前を入力します。
自律システム番号 (ASN):AWS側で使用するAS番号を入力します(デフォルトでも問題ありません)
作成した仮想プライベートゲートウェイを選択し、「アクション」 > 「VPCへアタッチ」を選択します。
続いて、仮想プライベートゲートウェイを配置するVPCを選択します。
アタッチされると状態が「アタッチ済み」になります。
次は、オンプレミスの機器と VPC 間の安全な接続確立するためのリソースを作成します。
VPCダッシュボードの左側メニューから「Site-to-Site VPN 接続」 > 「VPN接続を作成する」を選択します。
そして以下の設定項目を入力します。
名前:AWS VPN接続の名前を入力します。
ターゲットゲートウェイ: 仮想プライベートゲートウェイ選択します。
※先程作成した仮想プライベートゲートウェイを選択します。
カスタマーゲートウェイ: 既存を選択して、先程作成したカスタマーゲートウェイを選択します。
ルーティングオプション: 動的(BGP が必要)を選択します。
ローカルIPv4 ネットワーク CIDR:カスタマーゲートウェイ側の IPv4 CIDR 範囲を指定します。
リモートIPv4 ネットワーク CIDR:AWS側の IPv4 CIDR 範囲を指定します。
トンネル オプション:VPNで使用するIP、事前共有キー、暗号化方式などの指定します。
※今回は検証なので、許可したいIPの制限や指定したい暗号化方式などはないので、ネットワークCIDRやトンネルオプションは全てDefault値を使っていきます
作成には少し時間を要しますが、問題なく作成されると状態が「利用可能」になります。
現状のVPNのTunnel状態を確認する為、先程作成した「vpn接続」を選択して「トンネルの詳細」をクリックします。
Tunnel:冗長の為、2本のトンネルが作成されています。
外部IPアドレス:AWS側がIPsec終端で使用するIPアドレスです(下記の画像ではマスキングしているため見えていません)
内部 IPv4 CIDR:BGPピアのIPアドレスで使用されるIP範囲です。
カスタムで指定したい場合は、下記のドキュメントを参考にして使用出来るIP範囲と値を確認して下さい。
https://docs.aws.amazon.com/ja_jp/vpn/latest/s2svpn/VPNTunnels.html
ステータス:FortiGate側でIPsecの設定をしていないので「ダウン」の状態になっています。
詳細:こちらも同様にFortiGate側の設定をしていないので「IPSEC IS DOWN」になっています。
ルートの学習はBGPを使用しますので、ルートテーブルにてルート伝播の設定を行います。
この設定を行うと、仮想プライベートゲートウェイがオンプレ側のルート情報をBGPで学習した後に、仮想プライベートゲートウェイからルートテーブルにルート情報が伝播され、自動的にルーティング先が学習されます。
個人的には実際の物理サーバでどういう設定がされているのかが気になりました。ルート伝播の有効化をするだけでBGPのルートが学習できるというのは、プレフィックスリストで許可設定が行われているからなのでしょうか。
話はそれましたが、ルートテーブルのルート伝播の設定は、VPCでもサブネットでも問題ありません。
BGPのルートを学習させたい場所に関連付けられているルートテーブルを選択して、 「アクション」 > 「ルート伝播の編集」を選択します。そして以下の箇所を「有効化」します。
これで基本的にはAWS VPN側の設定は終了です。続いてはFortiGate側の設定を行っていきます。
※注意点として、今回はVPNで接続ができ、BGPでルートが学習できる最低限の設定をしていきます。
なので、DNS、NAT変換、リンクモニター、プレフィックスリストやASパスリスト DHCPやデフォルトゲートウェイ、UTMなどの
設定は行いませんのでご了承ください。
また、FortiGateの構築は GUIベースではなく FortiGateのCLIコンソールを使用して構築していきます。
FortiGateインスタンス側の設定を行いますが、その前にAWS側で各ベンダーのサンプルコンフィグファイルをダウンロードできますので、VPN接続の設定情報をダウンロードして、こちらの情報を基にオンプレミス側のデバイスを設定を行います。
AWSのVPN接続ページから「設定をダウンロード」をクリックし、デバイスごとの設定ガイドをダウンロードします。
FortiGateの場合は 下記の項目で問題ありません。
サンプルコンフィグを使用して設定を行っても問題ありませんが、環境に応じた多少の改変が必要だと思います。
そのため、今回サンプルコンフィグで確認するのは「事前共有キーの値」と「BGPピアのIPアドレス」だけです。設定の参考にはなりますので、FortiGateの設定に慣れてない方はこれを参考に設定を行っていただければ思います。
サンプルコンフィグの具体的な説明については省略させていただきます。
FortiGateインスタンスにログインした後、左側メニューから「インターフェイス」を選択します。 使用できるインターフェイスは、
以下のPort1と2の2つだけです。これは、EC2起動時に作成されたものと今回VPN用に作成したインターフェイスしかないので当然ですね。
Port2の方をVPNで使用します。そのため、Port2にIPsecの設定を行います。
IPsecの設定GUIベースでは、左側メニューから「VPN」 > 「IPsecトンネル」を選択しますが、
先程も記載した通り、今回はCLIベースで作成していきますので、FortiGateのCLIコンソールを使用して構築していきます。
FortiGateのCLIコンソールは右上の下記の赤枠をクリックすれば起動します。
では、Port2に IPsecとTunnelインターフェイスの設定を一気にいれていきます。細かい詳細は省いていきますが、
確認が必要なところはコメントをいれています。また、以下のコマンドは1つのトンネルに対してのIPsecVPNの設定になりますので、2つ目のトンネル作成したい場合は、同様にもう一つIPsecVPNの設定を追加する必要があります。
以下のコマンドは、AWS側で言うと「Tunnel1」にIPsecVPNを接続させる設定です。 Tunnelごとに外部IPアドレスや事前共有キー、BGPピアのIPアドレスが異なりますので「Tunnel2」用に設定する際はご注意ください。また「Tunnel2」用の設定について省略しています。
## IPsecのフェーズ1の設定
config vpn ipsec phase1-interface
edit "Tunnel1"
set interface "port2" # Port2を指定します
set ike-version 2 # IKEはバージョン2を選択します
set keylife 28800
set peertype any
set net-device disable
set authmethod psk
set proposal aes256-sha256 # 暗号化方式に関して対抗のAWS VPNにあるものを指定します
set dhgrp 2 # DHグループは2を指定します
set nattraversal disable
set remote-gw ××.××.××.×× # AWS VPNの外部IPアドレスを記載します
set packet-redistribution disable
set psksecret "*********************" # サンプルコンフィグに記載あり
next
end
## IPsecのフェーズ2の設定
config vpn ipsec phase2-interface
edit "Azure-VPN-GW-Primary"
set phase1name "Tunnel1" # 1つ前に作成したフェーズ1を指定します
set proposal aes256-sha256 # 暗号化方式に関して対抗のAWS VPNにあるものを指定します
set pfs disable
set auto-negotiate enable
set keylifeseconds 27000
set src-subnet 0.0.0.0 0.0.0.0 # 制限を掛ける訳ではないのでDefault値を指定します
set dst-subnet 0.0.0.0 0.0.0.0 # 制限を掛ける訳ではないのでDefault値を指定します
next
end
## Tunnelインターフェイスの設定
config system interface
edit "Tunnel1"
set vdom "root"
set ip 169.254.151.210 255.255.255.255 # サンプルコンフィグに記載あり
set type tunnel # インスタンスタイプはTunnelを指定します
set remote-ip 169.254.151.209 255.255.255.255 # サンプルコンフィグに記載あり
set interface "port2" # Port2を指定します
next
end
ちなみに、事前共有キーは「VPN トンネルオプションを変更」からも確認はできます。また、 IPアドレスは トンネルの詳細から「内部 IPv4 CIDR」を確認して、基本的には若い番号をAWS側が使用します。
例えば、「169.254.140.28/30」だった場合、AWS側は「169.254.140.29」、オンプレ側は「169.254.140.30」を使用することになります。
※ IPsecを接続する上で注意することは、IKEのバージョンや暗号化方式、DHグループなどを対抗のAWS VPNと合わせる必要があることです。
ただし、今回はAWS VPN側のトンネル オプションはDefault値を使用しているため、 以下の画像からもわかる通り、ほぼ網羅されています。
そのため、設定が合わないことでトンネルが接続されないということはないとは思いますが、設定の際にはAWS側に設定された項目を確認していただくようご注意ください。
作成されると以下のように、IPsec Tunnelが作成されます。ステータスはまだダウン状態です。
また、インターフェイス画面で確認すると Port2にトンネルインターフェイスの設定が入っています。
IPsecトンネルの設定だけでは まだVPNの開通はしません。Firewallの設定を入れないと疎通が取れませんので、
Firewallポリシーを設定していきます。
GUIベースでは、「ポリシーオブジェクト」 > 「ファイアウォールポリシー」を選択します。CLIベースでは以下のコマンドを入れていきます。
今回、TunnelインターフェースとPort1で疎通が取れるように設定いれていきます。接続確認の際にFortiGateのPort1に設定しているInternalのIPアドレスに接続させるので、ここの疎通を許可しています。
config firewall policy
edit 1
set status enable
set name "LAB-1-to-AWS(Main)"
set srcintf "port1"
set dstintf "Tunnel1" # Tunnel1のトンネルインターフェイスを指定
set action accept
set srcaddr "all"
set dstaddr "all"
set schedule "always"
set service "ALL"
set logtraffic all
next
edit 2
set status enable
set name "AWS(Main)-to-LAB1"
set srcintf "Tunnel1" # Tunnel1のトンネルインターフェイスを指定
set dstintf "port1"
set action accept
set srcaddr "all"
set dstaddr "all"
set schedule "always"
set service "ALL"
set logtraffic all
next
end
※補足
この設定は、先程も記載した通り「Tunnel1」側だけの設定なので、「Tunnel2」用のFirewall設定も同様に追加する必要があります。
おそらく、これでステータスが変更されるはずです。アップされれば以下のようにステータスが「アップ」と表示されます。
これで繋がらない場合は、AWS側の外部IPアドレスや事前共有キー、BGPピアのIPアドレスが間違っていないかを確認してください。
その辺りも間違っていない場合は、下記のVPNトラブルシュートのコマンドをCLIコンソールで入力してエラー箇所を確認してください。
diag vpn ike log
diag debug app ike -1
diag debug enable
ちなみにAWS側は、まだステータスが「アップ」になっていないと思います。BGPの設定が完了すればステータスアップに変わるばずです。
最後にBGPの設定をしていきます。
GUIベースでは、「ネットワーク」 > 「BGP」を選択します。CLIベースでは以下のコマンドになります。
config router bgp
set as 65000 # Fortigate側で使用するAS番号(カスタマーゲートウェイで指定のと合わせる)
config neighbor
## AWS VPNのTunnel1 の設定
edit "169.254.151.209" # AWS VPN側のBGPピアのIPアドレス
set soft-reconfiguration enable
set remote-as 65010 # AWS VPN側で仮想プライベートゲートウェイで指定したもの
set update-source "Tunnel1" # Tunnel1のトンネルインターフェイスを指定
next
end
## 全てのルートをBGPで送る設定
config network
edit 1
set prefix 0.0.0.0 255.255.255.255
next
end
end
※補足
この設定は、先程も記載した通り「Tunnel1」側だけの設定なので「Tunnel2」用もBGP設定を入れる際には、IPアドレスなどを変えて同じように設定を入れる必要があります。
これで全ての設定が完了しましたので、ステータス確認をしていきます。
FortiGateインスタンスで「Tunnel1」と同様に「Tunnel2」のIPsecVPNの設定を行えば、以下の画像のように両トンネルでステータスが「アップ」になることが確認できます。
またBGPの設定がされていれば、AWS側もステータスが「アップ」になっているのが確認出来ると思います。また、詳細の箇所では「3 BGP ROUTES」となっており、オンプレ側からBGPで3つのルートが学習されている事が確認できます。
FortiGate側でも、BGPが問題なく設定されているか確認していきます。まずは、BGPテーブルから確認です。
AWS側のVPC「10.3.0.0/16」のルートを学習できていますね。
続いて、ルートテーブルを確認していきます。同じくAWS側のVPC「10.3.0.0/16」のルートが学習されています。
AWS側から伝えられたメトリック値がTunnel2の方が低いので、Tunnel2が優先されるルートとなっているようです。
ここから見てお分かり頂ける通り、FortiGate側からAWS環境への接続は「Tunnel2」が優先経路となっています。
しかし、このままではFortiGate側でなにも設定していないので、AWS からFortiGate環境方向の VPN通信に優先して使用される
VPNトンネルは AWS によりランダムに選択されます。
FortiGateは、Firewallとしても機能するものなので「ステートフルインスペクション」の機能が働きます。
要するに、行きと戻りのルートが変わると受信データを不正と判断して通信を遮断してしまう可能性があるということです。
そのため、FortiGateからAWSにアドバタイズするルートに「AS Path属性」や「MED値」の設定を追加する必要があると思います。
しかし、今回の検証ではFortiGateのInternalのIPアドレスに対してVPNを通って接続出来るかの検証しか行わないので「AS Path属性」等の設定は行いません。
では、続いてAWS側も確認します。
ルート伝播を有効にしたルートテーブルを確認すると、ネクストホップが仮想プライベートゲートウェイの宛先「192.168.1.0/24」のルートが学習されています。ただし、169から始まるIPアドレスも一緒に学習されてしまうため、不要なルートはプレフィックスリストで拒否したり、許可するプレフィックス値を設定すればよいですが、今回は検証のため、このままで問題ありません。
気にはなりますがね…
では、最後に接続確認をしてみます。
AWS側にある仮想PCからFortiGateのInternalのプライベートIPにVPNを通って接続できるのか確認してみます。
FortiGate側のPort1のプライベートIPは「192.168.1.61」です。
Windows仮想PCのIPアドレスは「10.3.1.45」です。
まずは、Windows仮想PCから「192.168.1.61」にPINGを飛ばしてみます。
問題なくプライベートIPアドレスでFortiGateへ接続出来ていることが確認出来ました。
TRACERTでも確認します。
Windows仮想PCからワンホップで、FortiGateにダイレクトに接続出来ていますね。
以上で、AWS VPNとFortiGateのIPsecVPNで接続の検証は終了です。
今回は、AWS VPNとFortiGateインスタンスをIPsecVPNで接続させてみました。
Azure VPNGatewayは使用したことはありましたが、AWS VPNは初めて使用しました。
構築の手軽さ簡単さで言えば、AWSの方が圧倒的に簡単です。対抗のオンプレ側の設定もダウンロード出来るので至れる尽くせりだと思います。ただ、AWS環境でBGPテーブルが見られないのは個人的にちょっと不便な気がしますね。BGPテーブルを確認したい場合はAWSサポートに問い合わせしなければならないようです。
また、FortiGateのAMIも初めて使用しましたが、殆ど実機と遜色なくとても使いやすかったです。
では、また別の記事を執筆致しますので、引き続きよろしくお願いいたします。
クラウドインテグレーション部
クラウドソリューション2課
川井 康敬