Roteamento dinâmico com mais de um link

Bom pessoal, esse é o meu primeiro post e pretendo mostrar aqui como funciona o roteamento avançado com dois ou mais links.


Pretendo ser o mais claro possível na explicação, para que todos possam entender como funciona, então mãos a obra.

Aqui nesse nosso ambiente de exemplo, iremos usar um servidor linux, com dois links de internet OI e GVT e a nossa rede interna.
O objetivo é demonstrar como se configura e o funcionamento de balancemanto de links, iremos mostrar as conexões saírem por links diferentes e caso um link pare de funcionar o outro assume imediatamente.
No final do post, irei colocar um script que fica monitorando o link e caso algum dos links fique fora, o script chaveia as conexões para o outro link, quando voltar o link o script retorna as regras padrão.

Vamos agora então as configurações do nosso ambiente de rede para que possamos configurar o roteamento avançado, irei ir numerando o nosso passo-a-passo.



1) Vamos para anotações de redes e IPs
Nossas redes:
REDE INTERNA: 192.168.1.0/24
REDE MODEM ADSL GVT: 10.10.10.0/30
REDE OI: 200.215.219.248/29

IPs do nosso servidor firewall
IP ETH0 (LAN): 192.168.1.1
IP ETH1 GVT: 10.10.10.2
IP ETH2 OI: 200.215.219.250-254
ID do LINK OI:2
ID do LINK GVT:1

Agora que já temos nossas redes e IPs é só configurar os mesmos no nosso servidor linux. A nossa tabela de roteamento ficou assim:

#route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
200.215.219.248 0.0.0.0         255.255.255.248 U     0      0        0 eth2
192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0
10.10.10.0      0.0.0.0         255.255.255.0   U     0      0        0 eth1
0.0.0.0         200.215.219.249        0.0.0.0         UG    0      0        0 eth2


Agora iremos configurar nossa tabela de roteamento avançado é muito importante saber que cada tabela de roteamento tem que ter todas as rotas, podemos ver as tabelas exestentes atualmente em nosso servidor no arquivo "/etc/iproute2/rt_tables". É nesse arquivo que iremos criar as nossas tabelas GVT e OI.
Vamos criar a nossa tabela da GVT com o id 200 e oi 201, ficando da seguinte forma nosso arquivo de tabelas: Para editar a tablea de toteamento acessa o arquivo com o comando vim

#vim /etc/iproute2/rt_tables

Arquivo após editado
#cat /etc/iproute2/rt_tables
255    local
254    main
253    default
200    gvt
201    oi



2) Configurando tabelas de roteamento
Agora que já temos configurado nosso servidor e nossa tabela de roteamento, vamos popular nossas regras.  Vamos iniciar abrindo um arquivo em branco e vamos colocar as rotas de cada tabela.

vim temp.txt

#Table a da roteamento - ip route list table tabela

#Tabela OI
ip route add 192.168.1.0/24 dev eth0 table oi
ip route add 10.10.10.0/30 via 10.10.10.1 dev eth1 table oi
ip route add default via 200.215.219.249 dev eth2 table oi

#Table GVT
ip route add 192.168.1.0/24 dev eth0 table gvt
ip route add 200.215.219.248/29 dev eth2 table gvt
ip route add default via 10.10.10.1 dev eth1 table gvt

Exemplo de cada tabela.
ip route list table oi
ip route list table gvt


OBS.: Se tiver mais redes tais como VPN, DMZ, ... é só inserir em cada tabela as mesmas.
          Se tiver outros links como MPLS, internet e VPN, crie uma nova tabela para o link, colocando as outras redes dentro da tabela.


3) Marcação de pacotes
    Agora que já temos nossas rotas prontas, precisamos informar ao linux, qual pacote sai por qual link, isso se faz marcando os pacotes com o comando ip rule.
    Quando marcamos o pacote temos algumas opções como from e to. Também é necessário dar uma prioridade a marcação de pacotes entre os numeros 0 e 32766.   Vamos trabalhar com o numero 1000.

Vamos começar a marcar os pacotes então
#Marcando os pacotes
#O fwmark indica o id do link que setamos no início, junto com os ip de interfaces
ip rule add from 200.215.219.250 lookup oi
ip rule add from 10.10.10.2 lookup gvt
ip rule add to 8.8.4.4 lookup gvt prio 900
ip rule add to 8.8.8.8 lookup oi prio 900
ip rule add to 200.215.219.248/29 lookup oi prio 1000
ip rule add to 10.10.10.0/24 lookup gvt prio 1000
ip rule add fwmark 1 lookup gvt prio 1500
ip rule add fwmark 2 lookup oi prio 1500



Beleza a marcação de pacotes está pronta, vamos listar elas.
ip rule list


4)  Definindo uso dos links
   Agora é onde iremos informar o que irá sair por cada link de internet, pois até o momento configuramos a saída.
   Para configurar é necessário usar o IPTABLES sempre na tabela MANGLE na CHAIN PREROUTING

