Roteamento por origem no Linux

Trabalhando com roteamento por origem no Linux, aprenda a redirecionar o seu tráfego local LAN para vários links
externos. O cenário proposto no artigo, são 3 links externos e uma rede LAN.

[ Hits: 27.098 ]

Por: Vinícius de Oliveira Almeida em 16/02/2012


Compilando Kernel



Com a topologia montada, antes de prosseguir para a solução, precisamos compilar o kernel para que aceite as configurações de roteamento avançado.

Como compilar o Kernel: Dúvidas para compilar um Kernel

Na hora da compilação do Kernel, será importante você ativar as opções abaixo. Caso o Kernel ativo possuir estas opções marcadas, então, obviamente, não haverá necessidade de recompilar.

Compilação

Chamando o menu:

# cd /usr/src/linux
# make menuconfig


Entre nos itens e marque estas opções:
Code maturity level options
[*] Prompt for development and/or incomplete code/drivers
Networking Options
[*] TCP/IP Networking

Versão atual do protocolo IP, IPV6 - marque, pois este futuramente promete.
[*] TCP/IP Networking.

Para utilização da ferramenta iptables, habilite estas opções:
[*] Network packet filtering (replaces ipchains)
[*] Network packet filtering debugging
[*] Socket Filtering


Entre no sub-item e marque:

"IP: Netfilter Configuration -->"
Suporte e estabelecimento de tuneis
<*> IP: tunneling
<*> IP: GRE tunnels over IP

Importante: marque estas opções avançadas de roteamento:
[*] IP: advanced router
[*] IP: policy routing
[*] IP: use netfilter MARK value as routing key
[*] IP: fast network address translation
[*] IP: equal cost multipath
[*] IP: use TOS value as routing key
[*] IP: verbose route monitoring
[*] IP: large routing tables

Basta seguir o link da dica, para terminar o processo de compilação.

Editando o RT_Tables

Depois de tudo compilado, vamos seguir a receita de bolo. Edite o arquivo "/etc/iproute2/rt_tables".

O arquivo padrão é este:
Linux: Roteamento por 
origem no Linux

Modifique o arquivo, colocando na tabela o ID e nome dos links, neste caso, criei os nomes de acordo com minha configuração.

Veja como ficou:
Linux: Roteamento 
por origem no Linux

Salve o arquivo "rt_tables" (:wq), é importante!

Ativando roteamento

Vamos definir o Gateway de cada link externo, seguindo a topologia prevista.

# ip rule add from 192.168.0.0/24 table LinkOI
# ip rule add from 192.168.1.0/24 table LinkEmbratel
# ip rule add from 192.168.2.0/24 table LinkCTBC


Observe que nesta configuração defini as saídas de link, ou seja, todo ativo que esteja com a sub-rede '192.168.0.0/24' saíra pelo link 'OI', e assim sucessivamente.

Não esqueça de criar o NAT em sua rede, faça o MASQUERADE via IPtables, pois a rede '192.168.0.0/16' é invalida privada padrão 'RFC-1918'.

Para conhecimento, leiam: http://pt.wikipedia.org - Endereço IP

Chegamos ao fim do artigo.

Para saber se realmente seu ativo está no link correto, entre no site Meu IP ou, use a ferramenta TRACEROUTE e analise a saída.

- Contatos:
  • valmeida[at]idea-planejamento.com
  • Skype: valmeida.idea

Abraços.
Página anterior    

Páginas do artigo
   1. Introdução
   2. Compilando Kernel
Outros artigos deste autor

Instalando Servidor ELASTIX (PABX-IP)

Iptraf Sniffer - noções básicas

Leitura recomendada

Como verificar conexões abertas no Linux

Criando relatórios estatísticos com o webalizer

Modem 3G no Ubuntu Linux 8.04 - Qualquer operadora

Palm na internet via Linux

Resolvendo problema de conexão a internet ADSL (Velox)

  
Comentários
[1] Comentário enviado por filhoarrais em 16/02/2012 - 10:57h

E a configuração das interfaces, como ficou?
IP e mascara somente, correto?

[2] Comentário enviado por removido em 16/02/2012 - 11:31h

Ainda não fiz o artigo, porém achei muito bom,

favorito, nota 10!!!

[3] Comentário enviado por mago_dos_chats em 16/02/2012 - 17:13h

Gostei Vinicius, mais só uma questão para ver se funcionaria também, depois de compartilhar a internet no servidor com o MASQUERADE você poderia simplesmente adicionar as rotas como:
route add default gw 192.168.0.0 netmask 255.255.255.0 eth0 (OI)
route add default gw 192.168.1.0 netmask 255.255.255.0 eth1 (EMBRATEL)
route add default gw 192.168.2.0 netmask 255.255.255.0 eth2 (CTBC)

Ai todo trafego com destino a estas subredes sairia por estas interfaces, o que acha?

[4] Comentário enviado por yros em 16/02/2012 - 22:38h

Muito bom o artigo cara, é um assunto que normalmente os artigos são meio confusos, e você conseguiu deixar bem objetivo.

Valeu

[5] Comentário enviado por viniciuspedra em 17/02/2012 - 09:27h

primeiramente parabéns pelo artigo...
eu nunca alterei o kernel do linux porém vou ter que me dedicar a isso

gostaria de saber se não dah para deixar apenas uma faixa de IP, por exemplo a que eu uso que é 192.168.3.0 e determinar pelo IP em qual link q sai?

[6] Comentário enviado por gasparzinho_f em 17/02/2012 - 11:53h

bom dia.
artigo muito bom.
agora, seria muito mais complicado fazer a saida por tipo de serviço do que por subrede ??... pra quem não entendeu, digamos que youtube pelo pelo link1, email/ftp/ssh por link2 e qualquer outra coisa pelo link3... creio que temos que fazer marcação de pacotes e fazer a regra correspondente redirecionar a saida... é correto a idéia ?

