Amazon-VPC

AWS Site-to-Site VPNハンズオンやってみた!

はじめに

こんにちは、ディーネットの森です。
朝晩冷える季節となってきましたが体調いかがでしょうか。
私はまだまだ満員電車が暑くて仕方ないです(;^ω^)
冗談はこれまでとして、かねてからやってみたかったAWS Site-to-Site VPNをハンズオンに従って構築してみる回になります。
是非構築時の参考にしてください。
現環境は既に存在しませんので、IPアドレスの記載は公開しています。

AWSハンズオン

ソフトウェアがインストールされたインスタンスを使用しますが、無料期間での使用になりますので問題ありません。また、AWS Marketplaceのサブスクを解除する方法も文末に記載しています。
ハンズオンでの完成図は次のとおりとなります。
※Cloud9はEC2に置き換えて構築します。
image.png

最初にピアリング接続を行います。
image.png

VPC作成

※VPCを作成する際は、「VPCなど」を選択します。

  • 【mainVPC】
    • パブリックサブネットx1
    • IPv4 CIDR ブロック:10.0.0.0/16
    • パブリックサブネット CIDR ブロック:10.0.0.0/24
  • 【peeringVPC】
    • パブリックサブネットx1
    • IPv4 CIDR ブロック:10.1.0.0/16
    • パブリックサブネット CIDR ブロック:10.1.0.0/24

ピアリング接続

mainVPCとpeeringVPCを接続します。
ピアリングはアカウントやリージョンを跨いだ接続が可能。
ピアリングの設定をすると次の画面となり、承諾が必要となります。

AWSピアリングに関するドキュメント

image.png

ポップアップに従い、ルートテーブルを変更することで、ピアリング先にアクセスすることが可能。
image.png
各パブリックルートテーブルにおいて、通信先のVPCサイダー範囲と、ソースをピアリングに設定する。
mainVPC(パブリックルートテーブル)
image.png

peeringVPC(パブリックルートテーブル)
image.png

peeringVPCにEC2構築

セキュリティグループは、10.0.0.0/16からの接続は全て許可する設定とします。
プライマリプライベートIPアドレスは、10.1.0.100で指定します。
キーペアなしで進めます。
image.png
image.png

mainVPCにEC2構築

セキュリティグループは、10.1.0.0/16からの接続は全て許可、SSH,0.0.0.0を開けて進めましょう。
キーペア指定。
起動!

mainEC2⇒peeringEC2疎通確認

SSH接続でmainEC2にログインします。
そして割り当てIPアドレスの確認
eth0

ip addr

mainVPCに存在することを確認する。

peeringEC2にping疎通確認します。

ping 10.1.0.100

例:
image.png

AWS Site-to-Site VPN

AWS Site-to-Site VPNは冗長として2本作る。
CGW(お客様オンプレミス)
VGW(VPC)
特徴は次のとおりです。
簡単にまとめると、専用線を使用せずインターネットを介して少量の通信をVPC(VGW)からオンプレミスのお客様環境(CGW)と繋ぐ場合に使用するサービスです。多数のVPCと接続する場合はTransit Gatewayを使用するといった使い分けを行うと良いでしょう。

  • インターネットに繋がずすぐに繋ぎたい、ピアリング接続
  • インターネットを介さずIPアドレスの重複関係なく接続したい、PrivateLink
  • インターネットを介して少量の暗号化通信、Site-to-Site VPN
  • 安定した帯域幅で専用線を使用した通信、Direct Connect
    こんな感じでしょうか。
    image.png

多くのVPCと接続する場合など。TransitGateway
image.png

仮想ルータ構築

新たなVPC(仮想オンプレ)を作成

  • 【OnP】
    • パブリックサブネットx1
    • IPv4 CIDR ブロック:192.168.0.0/16
    • パブリックサブネット CIDR ブロック:192.168.0.0/24

