VMware Playerでネットワークを学ぶ～③VyOS1.4とAWS VPC間のSite-to-Site VPN接続～

[前回](https://qiita.com/flets708/items/1a9514c343359045853c)、VyOSをVM Player上にインストールしてゲストOSの接続設定等を実施しました。
今回は、AWS VPCとのVPN接続をやってみようと思います。（もともと、AWSの勉強をしていた時にVPN接続のイメージがつかず、VM Playerのネットワーク設定やVyOSにチャレンジし始めました。ついに本来やりたかったところまで来ました・・・！）

ちなみに、直近で無料ダウンロード可能なVyOS1.4だと、[参考にした記事](https://qiita.com/flets708/items/1feefd90fd1a45d52535#%E5%8F%82%E8%80%83)と結構コマンドが違いました。下記手順の途中に出てくる、AWSコンソールからダウンロードできる設定手順はそこそこ修正が必要なので、そのあたりをしっかり残そうと思います。

**＜全3回でやろうと思っていること＞**
[①VMware Playerの仮想ネットワーク設定](https://qiita.com/flets708/items/1aa6ffe578d7a93a7e7f)
[②VyOS1.4を使ったDNS,DHCP,NATなど](https://qiita.com/flets708/items/1a9514c343359045853c)
[③VyOS1.4とAWS VPC間のSite-to-Site VPN接続](https://qiita.com/flets708/items/1feefd90fd1a45d52535)　←今回はこれです。
　(1) 初期状態と目標
　(2) AWSコンソール上での設定
　(3) VyOS上の設定
　(4) 接続確認

**＜環境＞**
【オンプレ（自宅）側】
　ホストOS： Windows10 20H2
　ハイパーバイザ：　VMware WorkStation 16 Player 
　ゲストOS①： CentOS 8
　ゲストOS②： CentOS 7
　仮想ルータ： VyOS 1.4
【AWS側】
　EC2：Red Hat Enterprise Linux 8

#(1)初期状態と目標

###初期状態

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/820066/67626753-23c4-a838-b540-cdd56507a39b.png)


* オンプレ(自宅)側
    * [前回](https://qiita.com/flets708/items/1a9514c343359045853c)までと同じ
    * インターネットルータ(192.168.11.1)にVyOSがブリッジ接続
    * VyOSはインターネットルータに接続したネットワークインターフェースeth0(192.168.11.25)の他に2つのネットワーク[VMnet3:192.168.88.0/24、VMnet4:192.168.153.0/24]のデフォルトルートであるeth1(192.168.88.1)、eth2(192.168.153.1)の2つのネットワークインターフェースを持つ
    * VMnet3にはゲストOS①(CentOS 8, 192.168.88.128)、VMnet4にはゲストOS②(CentOS 7, 192.168.153.128)が接続されている
* AWS側
    *  VPC(10.2.0.0/16)内にプライベートサブネット(10.2.0.0/24)を構築
    *  サブネット内でEC2(RHEL8, 10.2.0.74)を起動
 
###目標

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/820066/95a35abc-d274-9170-4d02-b75b333cc16d.png)

VyOSをVPNルータ(=Customer gateway)としてVPCとの間にSite-to-Site VPNを構築する。
ゲストOSとEC2との間で双方向にアクセスできるようにする。また、VPNトンネルは冗長化のために2本構築する(AWSのSite-to-Site VPNではデフォルトでそうなる)。

#(2) AWSコンソール上での設定

VPC側、オンプレ側双方のゲートウェイを作成した後、VPN接続を構成する。
また、ルートテーブルの伝播設定を入れる。


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

AWSコンソール上で「VPCサービス」＞「カスタマーゲートウェイ」＞カスタマーゲートウェイの作成を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/820066/565373fb-7723-ae80-0c2e-0c90d85e2bc3.png)


名前は適当に入力、ルーティングは「動的」、IPアドレスは[CMANのサイト](https://www.cman.jp/network/support/go_access.cgi)等で確認した自宅ルータのグローバルIPアドレスを入力。その後、カスタマーゲートウェイの作成を押下。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/820066/70f6df5d-056b-e045-8463-48fb0a146274.png)


下記の画面が出れば成功。「閉じる」を押下。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/820066/3b29260b-fa6b-33c6-d755-9304ac892469.png)


###仮想プライベートゲートウェイの作成

左側のナビゲーションペインで「仮想プライベートゲートウェイ」を選択し、「仮想プライベートゲートウェイの作成」を押下。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/820066/fbb3c77c-6efb-b9de-6349-03e75a571d03.png)

名前を適当に入力して、「仮想プライベートゲートウェイの作成」。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/820066/d6cc6b7f-100e-d660-6739-1f458baa3df3.png)

こちらも下記の画面が出れば成功。「閉じる」を押下。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/820066/8755f9f9-412f-7bae-6026-303769188d71.png)

