VyOSとVRRPで冗長化されたルーターを作る

VyOSで一つのグローバルIPを配下のローカルIPアドレスで共有する、いわゆる普通のブロードバンドルーター的な動作をするルータを作ってみます。

ただし、1台だけで構築した場合、そのサーバに何らかの障害が起きると、配下のサーバは通信できなくなってします。

そこで、登場するのがVRRPです。
設定手順に重点を置き、詳細は割愛しますが、VRRPを利用することで、2台以上のサーバがお互いに死活監視を行い、
常に一台だけが特定のIPアドレスを握ることで、全体として稼働し続けるルーターを構築することができます。


# IPアドレス構成

以下のようなIPアドレスの構成とします

| ホスト名   |   グローバルIP(eth0)  |  ローカルIP(eth1)  |
|:----------|:----------------:|:---------------|
| router-01 | 198.51.100.172/28 | 192.168.0.252/24	|
| router-02 | 198.51.100.173/28 | 192.168.0.253/24	|
| 仮想IP     | 198.51.100.174/28 | 192.168.0.254/24 |


# 通常のインターフェース設定

それぞれ以下のようにすでにIPアドレスが設定されている状態にします。

## router-01

```
interfaces {
    ethernet eth0 {
        address 198.51.100.172/28
        hw-id 9c:a3:ba:31:92:f8
    }
    ethernet eth1 {
        address 192.168.0.252/24
        hw-id 9c:a3:ba:31:12:7c
    }
    loopback lo {
    }
}
```

## router-02

```
interfaces {
    ethernet eth0 {
        address 198.51.100.173/28
        hw-id 9c:a3:ba:31:3b:6a
    }
    ethernet eth1 {
        address 192.168.0.253/24
        hw-id 9c:a3:ba:31:20:34
    }
    loopback lo {
    }
}
```

# 仮想IPアドレスとVRRPの設定

VRRPの設定と、マスタの時に握る仮想IPアドレスを設定します。
全てのルータに共通の設定を流し込むだけでOKです。

```
configure

set interface ethernet eth0 vrrp vrrp-group 100
set interface ethernet eth0 vrrp vrrp-group 100 advertise-interval 1
set interface ethernet eth0 vrrp vrrp-group 100 preempt false
set interface ethernet eth0 vrrp vrrp-group 100 virtual-address 198.51.100.174/28
set interface ethernet eth0 vrrp vrrp-group 100 sync-group syncgroup01

set interface ethernet eth1 vrrp vrrp-group 100
set interface ethernet eth1 vrrp vrrp-group 100 advertise-interval 1
set interface ethernet eth1 vrrp vrrp-group 100 preempt false
set interface ethernet eth1 vrrp vrrp-group 100 virtual-address 192.168.0.254/24
set interface ethernet eth1 vrrp vrrp-group 100 sync-group syncgroup01

commit
save
exit
```


## 動作確認

それぞれのサーバのシェルで `show vrrp` すると以下のように、一台がマスタ、残りがバックアップになっていることがわかります。

以下の場合では、router−01がバックアップ、router-02がマスタになっており、仮想IPアドレスも、router-02が握っていることが確認できます。

### router-01

```
vyos@router-01:~$ show vrrp
                                 RFC        Addr   Last        Sync
Interface         Group  State   Compliant  Owner  Transition  Group
---------         -----  -----   ---------  -----  ----------  -----
eth0              100    BACKUP  no         no     18s         syncgroup01
eth1              100    BACKUP  no         no     18s         syncgroup01
```

```
vyos@router-01:~$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 9c:a3:ba:31:92:f8 brd ff:ff:ff:ff:ff:ff
    inet 198.51.100.172/28 brd 198.51.100.175 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::9ea3:baff:fe31:92f8/64 scope link
       valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 9c:a3:ba:31:12:7c brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.252/24 brd 192.168.0.255 scope global eth1
       valid_lft forever preferred_lft forever
    inet6 fe80::9ea3:baff:fe31:127c/64 scope link
       valid_lft forever preferred_lft forever
```

### router-02

```
vyos@router-02:~$ show vrrp
                                 RFC        Addr   Last        Sync
Interface         Group  State   Compliant  Owner  Transition  Group
---------         -----  -----   ---------  -----  ----------  -----
eth0              100    MASTER  no         no     14s         syncgroup01
eth1              100    MASTER  no         no     12s         syncgroup01
```

```
vyos@router-02:~$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 9c:a3:ba:31:3b:6a brd ff:ff:ff:ff:ff:ff
    inet 198.51.100.173/28 brd 198.51.100.175 scope global eth0
       valid_lft forever preferred_lft forever
    inet 198.51.100.174/28 scope global secondary eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::9ea3:baff:fe31:3b6a/64 scope link
       valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 9c:a3:ba:31:20:34 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.253/24 brd 192.168.0.255 scope global eth1
       valid_lft forever preferred_lft forever
    inet 192.168.0.254/24 scope global secondary eth1
       valid_lft forever preferred_lft forever
    inet6 fe80::9ea3:baff:fe31:2034/64 scope link
       valid_lft forever preferred_lft forever
```

# NAT (IP masquarade) の設定

上記まででは、IPアドレスを持っているだけで、実際に配下のサーバがインターネットと通信するためにはNATの設定が必要です。
この設定に関してはVRRPを使わない場合と同様です。

```
configure

set nat source rule 100
set nat source rule 100 description "masquarade"
set nat source rule 100 outbound-interface eth0
set nat source rule 100 translation address 198.51.100.174
set nat source rule 100 source address 192.168.0.0/24

commit
save
exit
```

# 動作確認

配下に設置したサーバからインターネット上のサーバにpingを送りながらそれぞれのルーターを再起動してみましたが、
切り替えのタイミングで遅延が発生すルものの、継続して通信できていることが確認できます。