Balanceamento de links (“resolvido” problemas de sites seguros e conexões estabelecidas)
Posted by makoto on September 22, 2009
Finalmente chegamos à um consenso quanto ao esquema de balanceamento.
O problema que estávamos tentando resolver era relativo à sites seguros e/ou sites que davam problema com conexão estabelecida. Para resolver o problema, tentamos usar iptables, iproute2 e o pf. Com o iptables e o iproute2, vimos que eles balanceavam links ou serviços, não tratando os problemas de site seguro e/ou os de conexão estabelecida.
Os testes com o iptables e iproute2 foram :
http://www.dicas-l.com.br/dicas-l/20070327.php
http://lartc.org/howto/lartc.rpdb.multiple-links.html#AEN298
ip route add default scope global nexthop via $P1 dev $IF1 weight 1 nexthop via $P2 dev $IF2 weight 1
Com o pf, descobrimos o sticky-address. Funcionou para conexões estabelecidas, funcionou com donwloads e funcionou o balanceamento. O único problema, foi que para que isso fosse possível, tivemos que criar uma regra que liberasse as conexões apenas dos hosts que não estivessem nenhuma estabelecida.
A script faria mais ou menos o seguinte:
Através de #pfctl -sa | grep states vemos os hosts que estão com conexões estabelecidas. Temos que arranjar uma forma de dar um flush em conexões que estão estabelecidas ,mas ociosas. Nessas conexões, damos um #pfctl -K <host | network>. Assim, cada nova conexão teria um gw diferente, por mais que tivesse em sticky-address, não segurando um link ocioso. O único problema é que ainda não conseguimos deixar essa script funcional, apenas conseguimos deduzir uma lógica.
Como último recurso, apelamos para a tabela de rotas. Para sites seguros e aqueles sites de conexão estabelecida, definimos uma rota de saída; assim, para esses sites, o link sempre será o mesmo.
Criamos um pf.conf com round-robin normalmente (nesse caso, nem precisa do sticky-address).
Poderia ser algo do tipo:
lan_net = “<rede_interna>”
int_if = “<nic1>”
ext_if2 = “<nic2>”
ext_if1 = “<nic3>”
ext_gw1 = “<end_gw1>”
ext_gw2 = “<end_gw2>”
sites_seguros= “{ <end_sites> }”
# nat
nat on $ext_if1 from $lan_net to any -> ($ext_if1)
nat on $ext_if2 from $lan_net to any -> ($ext_if2)
#permite tráfego da rede nateada
pass out on $int_if from any to $lan_net
pass in quick on $int_if from $lan_net to $int_if
#Rota estática para sites_seguros
pass in quick on $int_if route-to ($ext_if1 $ext_gw1) proto tcp from $lan_net to $sites_seguros flags S/SA modulate state label banco
#faz balanceamento de carga no trafego da rede interna.
pass in on $int_if route-to { ($ext_if1 $ext_gw1), ($ext_if2 $ext_gw2) } round-robin proto tcp from $lan_net to any keep state
#balanceamento de carga em pacotes udp e icmp vindos da rede interna
pass in on $int_if route-to { ($ext_if1 $ext_gw1), ($ext_if2 $ext_gw2) } round-robin proto { udp, icmp } from $lan_net to any keep state
# regras gerais “pass out” para as interfaces externas
pass out on $ext_if1 proto tcp from any to any flags S/SA modulate state
pass out on $ext_if1 proto { udp, icmp } from any to any keep state
pass out on $ext_if2 proto tcp from any to any flags S/SA modulate state
pass out on $ext_if2 proto { udp, icmp } from any to any keep state
# roteia pacotes de qualquer IP na $ext_if0 para $ext_gw0, $ext_if1 para $ext_gw1 e
# $ext_if2 e $ext_gw2
pass out on $ext_if1 route-to ($ext_if2 $ext_gw2) from $ext_if2 to any
pass out on $ext_if2 route-to ($ext_if1 $ext_gw1) from $ext_if1 to any
Pronto, até o momento, não encontramos em lugar algum solução melhor para o caso.
eduardo said
makotaum, já tentou o ifconfig na porta 22 logado como sudo com rede falsa?
abraço
vitoria said
oiiiiiiiiiiii