「アクション」＞「VPCにアタッチ」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/820066/f4a57676-1496-c64a-ae99-9199e5232436.png)

アタッチしたいVPCを選択し、「はい、アタッチします」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/820066/da86cec1-7963-4226-a1e2-1faf0bc57fbf.png)

状態が「attaching」からしばらくして「attached」になることを確認（適宜右上の更新マークを押す）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/820066/c8d032a7-be3a-9e55-64fa-8f59022ae310.png)


###サイト間のVPN接続
左側のナビゲーションペインで「サイト間のVPN接続」を選択し、「VPN接続の作成」を押下。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/820066/0098b0f8-4736-d2d4-daf6-e6f9535c5c7c.png)

名前を適当入力し、これまで作成した仮想プライベートゲートウェイ、カスタマーゲートウェイを選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/820066/01f36d9b-34c1-fc62-435f-d93e88feb9e3.png)

画面を下にスクロールし、「VPN接続の作成」
（他の項目はすべて入力しない）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/820066/21b24ba5-80ed-2a13-3c60-f35b6e3a2573.png)

この画面が出てればOK。「閉じる」を押下。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/820066/7e592cf8-1ac6-b4d0-165d-cf7e56c55992.png)

状態が「保留中」からしばらくして「」に変わることを確認する。（適宜右上の更新マークを押す）

###ルートテーブルの伝播設定
右側のナビゲーションペインで「ルートテーブル」を選択。今回EC2の存在するサブネットに関連付けられたルートテーブルを選択し、「ルート伝播」タブに進む。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/820066/a10368fe-134c-d34d-558e-455e331e4232.png)

「ルート伝播」タブに遷移後、「ルート伝達」の編集を押下。
「伝播」にチェックを入れて「保存」。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/820066/eb7d3a63-8dac-72fa-7c81-6316b17d2626.png)

「伝播」が「はい」に変わっていればOK。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/820066/5b2e4f76-a8aa-5a31-1ca6-8c7e83d766da.png)

※ちなみに、「ルート」タブをみると、この時点は何も伝播されていないことがわかる。
（＝「伝播済」が「はい」になっているレコードが無い）

#(3) VyOS上の設定

AWSコンソール上で作成したサイト間VPNの設定を、オンプレ側のVyOSに流し込む。
前述の通り、**VyOS1.4ではAWSからダウンロードした内容は一部修正が必要**なため、要注意。

###VyOS側の設定ファイルのダウンロード

左側のナビゲーションペインで「サイト間のVPN接続」を選択。
今回作成したVPNを選択し、「設定をダウンロード」を押下。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/820066/c4f17ad9-1686-e90f-fc85-a563bd1ff09a.png)

ベンダーは「Vyatta」、プラットフォームは「Vyatta Network OS」、ソフトウェアは「Vyatta Network OS 6.5+」を選択し、ダウンロード。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/820066/753538dc-2abf-3524-6bd7-1a78993bb3c9.png)

ちなみに、この時点ではVyOS側の設定がされていないため、当然リンクはダウン状態になっていることが「トンネル詳細」タブを開くと確認できる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/820066/d83a4012-24e4-c985-6b01-8323ce782edb.png)

###VyOS1.4での修正ポイント

設定ファイル(vpn-xxxxxxxxxxxxxxxxx.txt)がダウンロード出来たら、メモ帳等で開く。
設定は、IPSec Tunnel#1と#2それぞれで「#1 IKE設定」「#2 IPSecの設定」「#3 カスタマーゲートウェイ側のインターフェース（Virtual Tunnesl Interface, vti）の設定」「#4 BGPの設定」の順で書かれている。

このまま設定を流し込むとVyOS1.4ではエラーが発生するため、下記のように修正する。

#####\#1: Internet Key Exchange (IKE) Configuration [local-addressの修正]

* ローカルアドレスをVyOSのeth0のアドレスに修正

**Tunnel #1, #2双方とも修正する。**

```:Tunnel#1
####before
set vpn ipsec site-to-site peer 52.68.168.156 local-address '217.178.18.0'
####

####after
set vpn ipsec site-to-site peer 52.68.168.156 local-address '192.168.11.25'
####
```

```:Tunnel#2
####before
set vpn ipsec site-to-site peer 52.193.65.249 local-address '217.178.18.0'
####

####after
set vpn ipsec site-to-site peer 52.193.65.249 local-address '192.168.11.25'
####
```


#####\#4: Border Gateway Protocol (BGP) Configuration [① bgp構文の修正]

