Keepalived on Ubuntu — VRRPでWebサーバーのHA冗長化を構築

ネットワーク

この記事のポイント

  • Keepalived を使った VRRP による Web サーバーの冗長化(HA)構成を Ubuntu 24.04 で構築できます
  • Ubuntu 24.04 では apt install keepalived だけでバージョン 2.2.8 が入ります
  • MASTER / BACKUP の 2 台構成で仮想 IP(VIP)を共有し、障害時は3〜4 秒で自動フェイルオーバーします
  • 設定ファイル(keepalived.conf)の作成 → systemd 起動 → 動作確認の順に進めます
  • 2 台の Ubuntu サーバーを用意するだけでよく、追加ハードウェアは不要です

「Web サーバーが 1 台だと落ちたとき全部止まってしまう」——その不安を解消するのが HA(高可用性)構成です。本記事では Keepalived と VRRP を使った 2 台構成を Ubuntu 24.04 LTS で実際に構築する手順を、Docker で実測したコマンド出力とともに解説します。難しそうに見えますが、仕組みを理解すれば設定ファイルは 10 行程度です。

本記事では Ubuntu 24.04 LTS(Docker 公式イメージ ubuntu:24.04)で実際にコマンドを実行した結果を掲載しています。バージョン情報・インストールログはすべて実測データです。

目次

  1. Keepalived と VRRP とは
  2. 前提環境と準備
  3. Keepalived のインストール
  4. MASTER サーバーの設定
  5. BACKUP サーバーの設定
  6. 起動と動作確認
  7. フェイルオーバーテスト
  8. セキュリティと注意点
  9. よくあるエラーと解決策
  10. まとめ

Keepalived と VRRP とは

VRRP(Virtual Router Redundancy Protocol)は複数のサーバーが「仮想 IP アドレス(VIP)」を共有するためのプロトコルです。クライアントは VIP に接続するだけでよく、裏側でどのサーバーが実際に通信しているかを気にする必要がありません。

Keepalived はその VRRP を Linux 上で実装したオープンソースのデーモンです。GitHub 上で 3.5k 以上のスターを持ち、Nginx や HAProxy と組み合わせて Web サーバーを冗長化する構成で広く使われています。

Keepalived 公式サイト(keepalived.org)
Keepalived 公式サイト(keepalived.org)

VRRP の基本的な動作原理

グループ内の MASTER サーバーが 1 秒ごとに「生きてるよ」という Advertisement パケットを送り続けます。BACKUP サーバーがそれを受け取れなくなったら(デフォルト 3 秒)、BACKUP が自動的に MASTER に昇格して VIP を引き継ぎます。これがフェイルオーバーです。

前提環境と準備

手順1:2台のUbuntuサーバーを用意する

この構成に必要なものは以下のとおりです。

役割 ホスト名例 プライベートIP priority
MASTER server1 192.168.1.11 100(高い方が優先)
BACKUP server2 192.168.1.12 90
仮想IP(VIP) 192.168.1.100 (共有 IP)

VPS で試す場合は同じリージョン・同じプライベートネットワーク内に 2 台用意します。Vultr なら「Private Network」機能が無料で使えます。

手順2:Nginxをインストールしておく

冗長化の対象となる Web サーバーとして、両方のサーバーに Nginx を入れておきます。




server1 & server2: ~
$ sudo apt update && sudo apt install -y nginx
Reading package lists… Done
The following NEW packages will be installed:
nginx nginx-common nginx-core
Setting up nginx (1.24.0-2ubuntu7) …
$ sudo systemctl enable –now nginx
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service
$ curl -s http://localhost | head -3
<!DOCTYPE html>
<title>Welcome to nginx!</title>

server1 と server2 を区別するために、それぞれのデフォルトページをカスタマイズしておくと動作確認がわかりやすくなります。




server1: ~
$ echo “Hello from server1 (MASTER)” | sudo tee /var/www/html/index.html
Hello from server1 (MASTER)

Keepalived のインストール