[7] Comentário enviado por jose.freitas.rj em 17/02/2012 - 14:34h

Olá vinicius.almeida! Primeiramente te dou os parabéns pelo bom artigo! Falando sobre as regras de entrada e saída via iptables, eu teria que criar uma regra pra cada rede interna assossiando a elas as portas e as interfaces que são de saída? Por exemplo,
iptables -A POSTROUTING -t nat -s 192.168.1.0/24 -m tcp -p tcp --dport 3128 -o eth1 -j MASQUERADE
iptables -A POSTROUTING -t nat -s 192.168.2.0/24 -m tcp -p tcp --dport 3128 -o eth2 -j MASQUERADE
iptables -A POSTROUTING -t nat -s 192.168.3.0/24 -m tcp -p tcp --dport 3128 -o eth3 -j MASQUERADE

iptables -A INPUT -i eth1 -s 0/0 -d xxxxxxxx -m tcp -p tcp --dport 110 -m state --state NEW -j ACCEPT
iptables -A FORWARD -i eth2 -s 0/0 -d xxxxxxxx -m tcp -p tcp --dport 110 -j ACCEPT
iptables -t mangle -A PREROUTING -i eth3 -s 0/0 -d xxxxxxxx -p tcp -m tcp --dport 110 -j TOS --set-tos 16
iptables -A PREROUTING -t nat -i eth3 -s 0/0 -d xxxxxxxx -m tcp -p tcp --dport 110 -j DNAT --to 192.168.3.253:110

[8] Comentário enviado por viniciuspedra em 17/02/2012 - 16:19h

uma coisa q eu estava analisando agora é a dificuldade de encontrar uma placa mãe com 3 entradas PCI...
então o negócio é placa de rede dual que por sinal tmb não está facil =D

[9] Comentário enviado por jose.freitas.rj em 18/02/2012 - 13:54h

Fala viniciuspedra! Essas placas-mãe você até encontra no mercado, mas geralmente são todas offboard. Sempre uso placas Intel com processadores Intel, sempre... Mas no caso de ter poucos slots pci procuro criar ETHs virtuais (eth0:0, eth0:1,eth0:2...), mas eu sempre procuro colocar placa físicas separadas pra cada trâmiti.

[10] Comentário enviado por viniciuspedra em 19/02/2012 - 09:07h

poiseh jose.freitas.rj... pior acaso eu tenho uma, antiga mas com 3 slots pci...
eu to usando eth virtuais porém eu me deparei com um problemão: uso proxy...
descriminei os proxys e nenhum deles funcionou...
alguém já fez esse tipo de roteamento utilizando proxy?

[11] Comentário enviado por viniciuspedra em 19/02/2012 - 09:19h

ah... consegui...
eu criei o eth0 com o ip do proxy e depois o eth0:1 e eth0:2 com os outros IPs... funcionou... agora vou para o roteamento :D

[12] Comentário enviado por jose.freitas.rj em 19/02/2012 - 13:36h

Entendi Vinícius Pedra, eu também já fiz isso que você fez sobre o proxy e funcionou. Agora, o que está pegando é nas regras do firewall com tantas ETHs de saída. Como tenho 2 links de internet distintos em placas separadas eu queria saber como será as regras de entradas e saídas desses 2 links. Cito um exemplos abaixo que eu acho que deveria funcionar pra cada link.

iptables -A INPUT -i eth1 -s 0/0 -d xxxxxxxx -m tcp -p tcp --dport 25 -m state --state NEW -j ACCEPT
iptables -A FORWARD -i eth2 -s 0/0 -d xxxxxxxx -m tcp -p tcp --dport 110 -j ACCEPT
iptables -t mangle -A PREROUTING -i eth3 -s 0/0 -d xxxxxxxx -p tcp -m tcp --dport 80 -j TOS --set-tos 16
iptables -A PREROUTING -t nat -i eth3 -s 0/0 -d xxxxxxxx -m tcp -p tcp --dport 21 -j DNAT --to 192.168.3.253:21

OBS: Bem como terei algumas rotas de entrada e saída em funcionamento no mesmo servidor como está neste artigo acho eu que deveria funcionar.

[13] Comentário enviado por removido em 19/02/2012 - 21:24h

oi aí, meu vizinho!!!
10.
;-))

[14] Comentário enviado por jose.freitas.rj em 29/02/2012 - 08:21h

Aê pessoal, alguém saberia responder minha pergunta? Abraços...

[15] Comentário enviado por danistation em 17/10/2013 - 22:55h

entendi. as suas redes privadas estão divididas cada qual para um link de internet. OK. mas como fica a rota padrão do seu linux?

melhor... essa tabela de rotas, como ficaria?

0.0.0.0 metric 0 via eth1
0.0.0.0 metric 0 via eth2
0.0.0.0 metric 0 via eth3

?

se fo assim, como o linux lida com os pacotes com origem 127.0.0.1?

tenho essa duvida pq quero montar um cenario semelhante. mas o que aconteceria se eu fizesse nessa topologia um SSH para seu ip público na OI? beleza, na máquina linux chega, mas como ela responderia? por qual gateway irá sair? afinal de contas, se sua tabela de rotas estiver:

0.0.0.0 metric 0 via eth1
0.0.0.0 metric 0 via eth2
0.0.0.0 metric 0 via eth3

como ele vai decidir por qual delas responder a essas requisições que se originam, por exemplo, do link da OI?

resumindo, a minha dúvida é:

se vier uma requisição externa, pelo link da oi, por exemplo, o linux reponde pela mesma interface (caso do SSH para a própria maquina linux)?


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts