Dicas, Linux

Roteamento avançado no Linux usando iptables e iproute2 ( Load Balance )

Sempre nos deparamos com links usando sua capacidade máxima em alguns clientes hoje em dia, e isso dificulta a produção da empresa, diante deste cenário o seu gerente de TI, lhe sugere colocar mais um link no firewall usando outro provedor de internet para assim distribuir o tráfego entres os links usando o roteamento em seu firewall linux.

 Diante de um cenário mais complexo vamos destrinchar cada serviço:

LINK1 = deve passar apenas navegação ( 80, 443, 53)

LINK2 = deve passar apenas email (143, 110, 25, 993, 995, 465, 587)

uma conexão quando aberta pelo usuário em sua rede deve sair pelo link escolhido e voltar pelo mesmo link para completar com sucesso a conexão, no entanto se não houver um roteamento adequado o pacote originado no usuário final da sua LAN vai sair pela default gateway do firewall e este pode não ser o link adequado, para isto acontecer corretamente o linux usa marcações nos pacotes alimentando uma tabela de roteamento dinâmico para manter esta regularidade, neste post eu vou nomear as tabelas para ficar mais fácil o entendimento. Exemplo: Quando o usuário solicita uma conexão a uma pagina HTTPS e este sai pelo LINK1 a conexão deverá voltar pelo mesmo LINK1 para funcionar corretamente, caso o default gateway deste exemplo for o LINK2, o usuário ao passar pelo firewall este deverá receber uma marcação no seu pacote referente ao LINK1, porque senão a conexão não funcionará.

Para manter a disponibilidade do acesso deste servidor devemos também rotear as portas de gerência do firewall que no caso farei apenas com o serviço de SSH.

Usando o roteamento avançado no linux você pode rotear origem e destino, neste caso vou rotear apenas a origem para estes serviços mencionados acima e dar alguns exemplos de regras.

 Vamos dar nomes as tabelas:

acrescentarei ao final deste arquivo /etc/iproute2/rt_tables duas tabelas 100 e 200 usando os nomes EMB e OI respectivamente.

100 EMB 
200 OI 

Feito isso vamos criar as marcações:

ip rule add fwmark 1 table EMB prio 10 
ip route add default via $GATEWAY_LINK1 dev $IF_WAN1 table EMB 
ip rule add fwmark 2 table OI prio 20 
ip route add default via $GATEWAY_LINK2 dev $IF_WAN2 table OI 
ip route flush cache

Ao final vamos limpar as tabelas de seu cache.

Com esses comandos estarei adicionando a marca 1 aos pacotes que saírem pela tabela EMB e a marca 2 para os pacotes que saírem pela tabela OI, agora posso começar a trabalhar nas regras do Iptables.

A camada OUTPUT serve para pacotes que se originam no próprio firewall, seguindo isso, para manter a disponibilidade do servidor nos serviços SSH e HTTP, mais o ICMP para verificar a estabilidade do link,

iptables -t mangle -A OUTPUT -p tcp -s $LINK1 -d ! $REDE_LAN --sport 22 -j MARK --set-mark 1 
iptables -t mangle -A OUTPUT -p tcp -s $LINK1 -d ! $REDE_LAN--sport 80 -j MARK --set-mark 1 
iptables -t mangle -A OUTPUT -p icmp -s $LINK1 -d ! $REDE_LAN -j MARK --set-mark 1

A camada PREROUTING serve para pacotes que se originam em outra rede. Exemplo: LAN -> WAN

Pacotes que saíram pelo LINK1 (tabela EMB)

iptables -t mangle -A PREROUTING -i $IF_LAN -p tcp --dport 80 -j MARK --set-mark 1 # HTTP
iptables -t mangle -A PREROUTING -i $IF_LAN -p tcp --dport 443 -j MARK --set-mark 1 # HTTPS
iptables -t mangle -A PREROUTING -i $IF_LAN -p tcp --dport 53 -j MARK --set-mark 1 # DNS

 Pacotes que saíram pelo LINK2 (tabela OI)

iptables -t mangle -A PREROUTING -i $IF_LAN -p tcp --dport 25 -j MARK --set-mark 2 # SMTP
iptables -t mangle -A PREROUTING -i $IF_LAN -p tcp --dport 110 -j MARK --set-mark 2 # POP
iptables -t mangle -A PREROUTING -i $IF_LAN -p tcp --dport 143 -j MARK --set-mark 2 # IMAP
iptables -t mangle -A PREROUTING -i $IF_LAN -p tcp --dport 993 -j MARK --set-mark 2 # IMAPS
iptables -t mangle -A PREROUTING -i $IF_LAN -p tcp --dport 995 -j MARK --set-mark 2 # POPS
iptables -t mangle -A PREROUTING -i $IF_LAN -p tcp --dport 465 -j MARK --set-mark 2 # SMTPS
iptables -t mangle -A PREROUTING -i $IF_LAN -p tcp --dport 587 -j MARK --set-mark 2 # SMTPS

Fazendo assim poderemos balancear os serviços entre os dois links…………

Standard

One thought on “Roteamento avançado no Linux usando iptables e iproute2 ( Load Balance )

  1. Pingback: Blog do Luiz Fernando Nunes » Roteamento

Leave a comment