Upload
others
View
4
Download
0
Embed Size (px)
Citation preview
Revista Eletrônica da Faculdade Metodista Granbery
http://re.granbery.edu.br - ISSN 1981 0377
Curso de Sistemas de Informação - N. 17, JUL/DEZ 2014
ROTEAMENTO AVANÇADO COM IPROUTE2
Flávio Alexandre dos Reis1 1Faculdade Metodista Granbery
CEP: 36010-532 - Juiz de Fora - MG - Brasil
Resumo
O Sistema Operacional GNU/Linux possui em seu Kernel um conjunto poderoso de
recursos para definição de regras de roteamento, o que permite que o mesmo seja
utilizado para se obter soluções de problemas não convencionais de roteamento nos
quais, muitas vezes, nem mesmo roteadores propriamente ditos, construídos em
hardware especializado, oferecem uma solução a contento.
Palavras Chave: Linux, Roteamento, IP, IPTables, IPRoute2
Abstract
The operating system GNU/Linux has in it's Kernel a powerful set of features to
define routing rules, which allows it to be used to obtain unconventional
troubleshooting routing in which, often, not even routers properly said, built on
specialized hardware, offer a solution to the satisfaction.
Key Words: Linux, Routing, IP, IPTables, IPTroue2
1 Introdução
O Kernel do Linux, a partir da série 2.2, evoluiu para um subsistema de rede
completamente novo e remodelado. O código deste subsistema é extremamente
flexível, robusto e, graças a funções especiais, faz par a poucos sistemas
operacionais, mesmo considerando o firmware de roteadores dedicados. As funções
especiais existentes neste subsistema do Linux incluem diretivas diversas de
roteamento, controle, filtragem e priorização de tráfego.
Embora o Linux possua tanta flexibilidade, perdemos o uso de tais funções pelo
simples fato de que na maior parte dos sistemas a configuração é baseada em
utilitários presentes em toda base UNIX, nos quais a configuração e uso das funções
especiais do Kernel do Linux não são acessíveis, como os comandos arp, ifconfig e
route. Estes comandos, embora utilizem syscalls adaptadas ao novo subsistema,
fazem as chamadas passando diversos argumentos com valores padrão, perdendo-
se a flexibilidade de configuração neles existente. Contudo, um pacote chamado
iproute2 liberta o poder do subsistema de rede do Linux, permitindo a configuração
de estruturas com toda a flexibilidade existente no Kernel, de forma poderosa, sem
perder a facilidade de uso das ferramentas anteriores. Ainda será abordado o uso do
iptables, o qual permite definir diversas regras de tratamento de pacotes, que tornam
um servidor Linux um seguro firewall.
2 O comando IP
A base do pacote iproute2 é a ferramenta ip. Ela traz toda a funcionalidade
existente nos comandos arp, ifconfig eroute. O modo de operação desta
ferramenta baseia-se na passagem de comandos com argumentos apropriados para
um dos seguintes objetos:
• link: interfaces físicas existentes no sistema;
• addr: endereços lógicos atribuídos as interfaces físicas do sistema nas
diversas famílias distintas de protocolos de rede, como por exemplo inet
(IPv4) e inet6 (IPv6);
• route: tabela de roteamento do sistema;
• maddr: endereços lógicos de multicast existentes no sistema;
• mroute: tabela de roteamento multicast do sistema;
• tunnel: configuração de túneis de protocolo do sistema;
• neigh: tabela ARP do sistema;
• rule: permite definir regras como rejeição de pacotes, uso de NAT e classificar
o tráfego em tabelas com tratamento diferenciado para o uso por outros
comandos do ip com o uso do argumento table;
• monitor: permite monitoramento dos demais objetos.
A sintaxe básica da ferramenta ip é: ip OBJETO { COMANDO | help }. Onde
OBJETO é um dos acima descritos e COMANDO é a ação a ser tomada, com a
respectiva passagem de argumentos. Adicionalmente, pode ser repassada a
especificação da família de protocolo sobre a qual se atuará de acordo com a
sintaxe especificada pela chamada da ferramenta ip sem parâmetros.
A partir do comando ip pode-se passar diferentes tipos de argumentos. Existe
uma farta documentação sobre a sintaxe de configuração adotada no iproute2. Nas
distribuições baseadas em GNU/Linux essas documentações podem ser localizadas
em /usr/share/doc, procure pelo arquivo ip-cref. A Tabela 01 apresenta uma lista de
opções usadas pelo comando ip.
Comando Descrição ip link Para ajustar ou visualizar a configuração de uma interface de rede; ip addr Para configurar ou visualizar o endereço IP de uma interface de
rede; ip neigh Para configurar ou visualizar o cachê da tabela ARP de hosts
“vizinhos” ip route Para configurar ou visualizar as rotas na tabela de roteamento; ip rule Para determinar critérios de roteamento 9 regras );
Tabela 01 - Lista de opções usadas pelo comando ip.
Para obter uma listagem completa das opções aceitas pelo comando ip, siga o exemplo conforme apresentado na Listagem 01. # ip link help Usage: ip link add [link DEV] [ name ] NAME [ txqueuelen PACKETS ] [ address LLADDR ] [ broadcast LLADDR ] [ mtu MTU ] type TYPE [ ARGS ] ip link delete DEV type TYPE [ ARGS ] ip link set { dev DEVICE | group DEVGROUP } [ { up | down } ] [ arp { on | off } ] [ dynamic { on | off } ] [ multicast { on | off } ] [ allmulticast { on | off } ] [ promisc { on | off } ] [ trailers { on | off } ] [ txqueuelen PACKETS ] [ name NEWNAME ] [ address LLADDR ] [ broadcast LLADDR ] [ mtu MTU ]
[ netns PID ] [ netns NAME ] [ alias NAME ] [ vf NUM [ mac LLADDR ] [ vlan VLANID [ qos VLAN-QOS ] ] [ rate TXRATE ] ] [ master DEVICE ] [ nomaster ] ip link show [ DEVICE | group GROUP ] TYPE := { vlan | veth | vcan | dummy | ifb | macvlan | can | bridge }
Listagem 01 – Opções do commando IP
2.1 Configurando uma Interface de rede
Para ativar uma interface de rede com uso do comando “ip” use a sintaxe
conforme o exemplo da Listagem 02.
-Ativando uma interface
#ip link set eth0 up
-Desativando
#ip linl set eth0 down
Listagem 02 – Exemplo de uso do comando up e down
Os comandos da Listagem 2 são equivalentes ao “ifconfig eth0 up” e “ifconfig
eth0 down”;
Com o comando “ip” pode-se também ajustar alguns parâmetros como “mtu”.
“promisc” e multicast. O multicast é uma forma de roteamento baseada em “grupos”.
Grosso modo, é possível dizer que este é um roteamento do tipo 1 para muitos (
pertencentes a um mesmo grupo de roteamento ). Para ativar este recurso observe
a Listagem 3. O endereçamento de rede é representado por 244.0.0.0 com mascara
de rede 240.0.0.0. Ainda na Listagem 3 é apresentado o parâmetro “ls” do comando
“ip” sendo assim possível visualizar toda configuração.
#ip link set eth0 down
#ip link set eth0 mtu 1500 promisc off multicast on up
#ip link ls
Listagem 03 – Parâmetro ls
Pode-se observar ainda na Listagem 03 que a Interface está ativa (UP), as
opções broadcast e multicast estão selecionadas, os pacotes são gerenciados pela
“disciplina CBQ” ( qdisc cbq ) e o tamanho da fila (cache) está definido comom 100
bytes (qlen ). CBQ refere-se ao algoritmo de controle de banda adotado pelo kernel,
determinando quais pacotes são roteados e quais são mantidos ou encaminhados a
uma área temporária ( enviando para fila ). Em redes ethernet, o valor padrão do
MTU equivale o 1500. Em varias distribuições os scripts de rede configuram
automaticamente a interface de loopback (lo). Raramente será necessário
preocupar-se com essa interface.
O comando “ip” fornece o parâmetro “-s” para que possa ser observado possíveis
erros os colisões, observe um exemplo na Listagem 04 e 05.
#ip –s link ls dev eth0
Listagem 04 – Uso do parâmetro –s – exemplo 01
#ip -s -s link show eth0
Listagem 05 – Uso do parâmetro –s – exemplo 02
2.2 Configurando um endereço IP
Para atribuir um endereço a uma interface, deverão ser utilizados, os parâmetros
“addr add” seguidos do IP desejado. A utilização do argumento “+” indica que o valor
de broadcast deve ser calculado automaticamente a partir da rede atribuída a
interface. Para o IP 192.168.0.1/24 o broadcast será 192.168.0.255. Observe um
exemplo na Listagem 06.
#ip addr add 192.168.0.1/24 brd + dev eth0
Listagem 06 – Adicionando endereço IP
É importante frisar que o uso do comando da Listagem 06 não modifica o
endereço IP da interface e sim adiciona um ou mais. Para que uma alteração seja
feita antes deve-se remove-lo seguindo o exemplo da Listagem 07.
#ip addr del 192.168.0.1/24 dev eth0
Listagem 07 – removendo endereço IP
No iproute2, a sintaxe de configuração do endereçamento de rede ou hot
também obedece aos padrões de endereçamento/roteamento CIDR (Classless Inter-
Domain Routing) que, diferente do padrão adotado pelas classes de endereçamento
( A,B,C por exemplo ) permite a alocação de endereços IP de forma mais inteligente.
Um roteador que não suporte endereçamento CIDR não permite a criação de
uma rede 10.0.0.0/24, uma vez que a rede 10.0.0.0 pertence a faixa de
endereçamento Classe A que, por padrão é representada pelo endereçamento
10.0.0.0/8 ( mascara 255.0.0.0 ). Essa característica pode ser observada em um
roteador ADSL Alcatel SpeedPro.
Para demover todos os endereços ip atribuídos a uma interface use o parâmetro
“flush” conforme é apresentado na Listagem 08.
#ip addr flush dev eth0
LIstagem 08 – Uso do commando flush
O comando ifconfig é vantagem em relação ao comando “ip” quando abordada a
configuração de uma interface, pois o mesmo pode também ajustar a tabela de
roteamento em uma única linha. Observe um exemplo na Listagem 09
O argumento “up” na Listagem 09 faz com que a tabela de roteamento seja
gerada automaticamente.
#ifconfig eth0 192.168.0.1 netmask 255.255.255.0 up
Listagem 09 - Uso do parâmetro up
3 Roteamento de Pacotes com ip route
Nesse ponto do artigo será apresentado o comando “ip route”, com ele, é
permitido adotar determinadas configurações não suportadas pela ferramenta
“route”. Em uma interface de rede com mais de um endereço ip, é possível
especificar qual será o de origem. O roteador selecionado para uma determinada
rota é “similar” a uma regra de iptables com alvo SNAT, lembrando que as regras e
roteamento são processadas, pelo kernel, antes das regras do netfilter (iptables). O
recurso mais interessante é o roteamento multipath, em que um mesmo destino
pode ser alcançado por diferentes caminhos ( utilizado para implementar o
balanceamento de carga ).
No iproute2 é possível especificar qual algoritmo é responsável por uma rota
qualquer. As rotas adicionadas pelo sistema ou via scripts de rede são definidas
como rotas de kernel ou boot. Quando uma interface de rede é ativada, as rotas
necessárias são adicionadas e gerenciadas pelo kernel, podendo ser modificadas
administrativamente. Caso a interface de rede seja gerenciada apenas pelo
administrador do sistema, deve-se defini-la como estática. Para isso basta adicioná-
la como “static”. Existem situações em que o kernel manipula estas rotas, como
durante a modificação do status (ativa/desativa) de uma interface de rede por
exemplo.
A partir de um patch desenvolvido por Julian Anastasov (http://www.ssi.bg/~ja/)
as rotas estáticas não serão manipuladas pelo kernel, apenas o administrador ou
alguns daemons de roteamento terão acesso a essas rotas. Isso significa que uma
rota estática é mantida mesmo que uma interface de rede seja desativada ( apenas
com o patch ), a rota deve ser marcada como “dead', ao invés de ser removida.
As rotas adicionadas por daemons de roteamento dinâmico, como gated e zebra
são adicionadas com o respectivo protocolo. Todas as rotas gerenciadas pela zebra
são adicionadas com protocolo “zebra”.
Para aumentar ainda mais as possibilidades de configuração, pode-se definir
critérios de roteamento através do comando “ip rule”. Com esse recurso é possível
combinar critérios de roteamento baseados no filtro de pacotes ( usando a target
MARK ) ou regras básicas, como selecionar uma tabela de roteamento de acordo
com a origem ou destino do pacote.
A sintaxe é simples e pode ser observada na Listagem 10.
#ip route add 192.168.0.0/24 dev eth0
Listagem 10 – Encaminhamento de pacos via interface
A Listagem 10 determina que os pacotes destinados a rede 192.168.0.0/24
sejam encaminhados pela interface eth0. Trata-se de uma rota “de rede” e deve
existir, obrigatoriamente, caso o host em questão pertença a rede 192.168.0.0/24.
Isto significa que a rede especificada acima está fisicamente conectada a eth0.
Pode-se dizer que os pacotes destinados a rede 192.168.1.0/24 sejam
encaminhados ao roteador 192.168.0.1, veja um exemplo na Listagem 11.
#ip route add 192.168.1.0/24 via 192.168.0.1
Listagem 11 – Inserindo rota default
Uma rota default pode ser adicionada baseando em uma interface padrão, a rota
default é utilizada quando não houver, na tabela de roteamento, um mapeamento
direto para o endereço de destino. Ou seja, qualquer pacote com destino
desconhecido será repassado para essa interface. Observe um exemplo na
Listagem 12.
#ip route add default dev ppp0
Listagem 12 – Rota default baseada em Interface
Há um recurso muito útil quando o roteador tem múltiplos endereços ( ips virtuais
) associados a uma única interface de rede, possibilitando definir qual endereço será
o responsável pelo encaminhamento do pacote. Com o comando da Listagem 13 os
pacotes destinados a rede 192.168.1.0/24 serão encaminhados ao roteador
192.168.0.1 através do endereço 192.168.0.254 ( porém não é uma regra de SNAT
).
#ip route add 192.168.1.0/24 via 192.168.0.1 src 192.168.0.254
Listagem 13 – Rota default baseada em IP
Sabe-se que uma regra de firewall com alvo MASQUERADE fará com que o
pacote seja encaminhado pelo roteador, modificando o IP de origem para o endereço
que permite conectividade com o destinatário. Similar a uma regra com alvo SNAT,
pode-se fazer a seleção do endereço de origem baseando-se no endereço
configurado a “src”. Portanto, pode-se concluir que o endereço da origem é
modificado de acordo com a tabela de roteamento. Conforme o exemplo da
Listagem 13, o roteador 192.168.0.1 receberá todos os pacotes destinados a
192.168.1.0/24 “acreditando” que o endereço de host de origem corresponde a
192.168.0.254, isso ocorre devido à modificação do endereço por NAT.
É possível com o iproute2 criar balanceamento de carga, podendo assim enviar
pacotes através dos roteadores configurados em “nexthop” ( próximo salto ). A
Listagem 14 define uma rota default baseada em dois links, repassando ora ao
roteador 192.168.0.1 ora a interface ppp0.
# ip route default \
nexthop via 192.168.0.1 dev eth0 \
nexthop dev ppp0
Listagem 14 – Rota baseada em 02 links
O mesmo ocorre em relação à rede 192.168.1.0/24, que será alcançada a partir
dos roteadores 192.168.0.1 e 192.168.0 10. Observe o exemplo da regra na
Listagem 15.
#ip route add 192.168.1.0/24
nexthop via 192.168.0.1 dev eth0 \
nexthop via 192.168.0.10 dev eth1
Listagem 15 – Rota com dois links – Exemplo 02
Pode ainda configurar para que os pacotes sejam enviados de forma aleatória
entre links diferentes, para isso deve-se utilizar a opção “equalize”, isso fará com que
os pacotes ora sejam enviados por um gateway ora por outro. Veja um exemplo na
Listagem 16.
# ip route add default equalize \
nexthop via 192.168.0.1 dev eth0 \
nexthop dev ppp0
Listagem 16 – Envio de forma aleatória
A preferência de roteamento pode ser configurada aplicando diferentes valores
de peso ( weight ). Por padrão, o valor de “weight” equivale a “1”. Para priorizar o link
de maior largura de banda, é possível atribuir diferentes pesos aos respectivos links
( ou gateway ). A diferença entre esses valores é que determina a prioridade de
roteamento. Evite atribuir valores muito elevados, pois o peso simula o número de
caminhos a um destino qualquer. Na listagem 17 há um exemplo com a Interface
eth0 recebendo valor “weight 3” e a interface ppp0 “weight 1”.
# ip route add default equalize \
nexthop via 192.168.0.1 dev eth0 weight 3 \
nexthop dev ppp0 weight 1
Listagem 17 – Entregando valores de weight
Um recurso muito útil para verificar qual gateway é utilizado para atingir um
destino qualquer, é o uso do “get”. Pode-se utilizá-lo para verificar se o roteamento
multipath está ocorrendo de forma satisfatória ou não. Basta executar o comando da
Listagem 18 por um período de tempo qualquer e avaliando qual roteador é
selecionado a cada instante.
#ip route get 200.251.137.2
Listagem 18 – Verificando gateway
4 Criando rotas alternativas
É possível criar rotas alternativas utilizando a opção “append”. Quando a primeira
rota for eliminada ou descartada pelo kernel, após a modificação do status de uma
interface de rede, a rota seguinte passa a ser utilizada. Não se trata de um
roteamento “multipath”, pode-se assimilar a adição de rotas de kernel com métricas
diferentes. Vale lembrar que o uso das métricas é manipulado apenas por protocolos
de roteamento dinâmico, como RIP, OSPF e BGP, por exemplo. O objetivo é
fornecer apenas a redundância de roteadores, pois será especificado mais de um
roteador para o mesmo destino ( sem balancear ). Ambas as regras estarão
disponíveis. Porém a primeira rota sempre será preferência enquanto estiver
disponível. Veja um exemplo na Listagem 19.
#ip route append default via 192.168.0.1
#ip route append default via 192.168.0.100
Listagem 19 – Rotas alternativas
Regra de roteamento com ip rule
Estando o Kernel configurado com as opções avançadas de roteamento descritas
na preparação do ambiente, pode-se fazer uso de políticas de roteamento antes não
disponíveis. Uma das opções avançadas é o fato de que se pode ter múltiplas
tabelas de roteamento. Ao se efetuar o roteamento de um pacote, o Kernel deve
verificar se o ele se enquadra em uma tabela e ao roteamento correspondente a
mesma, então o aplicando. Existe um conjunto de regras para esta verificação, cada
qual com sua prioridade, e o Kernel verifica se o pacote se enquadra inicialmente em
uma prioridade mais baixa. O Kernel utiliza três tabelas iniciais:
• local: identificada no Kernel por 255, é associada com a regra de prioridade
0, possui rotas para endereços locais e de broadcast, tal regra não pode ser
alterada;
• main: identificada no Kernel por 254, é associada com a regra de prioridade
32766, possui as demais rotas normais do sistema, sem envolver quaisquer
políticas especiais de roteamento, podendo ser alterada livremente pelo
administrador, ou até apagada;
• default: identificada no Kernel por 253, é associada com a regra de
prioridade 32768, por padrão está vazia, é reservada para alguma atividade
de pós-processamento se o pacote não foi selecionado por nenhuma das
tabelas iniciais.
Podem-se verificar as regras existentes no sistema com o comando da Listagem
20.
# ip rule list
0: from all lookup local
32766: from all lookup main
32767: from all lookup default
Listagem 20 – Verificando regras existentes
Por padrão, todas as regras são aplicadas a todos os pacotes de acordo com a
prioridade descrita, confrontando-se assim com cada tabela de roteamento até que a
regra atenda ao pacote a ser roteado.
Não devemos confundir tabelas de roteamento com as regras: as regras
apontam para as tabelas de roteamento, várias regras podem se referir a uma tabela
de roteamento e algumas tabelas de roteamento podem não ter regra alguma
apontando para elas. Se o administrador remove todas as regras se referindo a uma
tabela, a tabela não é usada, mas permanece e só desaparecerá se todas as rotas
contidas nela forem apagadas.
O Kernel trabalha exclusivamente com o identificador numérico da tabela.
Podem-se estabelecer novas tabelas e definir situações especiais de roteamento.
Para uso da ferramenta ip, devera ser informado essas novas tabelas no arquivo
/etc/iproute2/rt_tables, cujo conteúdo padrão é apresentado na Listagem 21.
# reserved values
255 local
254 main
253 default
0 unspec
Listagem 21 – arquivo rt_tables
Pode-se adicionar uma nova tabela editando este arquivo e definir uma regra
nova com o comando ip rule add. Tal regra pode ser aplicada para pacotes que
atendam a critérios específicos como, por exemplo, o endereço IP de origem. Isto
permite a realização de Roteamento pela Origem, conforme será abordado no
estudo de caso.
5 Rotas Alternativas
Para disponibilizar o roteamento de pacotes por de mais de um link ( roteador ),
é necessário trabalhar com técnicas de roteamento avançado não suportadas pela
ferramenta “route”. Uma estrutura de roteamento baseada em caminhos alternativos
implica em uma configuração um pouco mais complexa e pode ser alcançada
através de um roteamento dinâmico, ou estático, quando o sistema permite a
manipulação dos diferentes caminhos ao ser constatada a necessidade.
No roteamento multipath é preciso determinar quando um pacote deve trafegar
por um link ou por outro. O comando “route” permite manipular apenas a tabela
“main”, mas dificilmente podemos trabalhar com ambos os links sem manipular as
rotas em tabelas separadas (não é possível). Ao definir diferentes tabelas de
roteamento, será possível selecionar as tabelas de acordo com as regras
adicionadas por “ip rule”.
Figura 01 – Exemplo de topologia lógica de rede.
Na Figura 01 pode-se avaliar que a rede 192.168.254.0/24 tem o acesso a
Internet controlado por um firewall Linux. Seguindo esse modelo de rede, podem-se
explicar três situações de roteamento.
• Disponibilizar o acesso a um serviço existente no firewall;
• Disponibilizar o acesso a Internet para as estações de Rede Local;
• Disponibilizar o acesso ao serviço de web através de um servidor de rede
local;
Segundo a imagem, a rede não está definida de acordo com uma estrutura de
DMZ. É importante deixar claro que esta configuração não é segura e está sendo
utilizada apenas para ilustrar o roteamento multipath. Fisicamente, é importante que
o servidor não esteja conectado diretamente a rede local.
A configuração do firewall Linux pode ser diferente dependendo da tecnologia
adotada. Conforme a Figura 01 há 2 endereços Públicos (187.95.23.132 e
200.244.32.12), o Firewall poderá ser configurada para responder pelos endereços
dessa faixa de rede ( fornecido pela operadora ).
Ao ativar as duas interfaces de rede, é provável que nenhum roteador na Internet
seja capaz de fazer um simples teste de ping aos endereços públicos setados nas
placas do Firewall, mesmo estando na mesma rede, será necessário informar o
default gateway. O problema é que existe dois links de acesso a Internet, ou seja,
mais de um default gateway.
Como estaticamente a tabela mail só admite um “default gw”, é necessário então
trabalhar com o iproute2. Caso seja adicionado 2 default gateway com métricas
diferentes ( usando append ) aquele que tiver menor métrica terá prioridade e será
utilizado pelo kernel. A manipulação de rotas de acordo com a métrica funcionará
apenas com a utilização de protocolos específicos ( para roteamento dinâmico ).,
Dependendo da configuração, existe a possibilidade de ambos os links funcionarem
com um único default gateway, mas o retorno será sempre pelo mesmo roteador,
quebrando a redundância que busca-se ao implementar um roteamento multipath.
O problema está relacionado ao retorno do pacote. Existem diferentes elementos
que poderão influenciar no sucesso do roteamento, como a existência de regras de
firewall para compartilhar os acessos de Internet as estações da rede local. É um
pouco mais complexo enxergar as diferentes possibilidades, mas tenha em mente
que retorno (ou resposta) deve partir do endereço ao qual o cliente solicitou uma
conexão, e a melhor forma de fazer isto é diferenciando os links em tabelas de
roteamento separadas.
Para disponibilizar o acesso aos endereços 187.95.23.133 e 200.244.32.13,
pode-se fazer a seguinte configuração. Primeiro será removido o default gw da tabel
main, para que assim possa selecionar o gateway correto de acordo com a
respectiva tabela. Observe a Listagem 22
# Removendo o default gw da tabela main
ip route del default
# criando as tabelas de roteamento para cada um dos links
ip route add default via 187.95.23.132 src 187.95.23.133 table 100
ip route add default via 200.244.32.12 src 200.244.32.13 table 110
# Definindo as regras de roteamento
ip rule add prio 10 table main
ip rule add prio 15 from 187.95.23.132 table 100 ip rule add prio 15 from 200.244.32.12 table 110
# Definindo um default gw as demais situações
ip rule add prio 30 table 110
# Aplicando as modificações
ip rule flush cache
Listagem 22 –Exemplo de script
A preferencia fica a critério do administrador, não deverá ser adicionado ou
modificado para as prioridades com numeração padrão ( definidas pelo sistema
operacional ), as tabelas foram adicionadas a partir da prioridade de numero 15 para
deixar vaga a possibilidade de adição de mais quatro regras, caso necessário, antes
que o sistema analise a regra de prioridade “15”. E uma forma de reservar espaço
para novas regras que necessitem de maior prevalência.
Quando um host da Internet (200.234.2.2) fizer um ping a 187.95.23.133, e
retorno de um sinal de echo-replay será feito da seguinte maneira:
• A tabela main será consultada, após a local, mas a rota para esse endereço
(200.234.2.2) não será localizada porque não existe um default gw atribuído
a esta tabela;
• A regra seguinte com prioridade 15 será ignorada porque o host de origem
(no retorno) é 187.95.23.133 e não 187.95.23.132;
• A próxima regra é verificada ( pri 16 ) e o default gw é selecionado, pois o
endereço de origem realmente 187.95.23.133.
A regra de prioridade “30” seleciona 187.95.23.133 como um default gw para
todas as demais situações, Repare que, neste exemplo, a regra de prioridade “16”
acaba redundante e poderá ser removida. Há também a possibilidade de uma
conexão ADSL em modo roter, porém não será abordado nesse artigo.
Disponibilizado acesso a Internet à rede local
Existem diferentes formas de configuração para todos os exemplos tratados,
incluindo este. Podem-se compartilhar os acessos a Internet através de um
balanceamento de carga.
Inicialmente, serão confirmados alguns pré-requisitos (selecionando o primeiro
link para navegação na Internet). Observe um exemplo na Listagem 23
# Verificar se o roteamento de pacotes está ativo, a opção ip_forward deve estar setada para 1
cat /proc/sys/net/ipv4/ip_forward
# nat para a tabelas originadas da rede local
iptables -t nat -A POSTROUTING -o eth0 -s 192.168.254.0/24 -j MASQUERADE
# permissao de acesso
iptables -A FORWARD -o eth0 -s 192.168.254.0/24 -j ACCEPT
iptables -A FORWARD -i eth0 -d 192.168.254.0/24 -m state –state ESTABLISHED, RELATED -j
ACCEPT
# regras de roteamento
ip role add prio 30 from 192.168.254.0/24 table 100
Listagem 23 – Configurando pré-requisitos
A configuração das tabelas de roteamento que foram verificadas anteriormente
deve ser respeitada. O primeiro roteador será selecionado com default gateway para
todas as estações da rede 192.168.254.0/24. A Listagem 24 traz um exemplo com
configuração mínima.
#/bin/bash
ip route del default
ip route flush table 100
ip route flush table 110
ip route add default via 187.95.23.132 table 100
ip route add default via 200.244.32.12 table 110
ip rule add prio 10 table main
… ip rule add prio 30 from 192.168.254.0/24 table 100
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
iptables -F
iptables -F -t nat
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A POSTROUTING -t nat -o eth0 -s 192.168.254.0/24 -j MASUQERADE
iptables -A FORWARD -s 192.168.254.0/24 -j ACCEPT
iptables -A FORWARD -d 192.168.254.0/24 -m state --state -j ACCEPT
Listagem 24 – Exemplo de configuração minima
No Exemplo da Listagem XX não foram exemplificado regras de roteamento (ip
rule), no intervalo representado pelas prioridades 10 e 30, mas há de se lembrar que
a verificação das regras é sequencial e a regra de prioridade 30 será processada,
desde que nenhuma regra de prioridade inferior selecione outra tabela quando uma
condição for satisfeita.
5.1 Exemplo de Firewall com iptables e iproute2
A seguir é descrito um script para exemplificar o uso das ferramentas iproute2 e
iptables. Os IPs aqui utilizados são fictícios, bem como seus gateways. O leitor
deverá trocá-los pelos IPs da sua rede conforme a necessidade.
Nesse exemplo é apresentado um script pronto em um firewall com 3 interfaces
e rede. A primeira ETH0 é a interface conectada à rede administrativa. A interface
ETH1 é a interface ligada ao primeiro link de Internet e por ultimo, a interface ETH2,
ligada ao segundo link de Internet.
Nesta parte do script é descrito as variáveis para as interfaces de rede, será
utilizado a seguinte descrição. A Interface ETH0 recebe o nome de
v_INTERFACE_ETH0_LAN, essa interface é responsável pelo acesso a rede
administrativa. A Interface ETH1 recebe o nome de v_INTERFACE_ETH1_LINK_01,
essa interface é responsável por receber o primeiro link de Internet. A Interface
ETH2 recebe o nome de v_INTERFACE_ETH2_LINK_02, essa interface é
responsável por receber o segundo link de Internet.
v_INTERFACE_ETH0_LAN='eth0'
v_INTERFACE_ETH1_LINK_01='eth1'
v_INTERFACE_ETH2_LINK_02='eth2'
Listagem 25 – Criando variáveis para interfaces
As próximas variáveis são utilizadas para gravar os IP's dos gateways.
v_IP_INTERFACE_LINK_01='187.95.23.132'
v_IP_INTERFACE_LINK_02='200.244.32.12'
Listagem 26 – Criando variáveis para IP’s Públicos
O próximo passo no script é utilizar o comando IPTABLES para mascarar os IPs,
ou seja, fazer um NAT (Network Address Translation) para que os pacotes que
venham da Interface ETH0 com IPs da rede interna, ou mesmo pacotes gerados
dentro do próprio Firewall, possam sair para a Internet com endereços trocados,
usando os IPs das interfaces ligadas aos Links de Internet. O alvo MASQUERADE
ao final do comando faz exatamente isto. Caso contrário, utilizaria o alvo ACCEPT,
mas dessa forma os pacotes sairiam para a Internet com IPs da rede interna e
jamais retornariam ao Firewall.
iptables -t nat -A POSTROUTING -o $v_INTERFACE_ETH1_LINK_01 -j MASQUERADE
iptables -t nat -A POSTROUTING -o $v_INTERFACE_ETH2_LINK_02 -j MASQUERADE
Listagem 27 - Compartilhando Internet
Aqui começamos a marcar os pacotes diferenciando-os pela porta utilizada.
Observe que escolhemos os pacotes com destino às portas 80 (HTTP) 443 (HTTPS)
25 (SMTP) 110 (POP)
Todo pacote que passar pelo Firewall com estas particularidades receberão uma
"marca", uma espécie de carimbo. Pacotes destinados à porta 80 recebem "carimbo"
de número 2, pacotes com destino à porta 25 recebem "carimbo" número 3. Desta
forma, podemos diferenciá-los para que mais à frente no script tenhamos controle do
que saiu/entrou e por onde saiu/entrou.
iptables -t mangle -A PREROUTING -i $v_INTERFACE_ETH0_LAN -p tcp --dport 80 -j MARK --set-
mark 2
iptables -t mangle -A PREROUTING -i $v_INTERFACE_ETH0_LAN -p tcp --dport 443 -j MARK --set-
mark 2
iptables -t mangle -A PREROUTING -i $v_INTERFACE_ETH0_LAN -p tcp --dport 25 -j MARK --set-
mark 3
iptables -t mangle -A PREROUTING -i $v_INTERFACE_ETH0_LAN -p tcp --dport 110 -j MARK --set-
mark 3
Listagem 28 – Marcando pacotes
A diferença entre o PREROUTING e o OUTPUT é que, PREROUTING abrange
os pacotes que foram originados fora do FIREWALL, por exemplo, Interface ETH0
($v_INTERFACE_ETH0_LAN), enquanto OUTPUT são os pacotes originados no
Firewall, ou seja, na própria console.
iptables -t mangle -A OUTPUT -p tcp --dport 80 -j MARK --set-mark 2
iptables -t mangle -A OUTPUT -p tcp --dport 443 -j MARK --set-mark 2
iptables -t mangle -A OUTPUT -p tcp --dport 25 -j MARK --set-mark 3
iptables -t mangle -A OUTPUT -p tcp --dport 110 -j MARK --set-mark 3
Listagem 29 –Marcando pacotes de saída
Nesse ponto montam-se as tabelas dinâmicas a partir das marcas (carimbos)
que fizemos lá em cima no nosso script. Pacotes que foram marcados com 2 vão
para a tabela "table 20" e os marcados com 3, vão para a tabela "table 21", com a
mesma prioridade. Perceba o PRIO 20 após os comandos.
ip rule add fwmark 2 table 20 prio 20
ip rule add fwmark 3 table 21 prio 20
Listagem 30 – Montando tabelas dinâmicas
Caso queira condicionar esta marcação de outra forma, pode-se utilizar o
comando das seguintes formas. Este comando condiciona que todos os pacotes que
vierem da rede 192.192.254.0 vão para a tabela 20. No exemplo ele está
comentado.
# ip rule add from 192.168.254.0/24 table 20
Listagem 31 – Outra forma de adicionar marcação de pacotes
Agora será destinado a direção correta aos pacotes que foram marcados e
cadastrados na tabela dinâmica. Veja que os pacotes que foram enviados para a
tabela 20 têm como DEFAULT GATEWAY o LINK1. Sendo assim, os pacotes serão
enviados para o LINK1 na Interface ETH1 com o IP 200.201.202.1. Já os pacotes da
tabela 21 serão enviados para o LINK2 na Interface ETH1, com o IP 200.201.202.2
ip route add default via $v_IP_INTERFACE_LINK_01 dev $v_INTERFACE_ETH1_LINK_01 table 20
ip route add default via $v_IP_INTERFACE_LINK_02 dev $v_INTERFACE_ETH2_LINK_02 table 21
Listagem 32 – Apontando a direção dos pacotes com o comando ip route
Este último comando limpa a tabela, caso ela já tenha sido utilizada
anteriormente, ou apenas para termos certeza de que quando você resetar as regras
todas, o Firewall não guarde nenhum tipo de informação na memória (cache). Daí o
nome FLUSH CACHE.
ip route flush cache
Listagem 33 – executando um flush
6 Conclusão
Uma série de outros recursos pode ser explorada com o uso do iptables e ip,
sempre que o convencional não atender às expectativas. Uma boa referência é o
documento “Linux 2.4 Advanced Routing HOWTO”, disponível a partir de
http://www.linux.org/ .
Como exemplo de solução possível usando os recursos aqui abordados, vimos o
uso de roteamento pela origem onde há uma necessidade de se aproveitar o recurso
de dois links, separando o uso pelas sub-redes. Embora tal tema tenha sido tratado
com extrema precisão e clareza em artigo anterior, “ Roteando pela Origem com
Linux ”, a solução apresentada baseia-se no Kernel de série 2.0, através de
aplicação de patches ao mesmo. O uso desta versão do Kernel não é desejável, pois
limita os recursos disponíveis do sistema, ao mesmo tempo em que o Kernel 2.4
possui um subsistema de rede no Kernel do Linux totalmente remodelado e com
claras melhorias em relação ao 2.0, o que implica que a implementação descrita no
referido artigo não se aplica a sistemas baseados em versões recentes do Kernel.
Como a versão do kernel já se expandindo para 3,16 novos recursos e correção de
bugs foram atualizados, criando ainda maior confiabilidade em sua utilização.
Este artigo procurou apenas introduzir as ferramentas ip, iproute2 e iptable.
Embora apenas tenha sido citada, a ferramenta é extremamente poderosa para a
execução de ações de controle de tráfego, sugerindo-se uma análise cuidadosa dos
recursos da mesma. As três ferramentas usadas em conjunto tornam o Linux um
roteador altamente flexível, configurável e seguro, equiparado a um grupo seleto de
soluções de roteamento. Para trabalhos futuros, visa-se apresentar com mais
detalhes o gerenciamento de banda e balanceamento de carga entre links.
REFERENCIAS BIBLIOGRAFICAS. FREITAS,A.E.S. Roteamento avançado com Linux. Boletim RNP, Volume 6 2012. Disponível em: https://memoria.rnp.br/newsgen/0201/roteamento_linux.html . Acesso em Maior 2015. FERREIRA. F. Roteamento com Iptables e Iproute2. Viva o Linux, Disponível em : http://www.vivaolinux.com.br/artigo/Firewall-Linux-Roteamento-avancado-usando-iproute2-e-iptables-(load-balance2). Acesso em Outubro 2014 PEIXINHA. I.C. “Roteando pela Origem com Linux” in NewsGeneration volume 2 número 7. RNP. Setembro de 1998.Disponível em:http://www.rnp.br/newsgen/9809/rot-linux.html . Acesso em Julho 2014 Netherlabs B.V, Gregory Maxwell, Remco van Mook, Martijn van Oosterhout, Paul B Schroeder e Jasper Spaans – Linux 2.4 Advanced Routing HOWTO. Linux Documentation Project. Setembro de 2001. Disponível em: http://www.linux.org/docs/ldp/howto/Adv-Routing- HOWTO.html. Acesso em Maio 2014 KUZNETSOV A. N. - IP Command Reference. Institute for Nuclear Research, Moscou. Abril de 1999.Disponíel em: http://defiant.coinet.com/iproute2/ip-cref/node104.html. Acesso em Setembro 2014