VyOSという仮想ルータを使用(無料期間あり。)
※ハンズオンに合わせて少し古いバージョンを使用します。
バージョン 1.3.5
image.png
一番小さいサイズを選ぶ(^^;
t3.medium
※推奨はデフォルトのインスタンスタイプのようです。
OnPVPCに配置して、プライマリプライベートIPアドレスを「192.168.0.200」とします。
キーペア指定。
セキュリティグループは、SSH,0.0.0.0で進めます。
EIPを割り当てましょう。
mainEC2からOnPEC2に接続するので、mainEC2にキーペアの鍵を渡します。私の場合はTera Termを使用します。
/home/ec2-user/〇〇.pem ここに配置しちゃいましょう。
image.png
そして権限を適切に設定します。
※400は所有者のみ読み取り可

chmod 400 /home/ec2-user/○○○.pem

そして接続

ssh -i ○○○.pem vyos@{IPアドレス}

image.png

VGW設定

仮想プライベートゲートウェイ作成
名前を決める。
image.png
「main」VPCに関連付ける。
image.png

CGW設定

AWS側にどういった接続があるか先行的に設定する役割。

  • カスタマーゲートウェイの作成
    • 名前を付ける。
    • BGP(動的)を選択
    • BGP ASN:65000
    • IP アドレス:「OnPのEIP」
      ※BGP(Border Gateway Protocol)
      ネットワークを繋ぐプロトコルでEGPの一種
      リージョン毎に予約があるようです。
      後はデフォルトで作成

AWS Site-to-Site VPN接続

  • 名前を付ける。
    • VGWとCGWを選択
    • 後はデフォルトで作成

image.png

  • 設定、Vyattaを選択してダウンロードする。
    編集をしていきます。バージョンによって記載内容は違います。

image.png
VSCodeで編集すると見やすいです。
これはオンプレ側に適用するための設定となります。

set vpn ipsec ike-group AWS lifetime '28800'
set vpn ipsec ike-group AWS proposal 1 dh-group '2'
set vpn ipsec ike-group AWS proposal 1 encryption 'aes128'
set vpn ipsec ike-group AWS proposal 1 hash 'sha1'
set vpn ipsec site-to-site peer 3.232.50.186 authentication mode 'pre-shared-secret'
set vpn ipsec site-to-site peer 3.232.50.186 authentication pre-shared-secret 'PSDoRWt6bAlr9w6uFJP_TMzUhNnliYJy'
set vpn ipsec site-to-site peer 3.232.50.186 description 'VPC tunnel 1'
set vpn ipsec site-to-site peer 3.232.50.186 ike-group 'AWS'
set vpn ipsec site-to-site peer 3.232.50.186 local-address '192.168.0.200'
set vpn ipsec site-to-site peer 3.232.50.186 vti bind 'vti0'
set vpn ipsec site-to-site peer 3.232.50.186 vti esp-group 'AWS'

set vpn ipsec ipsec-interfaces interface 'eth0'
set vpn ipsec esp-group AWS compression 'disable'
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 'aes128'
set vpn ipsec esp-group AWS proposal 1 hash 'sha1'

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'

set interfaces vti vti0 address '169.254.78.202/30'
set interfaces vti vti0 description 'VPC tunnel 1'
set interfaces vti vti0 mtu '1436'

set protocols bgp 65000 neighbor 169.254.78.201 remote-as '64512'
set protocols bgp 65000 neighbor 169.254.78.201 address-family ipv4-unicast soft-reconfiguration 'inbound'
set protocols bgp 65000 neighbor 169.254.78.201 timers holdtime '30'
set protocols bgp 65000 neighbor 169.254.78.201 timers keepalive '10'

set protocols bgp 65000 address-family ipv4-unicast network 192.168.0.0/16

set vpn ipsec site-to-site peer 52.72.226.199 authentication mode 'pre-shared-secret'
set vpn ipsec site-to-site peer 52.72.226.199 authentication pre-shared-secret '4cLMAjWD88lZ3Pe_Liv9SBya8BNNpcpE'
set vpn ipsec site-to-site peer 52.72.226.199 description 'VPC tunnel 2'
set vpn ipsec site-to-site peer 52.72.226.199 ike-group 'AWS'
set vpn ipsec site-to-site peer 52.72.226.199 local-address '192.168.0.200'
set vpn ipsec site-to-site peer 52.72.226.199 vti bind 'vti1'
set vpn ipsec site-to-site peer 52.72.226.199 vti esp-group 'AWS'

set interfaces vti vti1 address '169.254.194.210/30'
set interfaces vti vti1 description 'VPC tunnel 2'
set interfaces vti vti1 mtu '1436'

set protocols bgp 65000 neighbor 169.254.194.209 remote-as '64512'
set protocols bgp 65000 neighbor 169.254.194.209 address-family ipv4-unicast soft-reconfiguration 'inbound'
set protocols bgp 65000 neighbor 169.254.194.209 timers holdtime '30'
set protocols bgp 65000 neighbor 169.254.194.209 timers keepalive '10'

現在mainEC2経由で、OnPEC2にログインした状態から、設定モードに以降します。

configure

(conf)でも設定モードに以降できます。
プロンプトが変わりました。
image.png
先程の設定コマンドを一気に貼り付けます。
「[edit]」このような表示である場合、正常に設定できています。

設定を保存します。

commit
save
vyos@ip-192-168-0-200# save
Saving configuration to '/config/config.boot'...
Done
[edit]

※設定が上手くいかない場合は、公式のドキュメントなどを確認しながら設定を投入して進める必要があります。なお、私が最新バージョンVyattaの1.4だと、この設定コマンドは通りません。

設定作成時、参考サイト(Vyatta公式サイト(Ver1.3,Ver1.4):

Vyatta公式サイト(Ver1.3)

Vyatta公式サイト(Ver1.4)

参考までに設定ファイルの編集箇所は次のとおりです。

「修正/削除箇所」

【修正箇所】
! IPSec Tunnel #1
〜〜
修正前:
set vpn ipsec site-to-site peer XX.XX.XX.XX local-address '<Elastic IP>'
修正後:
set vpn ipsec site-to-site peer XX.XX.XX.XX local-address '192.168.0.200'

修正前:
set protocols bgp 65000 neighbor 169.254.XX.XX soft-reconfiguration 'inbound'
修正後:
set protocols bgp 65000 neighbor 169.254.XX.XX address-family ipv4-unicast soft-reconfiguration 'inbound'

修正前:
set protocols bgp 65000 network 0.0.0.0/0
修正後:
set protocols bgp 65000 address-family ipv4-unicast network 192.168.0.0/16
~~

! IPSec Tunnel #2
〜〜
修正前:
set vpn ipsec site-to-site peer XX.XX.XX.XX local-address '<Elastic IP>'
修正後:
set vpn ipsec site-to-site peer XX.XX.XX.XX local-address '192.168.0.200'

修正前:
set protocols bgp 65000 neighbor 169.254.XX.XX soft-reconfiguration 'inbound'
修正後:
set protocols bgp 65000 neighbor 169.254.XX.XX address-family ipv4-unicast soft-reconfiguration 'inbound'

【削除箇所】
→全ての「!」で始まる行に加え、以下の箇所

! IPSec Tunnel #2
〜〜
set protocols bgp 65000 network 0.0.0.0/0

set vpn ipsec ike-group AWS lifetime '28800'
set vpn ipsec ike-group AWS proposal 1 dh-group '2'
set vpn ipsec ike-group AWS proposal 1 encryption 'aes128'
set vpn ipsec ike-group AWS proposal 1 hash 'sha1'

set vpn ipsec ipsec-interfaces interface 'eth0'
set vpn ipsec esp-group AWS compression 'disable'
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 'aes128'
set vpn ipsec esp-group AWS proposal 1 hash 'sha1'

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’

インターフェイスの状態を確認してみます。

show interfaces
vyos@ip-192-168-0-200# show interfaces
 ethernet eth0 {
     address dhcp
     hw-id 02:9f:d4:f8:5a:a5
     offload {
         gro
         gso
         sg
     }
 }
 loopback lo {
 }
 vti vti0 {
     address 169.254.78.202/30
     description "VPC tunnel 1"
     mtu 1436
 }
 vti vti1 {
     address 169.254.194.210/30
     description "VPC tunnel 2"
     mtu 1436
 }
[edit]

AWS VPCとのIPsec VPNトンネルが確立できているようです。

公式が示すBGPが作成したmainVPCを認識しているか確認するコマンドを実行します。
次のコマンドでモードを変更します。
今のモードを出ます。

exit

BGP設定を一度リセットします。

reset ip bgp all

ルートテーブルを確認してVPCのアドレスを覚えいるか確認します。

show ip route
vyos@ip-192-168-0-200:~$ 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, D - SHARP,
       F - PBR, f - OpenFabric,
       > - selected route, * - FIB route, q - queued, r - rejected, b - backup

S>* 0.0.0.0/0 [210/0] via 192.168.0.1, eth0, weight 1, 01:46:33
B>* 10.0.0.0/16 [20/100] via 169.254.194.209, vti1, weight 1, 00:01:01
C>* 169.254.78.200/30 is directly connected, vti0, 00:19:08
C>* 169.254.194.208/30 is directly connected, vti1, 00:19:08
C>* 192.168.0.0/24 is directly connected, eth0, 01:46:33

Bの箇所に10.0.0.0/16 VPCを記憶してくれていますね。

次にBGPの細部を確認

show ip bgp
vyos@ip-192-168-0-200:~$ show ip bgp
BGP table version is 4, local router ID is 192.168.0.200, 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

   Network          Next Hop            Metric LocPrf Weight Path
*  10.0.0.0/16      169.254.78.201         200             0 64512 i
*>                  169.254.194.209        100             0 64512 i
*> 192.168.0.0/16   0.0.0.0                  0         32768 i

Displayed  2 routes and 3 total paths

ちゃんとネットワークを見つけてくれています。

コンソールで確認してみます。

image.png
OK

今の構成はこの状態
image.png

mainVPCのルートテーブル編集

  • ルート伝搬のタブ

    • ルート伝搬の編集

    • 学習したルートを伝搬するか:有効にチェック
      image.png

    • 伝搬:「はい」を確認
      image.png

OnPVPCのルートテーブル編集

  • OnPルートテーブルのルートタブから編集
    • ルート追加で、mainの10.0.0.0/16,インスタンスを選択,CGWを選択

※送信先宛先チェックを無効化する。
経由する役割のEC2である場合、これを解除しないと機能しません。

想定オンプレのOnPEC2を選択し、アクション⇒ネットワーキング⇒ソース宛先チェック。停止にチェックを付けて、保存します。

image.png

疎通確認の儀

OnPVPCにEC2を立てて、mainEC2から接続することで、疎通確認を行ってまいります。
image.png

  • OnPEC2

    • 名前を付ける。
    • OnPVPCに配置
    • プライマリプライベートIP「192.168.0.100」
    • セキュリティグループ:すべて,ソース10.0.0.0/16,mainVPCからの接続に限定して進めます。
    • キーペアなし。
      image.png
  • mainVPCのmainEC2にログイン

  • mainEC2のIPアドレスを再確認

    ip addr
  • pingしていきます。。。。。

    ping 192.168.0.100

    image.png
    成功です。

後片付け

image.png
EIPの関連付けを解除するのは最後でも良いかもですね。
誤って消してしまう可能性もありますので(^^;

サブスクの削除

サービス検索で、AWS Marketplaceを検索

  • サブスクリプションの管理
  • 該当のサブスクリプションをクリックしてスクロールします。
    image.png
  • 契約:アクションをクリック
    プルダウンから、サブスクリプションをキャンセルをクリックします。

image.png
サブスクリプションが正常にキャンセルされたことを確認します。

おわりに

AWS Site-to-Site VPNにおいて私的に肝だなと感じたところは、設定ファイルをダウンロードして、編集するところが別途勉強が必要だと思いました。オンプレ側にどの設定をいれるのかというところです。
ハンズオンによって簡単にではありますが、理解を深めることができました!

返信を残す

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

CAPTCHA