Bom dia, galera.
Vou escrever um breve artigo sobre como fazer balanceamento de link por
IPtables e
Squid.
Normalmente, vemos esse balanceamento sendo feito com IPtables, mas minha necessidade era que as conexões de proxy também tivessem acesso aos meus dois links de internet, utilizando, para isso, o Squid.
Bom, vou colocar aqui o cenário com IPs fictícios, óbvio (rs). São dois IPs de internet e uma rede local. Uma coisa que pode ser interessante para quem ler, é que um dos meus links de internet é uma intranet, então, tenho que ligar meu Squid a um cache-pai, com a diretiva "cache_peer" como "parent".
Então, tem que se fazer umas coisinhas a mais que vou explicar.
- Ip link 1 : 200.0.0.1 Gateway 200.0.0.2
- Ip link : 189.0.0.1 Gateway 189.0.0.2
- Ip lan : 192.168.1.0
- Gateway padrão : 200.0.0.2
Não vou entrar em detalhes de como configurar os IPs nas interfaces, então, ficou assim:
- eth0 - 192.168.1.254/24
- eth1 - 200.0.0.1/24
- eth2 - 189.0.0.2/24
Com o servidor
Linux configurado até aí, precisamos ativar o "ip_forward" e criar regras de MASQUERADE para os links de internet, usando o IPtables.
# echo 1 > /proc/sys/net/ipv4/ip_forward #Ativa o forward
# iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE #Mascarade para eth1
# iptables -t nat -A POSTROUTING -o eth2 -j MASQUERADE #Mascarade para eth2
Eu, particularmente, não criei a regra de mascaramento para a eth2, tudo que não passar pelo Squid (ftp, telnet, pop, smtp etc.), vai sempre pela eth1 e tenho setores onde nem mesmo há o mascaramento, a saída é só Web. Então, só passa pelo Squid, fica da necessidade de casa um.
Agora precisamos criar uma tabela de roteamento por onde o segundo link de internet, IP 189.0.0.2, vai passar.
Edite o arquivo
/etc/iproute2/rt_tables. Haverá a tabela main, é a tabela principal como o nome já diz, então embaixo vamos criar a tabela "link_bkp":
20 link_bkp
Pode ser qualquer nome e qualquer número no começo, escolhi aleatoriamente.
Agora vamos criar uma regra de encaminhamento via comando "ip" para a tabela "link_bkp".
# ip rule add fwmark 2 table 20
Ou seja, todo pacote que estiver marcado com 2, deve ser direcionado para a tabela 20, no caso "link_bkp".
Agora vamos adicionar uma regra de roteamento para essa tabela:
# ip route add default via 189.0.0.2 dev eth2 table 20
Isso diz para que todo pacote direcionado à tabela 20, saia pelo gateway 189.0.0.2 na interface eth2.
Com isso, temos o link de backup configurado. Agora vou mostrar alguns exemplos de como fazer marcação de pacotes, para que trafeguem pelo link de backup de acordo com sua vontade.
Um exemplo básico: meu link principal caiu e preciso jogar toda a LAN no outro link:
# iptables -t mangle -A PREROUTING -s 192.168.1.0/24 -j MARK set-mark 2
Aqui marco todos os pacotes com origem na rede 192.168.1.0/24 com 2, que pela minha regra direciona para a tabela 20, nosso link de backup. =)
Agora, suponhamos que meu link principal, dentro de uma intranet, bloqueia conexões FTP (acreditem, é um tormento - rs), então preciso que tudo que for FTP saia pelo link de backup.
# iptables -t mangle -A PREROUTING -p tcp --dport 25 -j MARK set-mark 2
Aqui, digo que todo pacote TCP com destino de porta 25 seja marcado com 2, sendo assim, direcionado para a tabela 20. Ah, mas preciso que só a máquina do Joãozinho acesse FTP. Sem problemas:
# iptables -t mangle -A PREROUTING -p tcp -s 192.168.1.5/32 --dport 25 -j MARK --set-mark 2
A regra aqui é a mesma, mas limitei somente pacotes com origem do IP 192.168.1.5. IP da máquina do Joãozinho.
Tendo um bom conhecimento de que portas as aplicações usam, posso escolher que aplicações e que IPs passarão por um link ou outro, fazendo assim o balanceamento.