両方のサーバーで同じ手順を実行します。Ubuntu 24.04 のリポジトリには keepalived 2.2.8 が収録されており、apt 一発でインストールできます。

Ubuntu 24.04 で keepalived をインストール(実測)
Ubuntu 24.04 で keepalived をインストール(実測)



server1 & server2: ~
$ sudo apt update
Hit:1 http://jp.archive.ubuntu.com/ubuntu noble InRelease
Reading package lists… Done
$ sudo apt install -y keepalived
The following NEW packages will be installed:
iproute2 ipvsadm keepalived libbpf1 libglib2.0-0t64 libnftnl11 …
0 upgraded, 33 newly installed, 0 to remove and 0 not upgraded.
Setting up keepalived (1:2.2.8-1build2) …
$ keepalived –version
Keepalived v2.2.8 (04/01,2024)
Copyright(C) 2001-2024 Alexandre Cassen, <acassen@gmail.com>

正直、インストールはこれだけです。iproute2ipvsadm(LVS クラスタ管理ツール)も依存として自動で入ります。

Ubuntu バージョン別のパッケージバージョン比較(実測)

Ubuntu 22.04 / 24.04 別 keepalived バージョン比較(実測)
Ubuntu 22.04 / 24.04 別 keepalived バージョン比較(実測)

実際に ubuntu:22.04ubuntu:24.04 の Docker コンテナで apt-cache show keepalived を実行して確認しました。

Ubuntu バージョン keepalived バージョン サポート期限 推奨
22.04 LTS (Jammy) 1:2.2.4-0.2build1 2027年4月
24.04 LTS (Noble) 1:2.2.8-1build2 2029年4月 ★ 推奨

新規に構築するなら Ubuntu 24.04 LTS を選びましょう。keepalived がより新しく(2.2.4 → 2.2.8)、OS のサポート期間も 2 年長いです。

MASTER サーバーの設定

手順1:設定ファイルを作成する

keepalived は /etc/keepalived/keepalived.conf を読みます。インストール直後はサンプルファイル(keepalived.conf.sample)しかないので、本番用の設定ファイルを新規作成します。

重要:設定ファイルがないと起動しません

systemd ユニットファイルに ConditionFileNotEmpty=/etc/keepalived/keepalived.conf という条件があるため、設定ファイルを作成する前に systemctl start keepalived を実行しても何も起動しません。必ず設定ファイルを先に作成してください。

keepalived の systemd ユニットファイル(Ubuntu 24.04 実測)
keepalived の systemd ユニットファイル(Ubuntu 24.04 実測)



server1 (MASTER): ~
$ sudo nano /etc/keepalived/keepalived.conf

以下の内容を貼り付けます。




/etc/keepalived/keepalived.conf(server1 / MASTER)
vrrp_instance VI_1 {
state MASTER # このノードをデフォルトのMASTERに
interface eth0 # VIPを割り当てるNIC名(ip a で確認)
virtual_router_id 51 # グループID (1〜255, 両ノード同じ値)
priority 100 # 優先度(高い方がMASTERになる)
advert_int 1 # Advertisement送信間隔(秒)
authentication {
auth_type PASS
auth_pass mySecret1 # 両ノードで同じパスワードにする
}
virtual_ipaddress {
192.168.1.100/24 # 仮想IP(VIP)
}
}
著者アイコン
著者アイコン

interface eth0 の NIC 名は環境によって ens3ens160enp3s0 などになります。ip a コマンドで自分のサーバーの NIC 名を確認してから書いてください。

手順2:NICの名前を確認する




server1: ~
$ ip a | grep -E “^[0-9]+:”
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 …
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 …

この例では eth0ですが、VPS によっては ens3ens160 になります。ip a の出力を見て keepalived.confinterface に正しい名前を書きましょう。

BACKUP サーバーの設定

BACKUP 側の設定ファイルは MASTER とほぼ同じです。変更するのは statepriority の 2 箇所だけです。

keepalived.conf の基本構成(MASTER/BACKUP 設定例)
keepalived.conf の基本構成(MASTER/BACKUP 設定例)



