Squid + IPtables com dois links de internet
Neste artigo, explico como configurar dois links de internet para rodar no Squid. Desde o roteamento, passando pelo balanceamento de links com IPtables e colocando os dois links para funcionar dentro do Squid. Os exemplos foram testados e colocados em produção em uma VM com VMware Esxi, rodando Slackware 14.1 com Squid 3.4.8.
IPtables
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.
Não vou entrar em detalhes de como configurar os IPs nas interfaces, então, ficou assim:
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":
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.
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.