Akamai's cloud computing servicesとAWSをSite-to-Site VPNで接続をする（冗長構成VRRP編）

# 本構成について

Akamai's cloud computing services上に構築したインスタンスとAWSのインスタンス間の通信を行う際にはインターネット経由で通信を行う必要があります。
今回はLinodeインスタンスにstrongSwanとFRRoutingを構築して、AWSのSite-to-Site VPNに接続し、安全な通信経路とBGPによる動的ルーティングを構築します。
Linode VLAN内のインスタンスの経路を冗長化させるため、VRRPを活用して冗長化を実現します。
VRRPの実装にはKeepalivedを利用します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49877/6b55a3ea-b08b-9d72-99a2-7d563f7699a5.png)

## 構成の前提

前提として、2台のVPNインスタンスにはすでにVPNとBGPの設定が終わっている状態となります。

構築手順については以下を参照ください。

https://qiita.com/isss802/items/5cba6f3ff18ea687511b

## Keepalivedとは

KeepalivedはLinux上で動作するオープンソースソフトウェアで、サービスの高可用性とロードバランシングを提供します。Linux Virtual Serverを用いたレイヤー4ロードバランシングと、VRRPを利用した冗長化を実現し、サービスのダウンタイムを最小に抑えることができます。

https://www.keepalived.org/index.html

## Linode VLANについての補足

Linode VLANはLayer 2(データリンク層)で動作するため、ブロードキャスト、マルチキャストの通信が可能となります。
今回の構成ではVRRPを利用しますが、ARPリクエストの通信は問題なく可能となります。

https://www.linode.com/docs/products/networking/vlans/

## VPN/Routing Instance 1 のFRRoutingの設定を追加

iBGPの設定を行います。

```
root@localhost:~# vtysh

Hello, this is FRRouting (version 8.1).
Copyright 1996-2005 Kunihiro Ishiguro, et al.

localhost# conf t
localhost(config)#

router bgp 65000
 ! iBGPの設定を追加
 neighbor 10.0.1.3 remote-as 65000
 !
 address-family ipv4 unicast
  ! iBGPの設定を追加
  neighbor 10.0.1.3 soft-reconfiguration inbound
  neighbor 10.0.1.3 next-hop-self
 exit-address-family
exit
!
end
```

設定を保存します。

```
localhost# wr
Note: this version of vtysh never writes vtysh.conf
Building Configuration...
Integrated configuration saved to /etc/frr/frr.conf
[OK]
```

## VPN/Routing Instance 2 のFRRoutingの設定を追加

iBGPの設定を行います。

```
root@localhost:~# vtysh

Hello, this is FRRouting (version 8.1).
Copyright 1996-2005 Kunihiro Ishiguro, et al.

localhost# conf t
localhost(config)#

router bgp 65000
 ! iBGPの設定を追加
 neighbor 10.0.1.2 remote-as 65000
 !
 address-family ipv4 unicast
  ! iBGPの設定を追加
  neighbor 10.0.1.2 soft-reconfiguration inbound
  neighbor 10.0.1.2 next-hop-self
 exit-address-family
exit
!
end
```

設定を保存します。

```
localhost# wr
Note: this version of vtysh never writes vtysh.conf
Building Configuration...
Integrated configuration saved to /etc/frr/frr.conf
[OK]
```

### BGP確認

Neighborが確率していることを確認します。

```
localhost# show ip bgp summary remote-as 65000

IPv4 Unicast Summary (VRF default):
BGP router identifier , local AS number 65000 vrf-id 0
BGP table version 3
RIB entries 3, using 552 bytes of memory
Peers 3, using 2169 KiB of memory

Neighbor        V         AS   MsgRcvd   MsgSent   TblVer  InQ OutQ  Up/Down State/PfxRcd   PfxSnt Desc
10.0.1.3        4      65000      8655      8656        0    0    0 07:12:33            2        2 N/A
```

## Linode インスタンスにVRRPを構築する

以下を参考にKeepalivedをインストールします。