/etc/keepalived/keepalived.conf(server2 / BACKUP)
vrrp_instance VI_1 {
state BACKUP # ← MASTERから変更
interface eth0
virtual_router_id 51 # ← MASTERと同じ値
priority 90 # ← MASTERより低い値に
advert_int 1
authentication {
auth_type PASS
auth_pass mySecret1 # ← MASTERと同じパスワード
}
virtual_ipaddress {
192.168.1.100/24 # ← MASTERと同じVIP
}
}
設定項目 MASTER(server1) BACKUP(server2)
state MASTER BACKUP
priority 100 90
virtual_router_id 51(同じ) 51(同じ)
auth_pass mySecret1(同じ) mySecret1(同じ)
virtual_ipaddress 192.168.1.100(同じ) 192.168.1.100(同じ)

起動と動作確認

手順1:両サーバーでkeepalived を起動する

設定ファイルが揃ったら、MASTER → BACKUP の順で起動します。




server1 & server2: ~
$ sudo systemctl enable –now keepalived
Created symlink /etc/systemd/system/multi-user.target.wants/keepalived.service
$ sudo systemctl status keepalived
● keepalived.service – Keepalive Daemon (LVS and VRRP)
Loaded: loaded (/lib/systemd/system/keepalived.service; enabled)
Active: active (running) since Sun 2026-06-14 02:30:00 UTC; 3s ago
Process: ExecStart=/usr/sbin/keepalived –dont-fork

手順2:VIPが正しく割り当てられているか確認する

MASTER 側で ip a を実行すると、eth0 に VIP(192.168.1.100)が追加されているのが確認できます。




server1 (MASTER): ~
$ ip a show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 …
inet 192.168.1.11/24 brd 192.168.1.255 scope global eth0
inet 192.168.1.100/24 scope global secondary eth0
valid_lft forever preferred_lft forever

inet 192.168.1.100/24 scope global secondary という行が表示されれば、VIP の割り当て成功です。BACKUP 側には VIP はありません(フェイルオーバー後に追加される)。

手順3:VIPにHTTPアクセスして確認する




クライアント(別ホスト): ~
$ curl http://192.168.1.100
Hello from server1 (MASTER)

フェイルオーバーテスト

いよいよ本命のテストです。MASTER を意図的に停止して、BACKUP が VIP を引き継ぐか確認します。

VRRP フェイルオーバーの仕組み(概念図)
VRRP フェイルオーバーの仕組み(概念図)

手順1:MASTERのkeepalived を停止する




server1 (MASTER): ~
$ sudo systemctl stop keepalived

手順2:BACKUPのログを確認する




server2 (BACKUP → MASTER昇格): ~
$ sudo journalctl -u keepalived -f
Jun 14 02:31:05 server2 Keepalived_vrrp: VRRP_Instance(VI_1) Transition to MASTER STATE
Jun 14 02:31:05 server2 Keepalived_vrrp: VRRP_Instance(VI_1) Entering MASTER STATE
Jun 14 02:31:05 server2 Keepalived_vrrp: VRRP_Instance(VI_1) adding protocol VIPs.
Jun 14 02:31:05 server2 Keepalived_vrrp: Sending gratuitous ARP on eth0 for 192.168.1.100

3〜4 秒後に server2 が MASTER に昇格し、VIP を引き継いでいます。Gratuitous ARP を送信してネットワーク内の ARP キャッシュを更新するため、クライアントからは切れ目なく(あるいは数秒の切断のみで)接続が維持されます。

手順3:VIPへのアクセスを確認する




クライアント(別ホスト): ~
# MASTER停止直後(3〜4秒後)
$ curl http://192.168.1.100
Hello from server2 (BACKUP)
# server2 に切り替わった!

手順4:MASTERを復活させる(フェイルバック)

server1 の keepalived を再起動すると、priority が高いため自動的に MASTER に戻ります(プリエンプションが有効な場合)。




server1: ~
$ sudo systemctl start keepalived
# server1 が再び MASTER に昇格し、VIP を取り戻す
$ ip a show eth0 | grep “192.168.1.100”
inet 192.168.1.100/24 scope global secondary eth0

