[FUG-BR] Problema com PF load balance
Diego Linke
gamk em gamk.com.br
Sex Maio 26 08:02:44 BRT 2006
Bom dia pessoal,
Eu estou com um pequeno e importante problema com relacao ao uso de load
balance com PF.
Atualmente uso o PF com funcionabilidade de Load Balance em substituto a
Switchs de load balance Layer 3, sendo alguns cenarios com aplicacoes
que compartilham as sessoes e outras que nao compartilham.
Vamos ao problema:
AMBIENTE:
Basicamente o ambiente de exemplo e' 1 servidor com PF e 3 servidores
com Web Server que nao compartilham sessao.
table <lb> { 10.0.0.1, 10.0.0.2, 10.0.0.3 }
rdr on xl0 inet proto tcp from any to IP_PUBLICO port 80 -> { <lb> }
round-robin sticky-address
pass in quick log on xl0 proto tcp from any to <lb> port 80 flags S/SA
modulate state (src.track 1800)
A opcao "sticky-address" faz com que o PF sempre que redirecione a
conexao para um servidor, crie uma entrada no "Source" (source-track
"pfctl -vs Source"), e que durante a permanencia desta source ele
encaminhe outras requisicoes vindas do mesmo IP para o mesmo servidor web.
A permanencia no "Source", por padrao e' ate' a ultima state existir.
Para que nos incrementamos este valor, devemos alterar o limit
"src.track" (set timeout src.track), eu fiz isso atraves da regra que
libera a conexao.
Resumindo:
O servidor vai fazer load balance entre os servidores na tabela <lb>, e
manter o mesmo servidor para o mesmo cliente em ate 1800 segundos (30
min) depois da ultima state excluida.
PROBLEMA:
Tudo isso descrito acima funciona perfeitamente, o problema comeca
quando temos que eliminar um IP do load balance.
O servidor 10.0.0.2, esta down e precisamos tira-lo do load balance,
neste caso executamos:
pfctl -t lb -T del 10.0.0.2
Neste caso tecnicamente o load balance ficara apenas entre os IPs
10.0.0.1 e 10.0.0.3, porem o problema e' que mesmo nao estando na tabela
<lb>, as requisicoes de clientes que ja estavam na tabela Source
apontando para o IP 10.0.0.2 vao continuar sendo redirecionadas para ele
10.0.0.2 ate expirar os timeout do src.track (no meu caso 30 min), ou
rodando o comando "pfctl -F Source", porem neste ultimo caso perdendo
TODAS as referencias de "sessoes" deste e de outros load balance e
source-tracks, neste firewall.
POSSIVEIS SOLUCOES:
Infelizmente as unicas solucoes que consegui visualizar, e' alterando o
codigo do PF, vamos as sugestoes:
1) Criar algo similar a "pfctl -k" de states para Source.
Neste caso na hora de tirar um servidor do load balance, executariamos:
pfctl -t lb -T del 10.0.0.2
pfctl -PARAMETRO_NOVO 10.0.0.2
2) Fazendo o sticky-address, checar antes de redirecionar se o IP esta
ainda nas opcoes de load balance (no meu caso se esta na tabela <lb>).
Alguem conhece outra alternativa ?
Algum hacker de PF se habilita ? hehehe
Abraços
--
Diego Linke
Public Key: http://www.gamk.com.br/gamk.asc
Mais detalhes sobre a lista de discussão freebsd