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 Reis 1 1 Faculdade 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, perdendose 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 ip link ip addr ip neigh ip route Descrição Para ajustar ou visualizar a configuração de uma interface de rede; Para configurar ou visualizar o endereço IP de uma interface de rede; Para configurar ou visualizar o cachê da tabela ARP de hosts vizinhos 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 --setmark 2 iptables -t mangle -A PREROUTING -i $v_interface_eth0_lan -p tcp --dport 443 -j MARK --setmark 2 iptables -t mangle -A PREROUTING -i $v_interface_eth0_lan -p tcp --dport 25 -j MARK --setmark 3 iptables -t mangle -A PREROUTING -i $v_interface_eth0_lan -p tcp --dport 110 -j MARK --setmark 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-usandoiproute2-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/ipcref/node104.html. Acesso em Setembro 2014