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パケットが届いているか(送出されているか)確認できる。