* ローカルのASNを事前に定義するよう、1行設定を追加
* 既存の行をVyOS1.4の仕様に合わせ修正
* VPC側にアドバタイズするセグメントをVMnet3, VMnet4に定義

**Tunnel #1, #2双方とも修正する。** (設定を流すときに「すでに定義されています」みたいなアラートが出るが、スルーでOK)
なお、下記では"!"で始まる行は省略して記載しているが、実際には残っていてOK。

```:Tunnel#1
####before
set protocols bgp 65000 neighbor 169.254.67.69 remote-as '64512'
set protocols bgp 65000 neighbor 169.254.67.69 soft-reconfiguration 'inbound'
set protocols bgp 65000 neighbor 169.254.67.69 timers holdtime '30'
set protocols bgp 65000 neighbor 169.254.67.69 timers keepalive '10'

set protocols bgp 65000 network 0.0.0.0/0
####

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

set protocols bgp address-family ipv4-unicast network 192.168.88.0/24
set protocols bgp address-family ipv4-unicast network 192.168.153.0/24
####
```

```:Tunnel#2
####before
set protocols bgp 65000 neighbor 169.254.53.197 remote-as '64512'
set protocols bgp 65000 neighbor 169.254.53.197 soft-reconfiguration 'inbound'
set protocols bgp 65000 neighbor 169.254.53.197 timers holdtime '30'
set protocols bgp 65000 neighbor 169.254.53.197 timers keepalive '10'

set protocols bgp 65000 network 0.0.0.0/0
####

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

set protocols bgp address-family ipv4-unicast network 192.168.88.0/24
set protocols bgp address-family ipv4-unicast network 192.168.153.0/24
####
```

上記の修正が終わったら、VyOSを`conf`コマンドで設定編集モードにして、ファイルの内容を全文コピペ。"failed"が無いことを確認し、`commit`→`save`→`exit`。

ちなみに`Invalid command`とか`syntac error`, `already exists`みたいなのはスルーでOK。

#(4) 接続確認

設定が完了したら、正しく反映されているかを確認する。

###AWSコンソールでの状態確認
VPCサービスの左側のナビゲーションペインで「「サイト間のVPN接続」を選択。
今回設定したVPNを一覧から選択し、「トンネル詳細」タブを開くと、、リンクがアップしていることがわかる。（アップは少しラグがあるため、少し待って右上での更新マークを押す）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/820066/e55d0c6b-57ec-e8e3-4dad-cfe847fccf0f.png)

また、ルートテーブルを確認すると、オンプレ側のセグメントが伝播されていることが確認できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/820066/3802cf6a-fa9f-0e9a-64d5-4a8798e22d63.png)


###VyOSのBGPテーブル

VPCへのルートがオンプレ側に広告されていることを確認。

```
yos@vyos:~$ show ip bgp
BGP table version is 3, local router ID is 192.168.153.1, 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.2.0.0/16      169.254.53.197         200             0 64512 i
*>                  169.254.67.69          100             0 64512 i
*> 192.168.88.0/24  0.0.0.0                  0         32768 i
*> 192.168.153.0/24 0.0.0.0                  0         32768 i

Displayed  3 routes and 4 total paths
vyos@vyos:~$ 
```


ついでに、ルーティングテーブルにVPCへのルート定義が追加されていること、ネットワークインターフェースにvti0, vti1が追加されていることを確認。

```
vyos@vyos:~$ 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.11.1, eth0, weight 1, 23:35:42
B>* 10.2.0.0/16 [20/100] via 169.254.67.69, vti0, weight 1, 00:02:00
C>* 169.254.53.196/30 is directly connected, vti1, 00:02:05
C>* 169.254.67.68/30 is directly connected, vti0, 00:02:05
C>* 192.168.11.0/24 is directly connected, eth0, 23:35:43
C>* 192.168.88.0/24 is directly connected, eth1, 23:35:45
C>* 192.168.153.0/24 is directly connected, eth2, 23:35:42

vyos@vyos:~$ 
vyos@vyos:~$ 
vyos@vyos:~$ show int
Codes: S - State, L - Link, u - Up, D - Down, A - Admin Down
Interface        IP Address                        S/L  Description
---------        ----------                        ---  -----------
eth0             192.168.11.25/24                  u/u  VMNet0,Bridge,Internet
eth1             192.168.88.1/24                   u/u  VMNet3
eth2             192.168.153.1/24                  u/u  VMNet4
lo               127.0.0.1/8                       u/u
                 ::1/128
vti0             169.254.67.70/30                  u/u  VPC tunnel 1
vti1             169.254.53.198/30                 u/u  VPC tunnel 2
vyos@vyos:~$ 
```