Vamos antes definir que o nosso link da GVT é o padrão, ou seja, o que não for pela OI, irá sair pela GVT

#conexões pela OI.  http, https e 110 - Aqui podemos colocar outras configurações se necessário
#O --set-mark indica o id do link que setamos no início, junto com os ip de interfaces e no fwmark do ip rule.

iptables -t mangle -A PREROUTING -i eth0 -s 192.168.1.0/24 -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -i eth0 -p icmp -d 8.8.8.8 -j MARK --set-mark 2
iptables -t mangle -A PREROUTING -i eth0 -p icmp -d 8.8.4.4 -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -i eth0 -s 192.168.1.0/24 -p tcp -m multiport --dport 80,443,110 -j MARK --set-mark 2

Após todas as regras criadas, iremos fazer os testes da seguinte forma:

No nosso firewall, iremos executar o seguinte comando
tcpdump -i any host IP-da_maquina_de_teste(192.168.1.x) -nn


Acessa o sire do terra e deve ir para um link
Fazer uma conexão via telnet na porta 25 deve ir para outro link Ex.: telnet smtp.terra.com.br 25

É isso aí pessoal, agora estamos com duallink de forma a usar os dois links separandos por protocolos.


5)Scripts finais
Agora irei colocar todas as regras juntas:
##########################
### SCRIPT COM TODAS AS REGRAS#
##########################
echo 1 > /proc/sys/net/ipv4/ip_forward

#Tabela OI
ip route add 192.168.1.0/24 dev eth0 table oi
ip route add 10.10.10.0/30 via 10.10.10.1 dev eth1 table oi
ip route add default via 200.215.219.249 dev eth2 table oi

#Table GVT
ip route add 192.168.1.0/24 dev eth0 table gvt
ip route add 200.215.219.248/29 dev eth2 table gvt
ip route add default via 10.10.10.1 dev eth1 table gvt

#Marcando os pacotes
ip rule add from 200.215.219.250 lookup oi
ip rule add from 10.10.10.2 lookup gvt
ip rule add to 8.8.4.4 lookup gvt prio 900
ip rule add to 8.8.8.8 lookup oi prio 900
ip rule add to 200.215.219.248/29 lookup oi prio 1000
ip rule add to 10.10.10.0/24 lookup gvt prio 1000
ip rule add fwmark 1 lookup gvt prio 1500
ip rule add fwmark 2 lookup oi prio 1500

iptables -t mangle -A PREROUTING -i eth0 -s 192.168.1.0/24 -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -i eth0 -p icmp -d 8.8.8.8 -j MARK --set-mark 2
iptables -t mangle -A PREROUTING -i eth0 -p icmp -d 8.8.4.4 -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -i eth0 -s 192.168.1.0/24 -p tcp -m multiport --dport 80,443,110 -j MARK --set-mark 2

#Compartilhar a internet
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth1 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth2 -j MASQUERADE



6) Monitorando o link
SCRIPT DE MONITORAMENTO DO LINK
OBS.: Colocar o script na crond para rodar a cada 3 minutos
###############################
### SCRIPT MONITORAMENTO DO LINK###
###############################
#!/bin/sh


#####################################
#### VARIAVEIS  #####################
#####################################
OI="8.8.8.8"
GVT="8.8.4.4"
LINKOI="200.215.219.248/29"
LINKGVT="10.10.10.0/24"

PING="ping -c 1"

LINK=0

#####################################
#### TESTE DE LINKS #################
#####################################
if (( ! `$PING  $GVT -I eth1 > /dev/null` ) && ( `$PING  $OI -I eth2 > /dev/null` ));then
    LINK=$GVT
elif (( `$PING  $GVT -I eth1 > /dev/null` ) && ( ! `$PING  $OI -I eth2 > /dev/null` ));then
       LINK=$OI
fi


#for i in $OI $GVT ; do
#
#    if ( !  `$PING  $i > /dev/null` );then
#        if [ $LINK == 0 ]; then
#            LINK=$i
#        else
#            LINK=1
#        fi
#    fi
#done


#####################################
#### ALTERACAO DE STATUS ############
#####################################
if [ "$LINK" == 0 ];then
    if [ -e /tmp/link ];then
        ip rule del prio 1200
        rm -rf /tmp/link               
    fi
elif [ "$LINK" == 1 ];then
    exit
elif [ "$LINK" == "$OI" ]; then
        if [ ! -e /tmp/link ];then
        ip rule add fwmark 2 lookup gvt prio 1200
        echo "oi" > /tmp/link
    fi
elif [ "$LINK" == "$GVT" ]; then
    if [ ! -e /tmp/link ];then
        ip rule add fwmark 1 lookup oi prio 1200
        echo "gvt" > /tmp/link
    fi
fi

Comentários

Postagens mais visitadas deste blog

Zabbix - LLD de portas abertas no server

PUPPET - Gerenciamento e configuração centraliazada

PUPPET - criando classes- parte 2