[FUG-BR] RES: RES: Load Balance
Giancarlo Rubio
gianrubio em gmail.com
Quinta Outubro 4 16:48:08 BRT 2007
Sem problemas.
Vou postar um pequeno trecho apenas pois o meu ifstated e muito grande
e a logica vc mesmo faz. Quanto as anchors nao estou achando, mais uma
lida no faq do pf ja resolve. Explicando um pouco, a cada 10 segundos
roda o link_1 e link_2 , testa se os links estao ok (o teste vc mesmo
pode escrever). Caso haja algum erro ele vai para o estado correto e
aciona o script com as macros. Basicamente e isso, use a imaginacao e
teste todos os estados
Leitura de ajuda
http://www.openbsd.org/cgi-bin/man.cgi?query=ifstated&sektion=8
http://www.at.openbsd.org/faq/pf/pt/anchors.html
#####################
link_1 = '( "ping -q -c 1 -w 1 ipmodem > /dev/null && ping -I
ipdainterface -q -c 1 -w 1 ipgateway > /dev/null" every 10)'
link_2 = '( "ping -q -c 1 -w 1 ipmodem > /dev/null && ping -I
ipdainterface -q -c 1 -w 1 ipgateway > /dev/null" every 10 )'
init-state normal
state normal
{
init
{
run 'sh /root/failover.sh normal'
}
if ! $link_1 && $link_2
{
run 'echo "o link 1 caiu, favor verificar." | mail -s
"`/bin/hostname` ifstated: link 1" root'
run 'reboota1.sh' #reboot no modem
set-state link2
}
if $link_1 && !$link_2
{
run 'echo "o link 2 caiu, favor verificar." | mail -s
"`/bin/hostname` ifstated: link 2" root'
run 'reboota2.sh' #reboot no modem
set-state link1
}
}
state link1
{
init
{
run 'sh /root/failover.sh link1
}
if $link_1 && $link_2
{
run 'echo "o link 1 voltou ." | mail -s
"`/bin/hostname` ifstated: link 1" root'
set-state normal
}
if $link_1 && !$link_2
{
run 'echo "o link 2 caiu, favor verificar." | mail -s
"`/bin/hostname` ifstated: link 2" root'
run 'reboota2.sh' #reboot no modem
set-state link1
}
}
#############
Em 03/10/07, Marcio A. Sepp<marcio em zyontecnologia.com.br> escreveu:
>
> Sem querer ser chato neste assunto e nem querendo abusar da boa vontade sua
> Giancarlo. Mas gostaria de, se possível, entender melhor para poder sanar
> uma dificuldade real que tenho:
>
> Aqui tenho 03 links, sendo um com a Brasil Telecom, outro com a Embratel e
> um outro com um provedor local que utiliza um outro circuito da Embratel. O
> tráfego de saída é balanceado (com o round robin), exceto algumas
> tecnologias que necessariamente precisam sair por um único ip.
>
> O que eu gostaria de fazer é deixar as 03 placas de rede externas pingando
> de tempos em tempos para um determinado host, ou uma lista de hosts
> confiáveis e, caso não consiga obter o retorno desejado, redirecionar o
> tráfego dakela interface para as outras ativas.
>
> Teria como vc enviar uma amostra de como fazer isso?
>
>
>
> Att.
> Márcio A. Sepp
>
>
> > -----Mensagem original-----
> > De: freebsd-bounces em fug.com.br
> > [mailto:freebsd-bounces em fug.com.br] Em nome de Giancarlo Rubio
> > Enviada em: quarta-feira, 3 de outubro de 2007 09:28
> > Para: Lista Brasileira de Discussão sobre FreeBSD (FUG-BR)
> > Assunto: Re: [FUG-BR] RES: Load Balance
> >
> > Em 02/10/07, Marcio A. Sepp<marcio em zyontecnologia.com.br> escreveu:
> > >
> > > O pf faz sim... Segue um exemplo:
> > > pass out on em0 route-to (em0 200.xxx.xxx.2) round-robin
> > from any to
> > > any keep state probability 33%
> > >
> > > Indo um pouco mais a fundo... Neste exemplo modelo, se uma placa
> > > cair, o tráfego continuará sendo enviado para ela, mas como
> > eu faria
> > > para no caso de uma placa falhar, o tráfego ser encaminhado
> > para a outra?
> >
> > Eu uso com ifstated (/usr/ports/net/ifstated) checando meu
> > gateway um ping mesmo, mais vc pode usar snmp para checar se
> > ele esta em pe.
> > Existem mil metodos para vc validar. So depende da sua imaginacao.
> >
> > >
> > > Não digo necessariamente a placa, mas digamos que o
> > "gateway da placa" caia.
> > > Tem como redirecionar o tráfego para outra interface (digo isso em
> > > real-time)?
> >
> > Tem sim vc pode criar uma anchor para isto, sempre que mudar
> > seu estado no ifstated ele aciona um script que muda a
> > interface de saida.
> > Assim que ele voltar ao estado inicial ou normal a anchor e
> > desfeita e tudo volta ao normal. Acredite funciona!
> >
> > >
> > > Alguém sabe como resolver isso?
> > >
> > >
> > >
> > > Att.
> > > Márcio A. Sepp
> > >
> > >
> > > > -----Mensagem original-----
> > > > De: freebsd-bounces em fug.com.br
> > > > [mailto:freebsd-bounces em fug.com.br] Em nome de Neerlan Amorim
> > > > Enviada em: terça-feira, 2 de outubro de 2007 20:25
> > > > Para: Lista Brasileira de Discussão sobre FreeBSD (FUG-BR)
> > > > Assunto: Re: [FUG-BR] Load Balance
> > > >
> > > > Jean, vou ficar te devendo essa, pois só vi isso no ipfw.
> > > >
> > > > On 10/2/07, jean <jean em w3nt.com> wrote:
> > > > >
> > > > > Neerlan, nao tenho conhecimento em PF, mas nele vc pode
> > gerenciar
> > > > > varios links e controlar a % de caga para cada um?
> > > > >
> > > > > Obrigado,
> > > > >
> > > > > Jean
> > > > >
> > > > > ----- Original Message -----
> > > > > From: "Neerlan Amorim" <neerlan em gmail.com>
> > > > > To: "Lista Brasileira de Discussão sobre FreeBSD (FUG-BR)"
> > > > > <freebsd em fug.com.br>
> > > > > Sent: Tuesday, October 02, 2007 6:15 PM
> > > > > Subject: Re: [FUG-BR] Load Balance
> > > > >
> > > > >
> > > > > Da uma olhada nesse link.
> > > > > http://www.bsdsul.com.br/tutoriais_detalhe.php?cod=27&tipo=2
> > > > > é uma solução bem interessante usando o PF.
> > > > >
> > > > > Neerlan Amorim
> > > > >
> > > > > On 10/2/07, Jean Zanuzo <jean em w3nt.com> wrote:
> > > > > >
> > > > > > Marcelo Soares da Costa escreveu:
> > > > > > > Podia postar aqui um exemplo disso , na net vc acha
> > > > exemplos com
> > > > > > > carp []'s
> > > > > > >
> > > > > > >>>
> > > > > > >>>
> > > > > > >> Voce também pode usar o ipfw com prob e mais de uma
> > > > instancia do
> > > > > > >> natd combinando com regra forward, conforme a
> > largura dos seu
> > > > > > >> links vc
> > > > > pode
> > > > > > >> regular a probabilidade de pacotes para cada um,
> > ou nao usar
> > > > > > >> o prob e fazer forward nas rotas ou portas, conforme
> > > > preferir, ou
> > > > > > >> combinando
> > > > > > tudo
> > > > > > >> isso, fica muito bom! ;)
> > > > > > >>
> > > > > > >> Jean Zanuzo
> > > > > > >>
> > > > > > >>
> > > > > > >> -------------------------
> > > > > > >> Histórico: http://www.fug.com.br/historico/html/freebsd/
> > > > > > >> Sair da lista:
> > > > > > >> https://www.fug.com.br/mailman/listinfo/freebsd
> > > > > > >>
> > > > > > >
> > > > > > > -------------------------
> > > > > > > Histórico: http://www.fug.com.br/historico/html/freebsd/
> > > > > > > Sair da lista:
> > https://www.fug.com.br/mailman/listinfo/freebsd
> > > > > > Exemplo com dois Links, a interface bge0 na operadora A e
> > > > a bge1 na
> > > > > > operadora B, e a em0 indo para a INTRANET.
> > > > > >
> > > > > > *As configuracoes das Interfaces:
> > > > > > *# ifconfig bge0
> > > > > > bge0 inet 200.xxx.yyy.138 netmask 0xfffffffc broadcast
> > > > 200.xxx.yyy.139
> > > > > > inet 200.xxx.yyy.142 netmask 0xffffffff broadcast
> > > > > > 200.xxx.yyy.142 # ifconfig bge1
> > > > > > bge1 inet 189.xxx.yyy.2 netmask 0xfffffffc broadcast
> > 189.xxx.yyy.3
> > > > > > inet 189.xxx.yyy.10 netmask 0xffffffff broadcast
> > > > 189.xxx.yyy.10
> > > > > > # ifconfig em0 em0 inet 189.xxx.yyy.17 netmask
> > > > 0xfffffffc broadcast
> > > > > > 189.xxx.yyy.19
> > > > > >
> > > > > > *O Default router*
> > > > > > defaultrouter="200.xxx.yyy.137" #Sendo o ip do roteador
> > > > da operadora
> > > > > > A (Que será a operadora principal)
> > > > > >
> > > > > > *A configuracao do natd*
> > > > > > Um arquivo por operadora, vamos criar o arquivo natd.a para a
> > > > > > operadora A e o natd.b para a operadora B *Cada natd
> > > > utilizara uma
> > > > > > porta diferente.
> > > > > >
> > > > > > Arquivo /etc/natd.a
> > > > > > alias_address 200.xxx.yyy.142
> > > > > > port 8667
> > > > > > use_sockets yes
> > > > > >
> > > > > > Arquivo /etc/natd.b
> > > > > > alias_address 189.xxx.yyy.10
> > > > > > port 8668
> > > > > > use_sockets yes
> > > > > >
> > > > > > inicialize o natd
> > > > > > natd -f /etc/natd.a
> > > > > > natd -f /etc/natd.b
> > > > > >
> > > > > > *A configuracao do ipfw*
> > > > > > ipfw add check-state
> > > > > >
> > > > > > # Aqui é onde direciona os pacotes para os natd \\ # das
> > > > operadoras,
> > > > > > exceto da operadora A, que já \\ # está no
> > defaultrouter, entao
> > > > > > o que nao combinhar \\ # com nenhuma regra, automaticamente
> > > > vai \\ #
> > > > > > para a operadora A
> > > > > >
> > > > > > # exemplo q redireciona para a operadora B as portas
> > > > espeficicas
> > > > > > 80, 443, 22, 23
> > > > > > ipfw add divert 8668 ip from not 189.xxx.yyy.0/25 to
> > > > any dst-port
> > > > > > 80,443,22,23 recv em0
> > > > > >
> > > > > > # exemplo q redireciona para a operadora B os
> > destinos 64.0.0.0
> > > > > > ipfw add divert 8668 ip from not 189.xxx.yyy.0/25 to
> > > > 64.0.0.0/8
> > > > > > recv em0
> > > > > >
> > > > > > # exemplo q redireciona para a operadora B 50% dos pacotes
> > > > > > ipfw add prob 0.5 divert 8668 ip from not
> > > > 189.xxx.yyy.0/25 to any
> > > > > > recv em0 setup keep-state
> > > > > >
> > > > > > # exemplo q redireciona para a operadora B 30% dos
> > pacotes,e
> > > > > > o restanta p/ a operadora A
> > > > > > ipfw add prob 0.3 divert 8668 ip from not
> > > > 189.xxx.yyy.0/25 to any
> > > > > > recv em0 setup keep-state
> > > > > >
> > > > > > # para mais links, basta criar mais instancias do
> > > > natd.[c,d,e,f]
> > > > > > para cada e criar regras para elas
> > > > > >
> > > > > > # passagem direta fora do natd para os ips validos da
> > opradora B
> > > > > > ipfw add fwd 189.xxx.yyy.1 ip from 189.xxx.yyy.0/25 to
> > > > any recv em0
> > > > > > ipfw add fwd 189.xxx.yyy.1 ip from 189.xxx.yyy.0/25 to
> > > > any xmit bge0
> > > > > >
> > > > > > #natd para os pacotes na interface da operadora B ipfw add
> > > > > > divert
> > > > > > 8668 ip from any to any via bge1
> > > > > >
> > > > > > #natd para operadora A
> > > > > > ipfw add divert 8667 ip from not 200.xxx.yyy.128/25 to
> > > > any out via
> > > > > > bge0 #nao vamos fazer nat nos ips validos ipfw add
> > divert 8667
> > > > > > ip from any to 200.xxx.yyy.142 in via bge0 #vamos nat
> > no retorno
> > > > > > somente do ip na alias usada pelo nat
> > > > > >
> > > > > > ipfw add allow ip from any to any
> > > > > >
> > > > > > * o 189.xxx.yyy.1 é o roteador da operadora B.
> > > > > >
> > > > > > ----
> > > > > > Faz o teste, é mais ou menos isso, vc adequa a suas
> > > > > > necessidades, qualquer duvida, problema ou sugestao
> > > > > > principalmente
> > > > posta ai, hehehe.
> > > > > > []'s
> > > > > >
> > > > > >
> > > > > > Jean Zanuzo
> > > > > > -------------------------
> > > > > > Histórico: http://www.fug.com.br/historico/html/freebsd/
> > > > > > Sair da lista: https://www.fug.com.br/mailman/listinfo/freebsd
> > > > > >
> > > > > -------------------------
> > > > > Histórico: http://www.fug.com.br/historico/html/freebsd/
> > > > > Sair da lista: https://www.fug.com.br/mailman/listinfo/freebsd
> > > > >
> > > > > -------------------------
> > > > > Histórico: http://www.fug.com.br/historico/html/freebsd/
> > > > > Sair da lista: https://www.fug.com.br/mailman/listinfo/freebsd
> > > > >
> > > > -------------------------
> > > > Histórico: http://www.fug.com.br/historico/html/freebsd/
> > > > Sair da lista: https://www.fug.com.br/mailman/listinfo/freebsd
> > > >
> > >
> > > -------------------------
> > > Histórico: http://www.fug.com.br/historico/html/freebsd/
> > > Sair da lista: https://www.fug.com.br/mailman/listinfo/freebsd
> > >
> >
> >
> > --
> > Giancarlo Rubio
> > -------------------------
> > Histórico: http://www.fug.com.br/historico/html/freebsd/
> > Sair da lista: https://www.fug.com.br/mailman/listinfo/freebsd
> >
>
> -------------------------
> Histórico: http://www.fug.com.br/historico/html/freebsd/
> Sair da lista: https://www.fug.com.br/mailman/listinfo/freebsd
>
--
Giancarlo Rubio
Mais detalhes sobre a lista de discussão freebsd