###ゲストOS→EC2アクセス
ping、curl、SSHアクセスを確認。
curlはhttpdを起動した状態で、適当なテキストファイルを獲得することで確認。また、いずれもセキュリティグループは開いておく。

```
[root@centos8-01 ~]# ping 10.2.0.74
PING 10.2.0.74 (10.2.0.74) 56(84) bytes of data.
64 bytes from 10.2.0.74: icmp_seq=1 ttl=63 time=12.8 ms
64 bytes from 10.2.0.74: icmp_seq=2 ttl=63 time=12.8 ms
64 bytes from 10.2.0.74: icmp_seq=3 ttl=63 time=16.3 ms
^C
--- 10.2.0.74 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 8ms
rtt min/avg/max/mdev = 12.803/13.970/16.281/1.639 ms
[root@centos8-01 ~]# 
[root@centos8-01 ~]# curl 10.2.0.74/vpntest.txt
VPN-test
[root@centos8-01 ~]# 
[root@centos8-01 ~]# ssh -i nittakey1.pem ec2-user@10.2.0.74
Last login: Sun May 23 21:00:54 2021 from 217.178.18.0
[ec2-user@ip-10-2-0-74 ~]$ uname -n
ip-10-2-0-74.ap-northeast-1.compute.internal
[ec2-user@ip-10-2-0-74 ~]$
```

###EC2→ゲストOSアクセス
ping、curl、SSHアクセスを確認。
curlはhttpdを起動した状態で、適当なテキストファイルを獲得することで確認。

```
[root@ip-10-2-0-74 html]# ping 192.168.88.128
PING 192.168.88.128 (192.168.88.128) 56(84) bytes of data.
64 bytes from 192.168.88.128: icmp_seq=1 ttl=63 time=11.6 ms
64 bytes from 192.168.88.128: icmp_seq=2 ttl=63 time=12.2 ms
64 bytes from 192.168.88.128: icmp_seq=3 ttl=63 time=14.4 ms
^C
--- 192.168.88.128 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 5ms
rtt min/avg/max/mdev = 11.575/12.713/14.406/1.223 ms
[root@ip-10-2-0-74 html]#
[root@ip-10-2-0-74 html]# ping 192.168.153.128
PING 192.168.153.128 (192.168.153.128) 56(84) bytes of data.
64 bytes from 192.168.153.128: icmp_seq=1 ttl=63 time=14.5 ms
64 bytes from 192.168.153.128: icmp_seq=2 ttl=63 time=16.8 ms
64 bytes from 192.168.153.128: icmp_seq=2 ttl=63 time=15.8 ms
^C
--- 192.168.153.133 ping statistics ---
3 packets transmitted, 2 received, 33.3333% packet loss, time 6ms
rtt min/avg/max/mdev = 14.466/15.610/16.755/1.151 ms
[root@ip-10-2-0-74 html]#
[root@ip-10-2-0-74 html]# curl 192.168.88.128/vpntest.txt
CentOS-8-VPN-test
[root@ip-10-2-0-74 html]# ssh admin@192.168.88.128
admin@192.168.88.128's password:
Activate the web console with: systemctl enable --now cockpit.socket

Last login: Sat May 22 23:40:19 2021 from 10.2.0.74
[admin@centos8-01 ~]$ uname -n
centos8-01
[admin@centos8-01 ~]$
```

#まとめ

VyOSの操作に慣れたり、VyOS1.4だとコマンドがうまく流れないことなどで時間を費やしてしまいましたが、振り返るとかなり簡単にVPN設定が導入できることを体感することができました。
また、VPN設定の手順やポイントを抑えることができ、AWSの資格試験で勉強した内容のりかいをことができました。

一旦ネットワーク勉強は区切ろうと思いますが、他にもVyOSで出来ることがあれば別の機会にやってみようと思います。


#参考
[VyOS 1.4のConfigration Guide](https://docs.vyos.io/en/latest/configuration/index.html)
[元パチ屋店員NWエンジニアの技術ブログ -AWS VPCと自宅LANをVPN接続してみた](http://raptor-falcon.hatenablog.com/entry/2017/09/27/064309#%E4%BB%AE%E6%83%B3%E3%83%97%E3%83%A9%E3%82%A4%E3%83%99%E3%83%BC%E3%83%88%E3%82%B2%E3%83%BC%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A4%E3%81%AE%E8%A8%AD%E5%AE%9A)
[VyOS で site-to-site VPN をしてみた](https://qiita.com/sugimountaws/items/2f2e8d27ade90bb3b554#%E9%80%9A%E4%BF%A1%E7%A2%BA%E8%AA%8D)