RHEL9におけるkeepalived設定メモ

other

Redhut Enterprise Linux 9を使ってsyslogサーバーを構築しているときに、keepalivedを使って仮想IPの設定をしたいのにうまくいかなかったときのメモ。

目的

syslog形式でログを吐く機器があって、別途ログをためるサーバーを構築したかった。

linuxも再起動が必要なカーネルアップデートなども必要になることがあるので、ログの取りこぼしを最大限防ぐには冗長設定が必要だった。

先に結論

keepalivedというものをつかえば一つのIPアドレスを複数のVMで共有できるらしいぞと聞いて設定したがうまくいかなかった。

selinuxを疑ったが、結局はfirewallだった。

前提

OS

$ cat /etc/system-release
Red Hat Enterprise Linux release 9.8 (Plow)

$ uname -r
5.14.0-687.12.1.el9_8.x86_64

selinux

$ getenforce
Enforcing

firewall

$ firewall-cmd --state
running

keepalived

$ sudo dnf install keepalived

$ keepalived --version
Keepalived v2.2.8 (04/04,2023), git commit v2.2.7-154-g292b299e+

ip

MASTER:    172.16.30.45
BACKUP:    172.16.30.46
VirtualIP: 172.16.30.47

keepalivedの設定

MasterとBackupの両サーバーにおいて、/etc/keepalived/keepalived.confに以下のような設定を入れる。MasterとBackupでstateとpriorityだけ異なる形になる。

priorityは数字が大きいほうがMaster。
auth_passは8文字以内にしないと警告が出る。

Master

! Configuration File for keepalived

global_defs {
   notification_email {
     [email protected]
  }
   notification_email_from  [email protected]
   smtp_server smtp.example.com
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass passwrd
    }
    virtual_ipaddress {
        172.16.30.47
    }
}

BACKUP

! Configuration File for keepalived

global_defs {
   notification_email {
     [email protected]
  }
   notification_email_from  [email protected]
   smtp_server smtp.example.com
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass passwrd
    }
    virtual_ipaddress {
        172.16.30.47
    }
}

keepalivedの起動

systemctlで常時起動する。

$ sudo systemctl start keepalived
$ sudo systemctl enable keepalived
$ sudo systemctl status keepalived

selinuxの設定

selinuxをpermissiveに変更するという風に書いてある記事も多いので、(結果的には不要だったが)メモ的にenforcingのままkeepalivedを許可する設定を残しておく。

ポリシーの確認

$ sudo semanage boolean -l | grep keepalived
keepalived_connect_any         (オン   ,   オン)  keepalived が connect any できるようにします

ポリシーの有効化

$ sudo setsebool -P keepalived_connect_any on

これで、keepalivedが接続やVIPの管理、ヘルスチェック用のスクリプト実施などができるようになる。はず。
-Pは永続化

ポートの許可

もしHTTPでのチェックや独自ポートを使う場合は以下の設定も必要とのこと。

$ sudo semanage port -a -t http_port_t -p tcp 8080

Firewall設定

今回のハマりポイントだったfirewall。rich-ruleで許可したつもりがうまく設定されていなかった。結局はリッチルールは不要で、vrrpプロトコルを許可すればいいだけだった。

$ sudo firewall-cmd --permanent --add-protocol=vrrp
$ sudo firewall-cmd --reload

$ sudo firewall-cmd --list-all

確認手順など

journalctl

keepalivedの挙動ログが確認できる。

$ journalctl -u keepalived | grep STATE
$ journalctl -u keepalived -f

ip

MASTER では物理IPに加えて仮想IPが確認できて、BACKUPは物理IPのみ

$ hostname -I

$ ip addr show eth0

tcpdump

$ sudo tcpdump -ni eth0 vrrp

vrrpパケットが届いているか(送出されているか)確認できる。