https://www.linode.com/docs/products/compute/compute-instances/guides/failover-legacy-keepalived/


```
sudo apt install keepalived
```

### VPN/Routing Instance 1 の Keepalived設定

keepalived.confを設定します。
virtual_ipaddressにはVLAN内のアドレスで利用していないIPを指定します。

```
vim /etc/keepalived/keepalived.conf

vrrp_instance Instance1 {
    state MASTER
    interface eth1
    virtual_router_id 10
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass password
    }
    virtual_ipaddress {
        10.0.1.200
    }
}
```

### VPN/Routing Instance 2 の Keepalived設定

keepalived.confを設定します。
virtual_ipaddressにはVLAN内のアドレスで利用していないIPを指定します。

```
vim /etc/keepalived/keepalived.conf

vrrp_instance Instance2 {
    state BACKUP
    interface eth1
    virtual_router_id 10
    priority 99
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass password
    }
    virtual_ipaddress {
        10.0.1.200
    }
}
```

## Keepalivedの設定確認

Config Testを行い、何も出力されないことを確認します。（異常がある場合のみ出力されます）

```
keepalived --config-test
```

サービスを起動します。

```
systemctl start keepalived
systemctl enable keepalived
```

virtual_ipaddressが付与されていることを確認します。

```
root@localhost:~# ip addr show eth1
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 90:de:01:4b:83:f5 brd ff:ff:ff:ff:ff:ff
    inet 10.0.1.2/24 brd 10.0.1.255 scope global eth1
       valid_lft forever preferred_lft forever
    inet 10.0.1.200/32 scope global eth1
       valid_lft forever preferred_lft forever
    inet6 fe80::92de:1ff:fe4b:83f5/64 scope link
       valid_lft forever preferred_lft forever
```


## Linode インスタンスからの疎通確認

VLANの設定を行ったLinodeインスタンスを構築し、疎通確認をします。

AWSのVPCのネットワークへの経路を構築したVPNインスタンスを経由するように設定します。

Network設定の書き換えを行うため、上書きされないようにAuto-configure networkingを無効にします。

https://www.linode.com/docs/products/compute/compute-instances/guides/network-helper

無効にした後に設定を追記します。


```
vim /etc/systemd/network/05-eth1.network

[Route]
Destination=10.0.0.0/24
Gateway=10.0.1.200
```

尚、一時的に経路確認したい場合にはコマンドでも追加可能です。

```
sudo ip route add 10.0.0.0/24 via 10.0.1.200
```

設定を反映させます。

```
netplan apply
```

pingやicmpを利用して疎通が取れることを確認します。

```
root@localhost:~# ping 10.0.0.24
PING 10.0.0.24 (10.0.0.24) 56(84) bytes of data.
64 bytes from 10.0.0.24: icmp_seq=1 ttl=126 time=75.0 ms
64 bytes from 10.0.0.24: icmp_seq=2 ttl=126 time=75.1 ms
64 bytes from 10.0.0.24: icmp_seq=3 ttl=126 time=77.2 ms
64 bytes from 10.0.0.24: icmp_seq=4 ttl=126 time=74.4 ms

root@localhost:~# tracepath 10.0.0.24
 1?: [LOCALHOST]                      pmtu 1500
 1:  10.0.1.2                                              0.511ms
 1:  10.0.1.2                                              0.330ms
 2:  10.0.1.2                                              0.442ms pmtu 1436
 2:  10.0.1.2                                              0.452ms pmtu 1422
 2:  10.0.0.24                                            74.666ms reached
     Resume: pmtu 1422 hops 2 back 3
```

以上で構築は完了です。

## まとめ

FRRoutingでBGPとVRRPを活用することで、どちらかのVPNインスタンスに障害があった場合でも動的に経路変更を行うことができるようになりました。
高可用性が求められる通信などでのユースケース等に利用していただければと思います。

# 関連記事

アカマイ・テクノロジーズ合同会社はQiitaでAkamai's cloud computing services関連など開発者向けの記事を掲載しております。

https://qiita.com/xenbase/items/52e2956a64cedc772bd9