【2023年8月版】VyOSで作る障害時自動切替機能付のマルチホーム環境の簡易ルーター【VRRP】

# はじめに

障害時に自動切替機能付のマルチホーム環境で、冗長化されたLinuxでルーター構築する勉強したいな。。。

そうだ、ChatGPT先生に教えてもらいながら構築しよう

※ 単にマルチホーム環境のルーター構築については以下を参照

[【2023年8月版】VyOSで作るマルチホーム環境の簡易ルーター【VRRP】](https://qiita.com/nouernet/items/7497d609d22fb126371c)

# 環境

- VyOS13
  インストールは以下の記事を参考に
  [【2023年8月版】VyOSインストールiso作成から、ESXi7/8へのインストール](https://qiita.com/nouernet/items/a41b40dad2efea7b0efc)
- VyOSのルーターは２台
    - vyosgw01
        - デフォルトゲートウェイ 192.168.0.1
        - eth0
            - インターネット側インターフェイス
            - 192.168.0.100/24
        - eth1
            - 内側インターフェイス
            - 10.10.10.253/24
    - vyosgw02
        - デフォルトゲートウェイ 192.168.100.1
        - eth0
            - インターネット側インターフェイス
            - 192.168.100.100/24
        - eth1
            - 内側インターフェイス
            - 10.10.10.252/24
- 冗長化のための仮想IPは 10.10.10.254

```plantuml
@startuml

cloud "Internet" as net

node "Internet Router (MASTER)" as router_master
node "Internet Router (BACKUP)" as router_backup

node "NAT Gateway vyosgw01 (MASTER)" {
  rectangle "eth1\n10.10.10.253/24" as eth1A
  rectangle "eth0\n192.168.0.1/24" as eth0A
}

node "NAT Gateway VIP" {
  rectangle "10.10.10.254" as vip
}

node "NAT Gateway vyosgw02 (BACKUP)" {
  rectangle "eth1\n10.10.10.252/24" as eth1B
  rectangle "eth0\n192.168.100.100/24" as eth0B
}

rectangle "Internal Network (10.10.10.0/24)" {
  node "Clinet 1" as C1
  node "Client 2" as C2
}

C1 --> vip
C2 --> vip

vip --> eth1A
vip -[dotted]-> eth1B

eth1A --> eth0A
eth1B --> eth0B

eth0A --> router_master
eth0B --> router_backup

router_master --> net
router_backup --> net
@enduml
```

# 構築

## vyosgw01

- チェック用スクリプトを作成する

```/config/scripts/vrrp-check.sh
#!/bin/bash
ping -c3 8.8.8.8 > /dev/null 2>&1
if [ $? -ne 0 ]; then
    exit 1
fi
exit 0
```

```terminal
vim /config/scripts/vrrp-check.sh
chmod +x /config/scripts/vrrp-check.sh 
```

- 設定を流し込む

```
conf
set system host-name vyosgw01
set interfaces ethernet eth0 address 192.168.0.100/24
set interfaces ethernet eth1 address 10.10.10.253/24
set high-availability vrrp group vyosgw vrid 10
set high-availability vrrp group vyosgw interface eth1
set high-availability vrrp group vyosgw virtual-address 10.10.10.254/24
set high-availability vrrp group vyosgw priority 200
set high-availability vrrp group vyosgw advertise-interval 1
#set high-availability vrrp group vyosgw no-preempt
set high-availability vrrp group vyosgw health-check script /config/scripts/vrrp-check.sh
set high-availability vrrp group vyosgw health-check interval 30
set high-availability vrrp group vyosgw health-check failure-count 2
set protocols static route 0.0.0.0/0 next-hop 192.168.0.1
set system name-server '8.8.8.8'
set system ipv6 disable
set system time-zone 'Asia/Tokyo'
set service ssh
set nat source rule 10 outbound-interface 'eth0'
set nat source rule 10 source address '0.0.0.0/0'
set nat source rule 10 translation address masquerade
commit
save
```

## vyosgw02

- 設定を流し込む

```
conf
set system host-name vyosgw02
set interfaces ethernet eth0 address 192.168.100.100/24
set interfaces ethernet eth1 address 10.10.10.252/24
set high-availability vrrp group vyosgw vrid 10
set high-availability vrrp group vyosgw interface eth1
set high-availability vrrp group vyosgw virtual-address 10.10.10.254/24
set high-availability vrrp group vyosgw priority 100
set high-availability vrrp group vyosgw advertise-interval 1
#set high-availability vrrp group vyosgw no-preempt
set protocols static route 0.0.0.0/0 next-hop 192.168.100.1
set system name-server '8.8.8.8'
set system ipv6 disable
set system time-zone 'Asia/Tokyo'
set service ssh
set nat source rule 10 outbound-interface 'eth0'
set nat source rule 10 source address '0.0.0.0/0'
set nat source rule 10 translation address masquerade
commit
save
```

# 確認

## 設定
### vyosgw01

```
$ show vrrp
Name    Interface      VRID  State      Priority  Last Transition
------  -----------  ------  -------  ----------  -----------------
vyosgw  eth1             10  MASTER          200  29s
```

```
$ show int
Codes: S - State, L - Link, u - Up, D - Down, A - Admin Down
Interface        IP Address                        S/L  Description
---------        ----------                        ---  -----------
eth0             192.168.0.100/24                  u/u  
eth1             10.10.10.253/24                   u/u  
                 10.10.10.254/24                       
lo               127.0.0.1/8                       u/u  
```

### vyosgw02

```
$ show vrrp
Name    Interface      VRID  State      Priority  Last Transition
------  -----------  ------  -------  ----------  -----------------
vyosgw  eth1             10  BACKUP          100  20s
```

```
$ show int
Codes: S - State, L - Link, u - Up, D - Down, A - Admin Down
Interface        IP Address                        S/L  Description
---------        ----------                        ---  -----------
eth0             192.168.100.100/24                u/u  
eth1             10.10.10.252/24                   u/u  
lo               127.0.0.1/8                       u/u  
```

## 動作

`vyosgw02` から `vyosgw01` への接続が失われたり、 `vyosgw01` のインターネット(8.8.8.8)へのヘルスチェックが失敗すると、自動的に `vyosgw02` へ切り替わることを確認する。

# さいごに

かんたんでしたね

# 参考資料

[VyOS1.3 公式ドキュメント - High availability](https://docs.vyos.io/en/equuleus/configuration/highavailability/index.html)