
Tenho duas conexões ISP e preciso de balanceamento automático de carga entre elas. Também preciso lidar com conexões com falha (não usar uma que não funcione).
O primeiro link é uma conexão PPTP ( ppp0
), o segundo é a Ethernet usual. O sistema é Gentoo Linux.
Atualmente consegui balanceamento básico com ip route
, mas parece que não está funcionando muito bem. Aqui está o que eu usei:
ip rule $ADD from $IP1 table rt_link1
ip rule $ADD fwmark 1 lookup rt_link1
ip rule $ADD from $IP2 table rt_link2
ip rule $ADD fwmark 2 lookup rt_link2
$NET2 dev eth2 src $IP2 table rt_link2
default via GW2 table rt_link2
$NET2 dev eth2 src $IP2
$NET1 dev ppp0 src $IP1 table rt_link1
default via GW1 table rt_link1
$NET1 dev ppp0 src $IP1
default scope global nexthop via $GW1 weight 1 nexthop via $GW2 dev eth2 weight 1
Responder1
Como ex-membro da equipe principal do projeto LVS, eu desaconselho fortemente o uso desta tecnologia para equilibrar múltiplas conexões de internet; na verdade, quase posso garantir que não funcionará como esperado.
Agora, o tratamento de links de provedores com falha é frequentemente chamado de detecção de gateway morto (DGD) e, às vezes, chamado de detecção de inacessibilidade de vizinho (NUD). De acordo com RFC816 e RFC1122, existem várias maneiras de realizar DGD, no entanto, só vi cerca de 3 delas na natureza (de umpostagem antiga minhapara a lista de discussão do LVS):
- As informações da camada de enlace que detectam e relatam falhas de host de maneira confiável (por exemplo, mensagens ARPANET Destination Dead) devem ser usadas como aconselhamento negativo.
- Uma mensagem de redirecionamento ICMP de um gateway específico deve ser usada como um conselho positivo sobre esse gateway.
- Os pacotes que chegam de um determinado endereço da camada de enlace são evidências de que o sistema nesse endereço está ativo. No entanto, transformar essas informações em conselhos sobre gateways requer mapear o endereço da camada de enlace em um endereço IP e, em seguida, verificar esse endereço IP em relação aos gateways apontados pelo cache de rota. Isto é provavelmente proibitivamente ineficiente.
Quando deixei o desenvolvimento ativo da rede do kernel Linux em 2006, ainda não havia uma decisão definitiva sobre como implementar mudanças de estado NUD. Um amigo meu e principal desenvolvedor do LVS, Julian Anastasov, precisava resolver seu desafio em 2002. Então, uma noite ele sentou-se e escreveu uma versão funcional do DGD para roteamento estático adicionando o estado NUD ao FIB (forward information base). Você pode encontrar o patch deleaquie a documentaçãoaqui,aquieaqui. Isso deve lhe fornecer muitas informações sobre sua busca futura para abordar essa tarefa não trivial. Vejo que os patches ainda são muito usados e, portanto, mantidos atualizados com os kernels recentes. Você pode querer começar com um script como o seguinte (escrito porRobert Kurjata):
#!/bin/bash
# This script is done by : Robert Kurjata Sep, 2003.
# feel free to use it in any useful way
# CONFIGURATION
IP=/sbin/ip
PING=/bin/ping
#--------------- LINK PART -----------------
# EXTIFn - interface name
# EXTIPn - outgoing IP
# EXTMn - netmask length (bits)
# EXTGWn - outgoing gateway
#-------------------------------------------
# LINK 1
EXTIF1=eth2
EXTIP1=
EXTM1=
EXTGW1=
# LINK 2
EXTIF2=eth1
EXTIP2=
EXTM2=
EXTGW2=
#ROUTING PART
# removing old rules and routes
echo "removing old rules"
${IP} rule del prio 50 table main
${IP} rule del prio 201 from ${EXTIP1}/${EXTM1} table 201
${IP} rule del prio 202 from ${EXTIP2}/${EXTM2} table 202
${IP} rule del prio 221 table 221
echo "flushing tables"
${IP} route flush table 201
${IP} route flush table 202
${IP} route flush table 221
echo "removing tables"
${IP} route del table 201
${IP} route del table 202
${IP} route del table 221
# setting new rules
echo "Setting new routing rules"
# main table w/o default gateway here
${IP} rule add prio 50 table main
${IP} route del default table main
# identified routes here
${IP} rule add prio 201 from ${EXTIP1}/${EXTM1} table 201
${IP} rule add prio 202 from ${EXTIP2}/${EXTM2} table 202
${IP} route add default via ${EXTGW1} dev ${EXTIF1} src ${EXTIP1} proto static table 201
${IP} route append prohibit default table 201 metric 1 proto static
${IP} route add default via ${EXTGW2} dev ${EXTIF2} src ${EXTIP2} proto static table 202
${IP} route append prohibit default table 202 metric 1 proto static
# mutipath
${IP} rule add prio 221 table 221
${IP} route add default table 221 proto static \
nexthop via ${EXTGW1} dev ${EXTIF1} weight 2\
nexthop via ${EXTGW2} dev ${EXTIF2} weight 3
${IP} route flush cache
while : ; do
${PING} -c 1 ${EXTGW1}
${PING} -c 1 ${EXTGW2}
sleep 60
done
Além disso, você pode conferir a opção de executar protocolos de roteamento dinâmico.
Responder2
Use LVS em conjunto com lvs-kiss. Ou algo semelhante.
LVS é basicamente o ìpvsadm
comando. A única desvantagem desse balanceador de carga é que ele não monitora. Então você precisa de um programa que faça isso para você e remova o link morto da sua configuração (e adicione-o de volta ao vivo novamente).
ldirectord
da pilha de batimentos cardíacos pode haver outra adição de lvs (em vez de lvs-kiss).