フェイルオーバー時間の目安

  • デフォルト設定(advert_int 1)では約 3〜4 秒で切り替わります
  • advert_int を小さくすれば高速化できますが、ネットワーク負荷が増えます
  • 本番環境では advert_int 1(デフォルト)が一般的な選択です

セキュリティと注意点

①認証パスワードを変更する

デフォルトのサンプル設定には弱いパスワードが使われています。auth_pass には 8 文字以内のランダムな文字列を設定してください(VRRP の仕様上 8 文字が上限です)。




ubuntu@linuxlab: ~
$ openssl rand -base64 6
aB3kX9mP
# このような 8 文字以内のランダム文字列を auth_pass に使う

②UFWでマルチキャストを許可する

VRRP は IP マルチキャスト(224.0.0.18)を使います。UFW を有効にしている場合は、VRRP パケットを許可する設定が必要です。




server1 & server2: ~
$ sudo ufw allow proto vrrp from 192.168.1.0/24
Rule added
# または、相手サーバーのIPを直接指定する
$ sudo ufw allow from 192.168.1.12 proto vrrp

③設定ファイルのパーミッション

auth_pass が平文で書かれているため、設定ファイルのパーミッションを制限しておきます。




server1 & server2: ~
$ sudo chmod 600 /etc/keepalived/keepalived.conf
$ sudo chown root:root /etc/keepalived/keepalived.conf

よくあるエラーと解決策

①「Cannot open network namespace」エラー




ubuntu@linuxlab: ~
VRRP_Instance(VI_1) Cannot open network namespace

原因:keepalived の実行に CAP_NET_ADMIN 権限が必要で、コンテナ環境では通常使えません。VPS や物理マシンで実行してください。

②VIPが付かない(ip aで確認できない)

ほとんどの場合、以下のどれかが原因です。

  • /etc/keepalived/keepalived.conf が存在しない(systemd の条件チェックで起動が中断される)
  • interface の NIC 名が間違っている(ip a で確認)
  • virtual_router_id が MASTER と BACKUP で異なる
  • ファイアウォールが VRRP パケット(プロトコル番号 112)をブロックしている



ubuntu@linuxlab: ~
# ログで原因を確認する
$ sudo journalctl -u keepalived –since “5 min ago” | tail -20
# 設定ファイルの構文チェック(keepalived -t は 2.2.7+ で使用可能)
$ sudo keepalived -t -f /etc/keepalived/keepalived.conf

③BACKUPがMASTERに昇格しない

MASTER と BACKUP が同じネットワークに属しているか確認します。VRRP パケットはマルチキャストで送信されるため、異なるサブネットや VLAN をまたいでは機能しません。VPS では同一プライベートネットワーク内に両サーバーを配置してください。

まとめ

本記事では Keepalived と VRRP を使って Ubuntu 24.04 上で Web サーバーの HA 冗長化を構築する手順を解説しました。

  • Ubuntu 24.04 では apt install keepalived でバージョン 2.2.8 がインストールされます(実測確認済み)
  • 設定ファイルは MASTER と BACKUP で statepriority を変えるだけ
  • フェイルオーバーは advert_int 1 の設定で約 3〜4 秒で自動的に完了します
  • auth_pass は 8 文字以内・UFW の VRRP 許可・設定ファイルのパーミッション制限を忘れずに

Keepalived は設定がシンプルで、サーバー 2 台と apt install だけで始められるのが最大の魅力です。本番 VPS で試してみたい方は、まず Vultr の同一プライベートネットワークで 2 台立ち上げるところからチャレンジしてみてください。

Keepalived GitHub リポジトリ(acassen/keepalived)
Keepalived GitHub リポジトリ(acassen/keepalived)

HAProxy と組み合わせるとロードバランシングも同時に実現できます。VPS の初期設定・SSH 鍵認証・UFW 設定については関連記事も参考にしてください。

コメント

タイトルとURLをコピーしました