Edited at

keepaliveでセグメントを超える時の設定ハマりどころ

More than 1 year has passed since last update.

初心者がkeepaliveを設定していたらドハマりしたのでメモ。


環境


  • CentOS6.9

  • keepalived.x86_64 1.2.13-5.el6_6


iptables

iptables -A FORWARD -j REJECT を打ち消す

セグメントを超えた負荷分散の場合、パケットをフォワードする必要がある。

その際、CentOS6のデフォルト設定のiptablesではWebサーバからの帰りパケットがリジェクトされてしまう。

iptables -A FORWARD -j ACCEPTはスマートじゃないので、必要な分だけ許可。

以下はeth1(外)側のネットワークからeth2(内)側へhttp通信する場合の記述

-A FORWARD -i eth1 -o eth2 -p tcp --sport 80 -j ACCEPT  # <- 追記

-A FORWARD -j REJECT --reject-with icmp-host-prohibited # <- 元からある

net.ipv4.ip_forward=1を設定するのは様々なサイトで情報があったが、この設定は無くてハマった。

そんなこと記載する価値もない常識だという可能性もあるが…


設定ファイル

括弧の前には空白必須

本当は必須じゃないかもしれないけれど、空白置いといて損はない。

なおセグメントには一切関係ない。


NG

urlの後ろに空白を入れず括弧をした場合、何故か一番目のreal_serverだけ反映される。 何故だ…

virtual_server 172.16.0.5 80 {

lb_algo wlc
lb_kind NAT

real_server 192.168.254.132 80 {
HTTP_GET {
url{
path /
status_code 200
}
}
}
real_server 192.168.254.133 80 {
HTTP_GET {
url{
path /
status_code 200
}
}
}
real_server 192.168.254.134 80 {
HTTP_GET {
url{
path /
status_code 200
}
}
}
}
---------------------------------------------------------------------
[vagrant@LVS1 ~]$ sudo ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.16.0.5:80 wlc
-> 192.168.254.132:80 Masq 1 0 0


OK

virtual_server 172.16.0.5 80 {

lb_algo wlc
lb_kind NAT

real_server 192.168.254.132 80 {
HTTP_GET {
url {
path /
status_code 200
}
}
}
real_server 192.168.254.133 80 {
HTTP_GET {
url {
path /
status_code 200
}
}
}
real_server 192.168.254.134 80 {
HTTP_GET {
url {
path /
status_code 200
}
}
}
}
---------------------------------------------------------------------
[vagrant@LVS1 ~]$ sudo ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
UDP 172.16.0.5:80 wlc
-> 192.168.254.132:80 Masq 1 0 0
-> 192.168.254.133:80 Masq 1 0 0
-> 192.168.254.134:80 Masq 1 0 0