DevSecOps

1 jul, 2014

Criando rotas entre redes distintas no Linux (Roteador Linux)

Publicidade

imagem_linux_network

Seria ideal trabalhar em uma empresa que lhe fornecesse o material necessário para tudo, não é mesmo? Imagina você precisar fazer um roteamento entre redes distintas (criar rotas) e dizer pro seu chefe: preciso de um Cisco pra fazer essa tarefa. E ele te responder: “ok! Amanhã estará na sua mesa”. É, mas nem sempre é assim… rs.

Hoje vamos colocar o nosso Linux pra funcionar como um roteador. Para isso você vai precisar de:

  1. Uma máquina rodando Linux;
  2. Quantas placas de rede forem necessárias para as conexões;
  3. Conhecimento.

E é justamente nesse terceiro ponto que muita gente trava…

Antes de continuar, você sabia que o sistema operacional usado nos roteadores Cisco (cito ele pois é a referência no mercado) roda um kernel Linux? O IOS e o NX-OS são baseados no Red Hat e usam um kernel Linux customizado.

Mas vamos deixar pra lá o blá-blá-blá e vamos por a mão na massa.

Cenário

Imaginemos que precisamos criar uma rota entre as redes 192.168.0.0/24 e 10.12.0.0/24, onde seja possível acessar máquinas em ambas as redes.

Diagrama1

Mão na massa

Antes de criarmos as rotas, temos que habilitar o roteamento de pacotes no kernel. Para isso vamos usar o comando abaixo:

echo 1 > /proc/sys/net/ipv4/ip_forward

Vamos setar os IPs:

  • eth0 = 192.168.0.2 netmask 255.255.255.0 (/24);
  • eth1 = 10.12.0.2 netmask 255.255.255.0 (/24);
  • Gateway da rede A (192.168.0.0/24) para a eth0 = 192.168.0.1 netmask 255.255.255.0 (/24);
  • Gateway da rede B (10.12.0.0/24) para a eth1 = 10.12.0.1 netmask 255.255.255.0 (/24).

Obs.: Estas configurações acima você pode fazer no arquivo /etc/network/interfaces.

Agora vamos criar as rotas com o comando “route”:

Rota 1

route add -host 192.168.0.1 gw 192.168.0.2 dev eth0
route add -net 192.168.0.0 netmask 255.255.255.0 gw 192.168.0.1 dev eth0

Rota 2

route add -host 10.12.0.1 gw 10.12.0.2 dev eth1
route add -net 10.12.0.0 netmask 255.255.255.0 gw 10.12.0.1 dev eth1

Vamos entender?

Na primeira linha de cada rota nós dizemos que a máquina remota terá a nossa interface como gateway, e na segunda linha dizemos que a rede terá como gateway a máquina remota. Ou seja, qualquer pacote encaminhado para uma rede específica deverá ser entregue no próximo hop (gateway de cada rede) para ser tratado e encaminhado ao destino.

Depois disso podemos colocar estes comandos em um script pra facilitar o nosso trabalho. Para isso use seu editor de textos preferido e copie o conteúdo abaixo, salvando o arquivo como rotas.sh:

#!/bin/bash

echo “reiniciando interfaces”
/etc/init.d/networking restart

echo “roteamento do kernel”
echo 1 > /proc/sys/net/ipv4/ip_forward

echo “Apagando rotas”

route del -host 192.168.0.1 gw 192.168.0.2 dev eth0
route del -net 192.168.0.0 netmask 255.255.255.0 gw 192.168.0.1 dev eth0

route del -host 10.12.0.1 gw 10.12.0.2 dev eth1
route del -net 10.12.0.0 netmask 255.255.255.0 gw 10.12.0.1 dev eth1

echo “criando rotas”

route add -host 192.168.0.1 gw 192.168.0.2 dev eth0
route add -net 192.168.0.0 netmask 255.255.255.0 gw 192.168.0.1 dev eth0

route add -host 10.12.0.1 gw 10.12.0.2 dev eth1
route add -net 10.12.0.0 netmask 255.255.255.0 gw 10.12.0.1 dev eth1

Agora vamos colocar nosso script na inicialização do sistema:

cp rotas.sh /etc/init.d
update-rc.d rotas.sh defaults

 

Nós podemos aproveitar este script pra fazer muitas outras coisas, como implementar regras de firewall com o iptables, criar regras de mascaramento de pacotes de uma rede para outra e etc. Porém, isso é assunto para um próximo artigo.