【2023年9月版】RHEL9.2で作る障害時自動切替機能付の冗長化された簡易ルーター【VRRP】

# はじめに

障害時に自動切替機能付の冗長化された簡易ルーターをLinuxで構築する勉強したいな。。。

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

# 環境

- RHEL9.2
- RHEL9.2のルーターは２台
    - rhel01
        - デフォルトゲートウェイ 192.168.0.254
        - eth0
            - インターネット側インターフェイス
            - 192.168.0.100/24
        - eth1
            - 内側インターフェイス
            - 10.10.10.253/24
    - rhel02
        - デフォルトゲートウェイ 192.168.0.254
        - eth0
            - インターネット側インターフェイス
            - 192.168.0.101/24
        - eth1
            - 内側インターフェイス
            - 10.10.10.252/24
- 冗長化のための仮想IPは 10.10.10.254

```plantuml
@startuml

cloud "Internet" as net

node "Internet Router\n192.168.0.254" as router

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

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

node "NAT Gateway RHEL02 (BACKUP)" {
  rectangle "eth1\n10.10.10.252/24" as eth1B
  rectangle "eth0\n192.168.0.101/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
eth0B --> router

router --> net
@enduml
```

# 構築

## RHEL01

```shell
# NAPT(IPマスカレード)のために firewalld のインストール、サービスとして登録
sudo yum install firewalld -y
sudo systemctl start firewalld
sudo systemctl enable firewalld

# パッケットのフォワードができるようにカーネルパラメータを設定
echo "net.ipv4.ip_forward = 1" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

# ルーターとして動作するように firewalld を設定
sudo firewall-cmd --permanent --zone=external --add-masquerade
sudo firewall-cmd --permanent --change-interface=eth0 --zone=external
sudo firewall-cmd --permanent --change-interface=eth1 --zone=trusted
sudo firewall-cmd --reload

# VRRPのために keepalived をインストール
sudo dnf install -y keepalived

# VRRPの冗長化構成を keepalived で設定
sudo tee /etc/keepalived/keepalived.conf <<EOF >/dev/null
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 150
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 12345
    }
    virtual_ipaddress {
        10.10.10.254
    }
}
EOF

# vrrp の通信ができるように firewalld を設定
sudo firewall-cmd --permanent --zone=external --add-rich-rule='rule protocol value="vrrp" accept'
sudo firewall-cmd --reload

# keepalived をサービスとして登録
sudo systemctl enable keepalived
sudo systemctl start keepalived
```

## RHEL02

RHEL01とほぼ同じ。
keepalived の vrrp の設定を、BACKUP として設定。

```
# NAPT(IPマスカレード)のために firewalld のインストール、サービスとして登録
sudo yum install firewalld -y
sudo systemctl start firewalld
sudo systemctl enable firewalld

# パッケットのフォワードができるようにカーネルパラメータを設定
echo "net.ipv4.ip_forward = 1" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

# ルーターとして動作するように firewalld を設定
sudo firewall-cmd --permanent --zone=external --add-masquerade
sudo firewall-cmd --permanent --change-interface=eth0 --zone=external
sudo firewall-cmd --permanent --change-interface=eth1 --zone=trusted
sudo firewall-cmd --reload

# VRRPのために keepalived をインストール
sudo dnf install -y keepalived

# VRRPの冗長化構成を keepalived で設定
sudo tee /etc/keepalived/keepalived.conf <<EOF >/dev/null
vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 150
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 12345
    }
    virtual_ipaddress {
        10.10.10.254
    }
}
EOF

# vrrp の通信ができるように firewalld を設定
sudo firewall-cmd --permanent --zone=external --add-rich-rule='rule protocol value="vrrp" accept'
sudo firewall-cmd --reload

# keepalived をサービスとして登録
sudo systemctl enable keepalived
sudo systemctl start keepalived
```

# さいごに

かんたんでしたね

# 参考資料

- [RED HAT ENTERPRISE LINUX 7 >
Keepalived および HAProxy の設定 > ロードバランサーの管理 > 第2章 Keepalived の概要](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/load_balancer_administration/ch-keepalived-overview-vsa#doc-wrapper)
- [keepalived を使用してロードバランサーを設定する方法](https://access.redhat.com/ja/solutions/6999376)
- [【図解】VRRPの仕組みと構成、切り替わり時間（プリエンプト）](https://milestone-of-se.nesuke.com/nw-basic/fhr-redundancy/vrrp/)
- [keepalived講習会](https://interu.hatenablog.com/entry/20080916/1221494197)
- [Manpages of keepalived in Debian unstable](https://manpages.debian.org/unstable/keepalived/keepalived.8.en.html)
- [Manpages of keepalived in Debian unstable > keepalived.conf](https://manpages.debian.org/unstable/keepalived/keepalived.conf.5.en.html)