こんにちは。hacknoteのohnoです。
今回はローカル環境とAWS環境をIPsecを使いVPNで接続する機会がありましたので、基本的な方法をまとめておこうと思います。
AWSにおけるVPN接続について
VPNは超ざっくりいえばと違うネットワークにあるものをローカルにあるかのように接続する技術です。
VPN接続を使う場合には、いくつかパターンがありますが(端末を接続させる等)今回はVPC空間をローカルネットワーク(オンプレ)に接続させるSite-to-Site VPNを使用します。
VPN 接続という用語は一般的な用語ですが、このドキュメントでの VPN 接続は VPC とユーザーのオンプレミスネットワークの間の接続を指します。Site-to-Site VPN ではインターネットプロトコルセキュリティ (IPsec) VPN 接続がサポートされています。
ここから先VPNと言った場合にはこちらを指すものと思って下さい。
事前準備
接続する前に必要な情報を揃えます。トータルで必要になるのは以下の情報です。
- AWS側で使用するIP空間
- 接続に使用する事前共有鍵
- ローカルネットワークのルーティング方法
- ローカルネットワークのゲートウェイのグローバルIP
一つずつ解説を。
AWS側で使用するIP空間
ローカルとVPCを繋げるので、ローカルで割り振っているIPアドレスを使用するとコンフリクトします。
そのため、サブネットを切るなりしてAWS側で使う空間を、「172.16.200.0/24」などと決めておき、その空間にあるのはAWS側と決めておく必要があります。
ローカルのネットワークの情報を調べて使用領域を決めましょう。
接続に使用する事前共有鍵
IPsecにて接続を確立する際に、IKEの鍵交換に使用するキーになります。
こちらはローカル側で設定していた場合にはその鍵になりますが、新規接続用に作成するのも良いでしょう。
ローカル側、AWS側両方に同じ鍵を使用することで、接続が可能になります。
ローカルネットワークのルーティング方法
ローカルネットワーク側のルーティングが動的に行われているのか、静的に行われているかの確認になります。
静的ルーティングしているのであれば、各ノードの位置を正しく認識できるように設定する必要がありますし、
動的ルーティングの場合には使用されているボーダーゲートウェイプロトコル (BGP) の自律システム番号 (ASN)が必要になるため調べておきます。
ローカルネットワークのゲートウェイのグローバルIP
AWSから接続する先になります。こちらはインターネットから直接アクセスが可能な静的アドレスである必要があります。
ここまでの情報が出揃ったらAWS側で接続設定を初めます。
流れとしては
AWSでVPCの作成
↓
AWSで仮想プライベートゲートウェイの作成
↓
AWSでカスタマーゲートウェイの作成
↓
AWS側ルーティングの設定
↓
AWSでSite-to-Site VPN接続の作成
↓
ローカルネットワークでゲートウェイにVPC設定の入れ込み
↓
導通確認
となります。なんでVPN接続の作成が先で、あとでローカルの機器に設定を入れるのかは、
接続の作成後に機器のコンフィグをAWSよりDLできるので、必要があればそれを変更してゲートウェイ機器に流すのが手っ取り早いからです。
この後に、
- VPNの通信監視設定
- ノード間の通信監視設定
などを入れておけば接続に問題が生じた際の原因究明の役に立つでしょう。
項目が多いので各項目ざっくりと説明しますので、もしわからない事があればAWSの個別設定方法のページをみていただければと思います。
AWSでVPCの作成
VPCの作成画面を開き、IPv4 CIDR blockに事前に調べた「AWS側で使用するIP空間」を入れます。Tenancyはdefault(共有ハードウェア)で。
VPCは簡単に作れるかと思いますが、作ったばかりのVPC空間の場合にはサブネットが切られておらず、アベイラビリティゾーンの指定も一つだけになってしまいます。
インスタンスを作る前にサブネットを分割しておくと良いでしょう。
AWSのALBの作成時にアベイラビリティゾーンを選択できない
AWSで仮想プライベートゲートウェイの作成
AWS側の仮想プライベートゲートウェイを作成します。
ASNは特になにかなければAWS側のデフォルトでよいでしょう。
AWSでカスタマーゲートウェイの作成
カスタマーゲートウェイ(ローカルネットワークのゲートウェイ)を作成します。作成というか、AWS側にこちらの情報を教えてあげる感じですね。
IP アドレスに事前調査した「ローカルネットワークのゲートウェイのグローバルIP」を入力、「ローカルネットワークのルーティング方法」通りに動的静的を指定して値を入力します。
AWS側ルーティングの設定
VPCダッシュボードより、ルートテーブル→該当のVPCの使っているルーティングからEdit routesを選択
該当のローカルネットワーク・アドレスへのデータ送信を正しく送れるようにルーティングの設定を入れます。
Destinationにローカルで使っているIP空間を指定、Targetに仮想プライベートゲートウェイを指定します。
AWSでSite-to-Site VPN接続の作成
作った仮想プライベートゲートウェイと、カスタマーゲートウェイをつなげます。そのまま作ったものを指定していけばOKですが、
トンネル 1 の事前共有キーは事前調査で調べた(決めた)鍵を入力して下さい。
内部 IP CIDRは特に決めなければAmazon による生成が行われますのでそれで良いでしょう。
トンネルが2つあるのは、AWSの冗長化のためです。トンネルが片方死んだ場合にすばやく別トンネルでの接続に切り替わりますので、可能であれば2つ設定しておいたほうが良いです。
VPN接続の作成直後はAWS側の準備は出来ているのですが、接続のステータスがダウンとなっているかと思います。
ローカルの設定が完了していないからですね。次で設定します。
ローカルネットワークでゲートウェイにVPC設定の入れ込み
こちらはAWSから各機器に合わせた設定がDL出来ますので今回は流用するものとします。VPN接続から設定のダウンロードを選択
こちらから今回ローカルで使用している機器に関しての設定をダウンロードして入れます。
各機器に関することなので説明が長くなりますので割愛しますが、機器に関してしっかりとしらべて設定を入れないと場合によっては大変なことになるのできちんとコンフィグのバックアップを取るなどしてから行いましょう。
入れて数秒〜数分でAWS側の接続のステータスがアップになるかと思います。
導通確認
接続のステータスがアップ状態であることを確認できたら、接続の確認をしてみましょう。
VPC空間にインスタンスを立ち上げてpingを打ってみます。
[root@hogehoge~]# ping 172.16.xxx.xxx(ローカル側の端末のローカルIP) PING 172.16.xxx.xxx (172.16.xxx.xxx) 56(84) bytes of data. 64 bytes from 172.16.xxx.xxx: icmp_seq=1 ttl=126 time=5.96 ms 64 bytes from 172.16.xxx.xxx: icmp_seq=2 ttl=126 time=5.50 ms 64 bytes from 172.16.xxx.xxx: icmp_seq=3 ttl=126 time=5.35 ms 64 bytes from 172.16.xxx.xxx: icmp_seq=4 ttl=126 time=5.46 ms ^C --- 172.16.xxx.xxx ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 3003ms rtt min/avg/max/mdev = 5.351/5.570/5.962/0.232 ms
問題なく接続が出来ています。片側から確認出来たら、今度はローカル側の端末からAWSのローカルIPにpingを打ってみて下さい。
もしAWS側にpingが届かない場合にはセキュリティグループでICMPのインバウンドが許可されているか確認して下さい。
後は監視設定の入れ込みとノード間の通信監視ですが・・・。ここまでで長くなりすぎているので個別で記事にしたいと思います。
まとめ
以上がVPCとローカルネットワークをVPNで繋ぐ方法でした。
事前にしっかりと情報を調べていればサクサクと接続が完了するとおもいますので、是非ご活用下さい。