Otimização do consumo de banda utilizando Iptables Layer 7 e HTB Carlos Alberto de Avila Junior / Rafael Zen de Azevedo Curso de Especialização em Redes e Segurança de Sistemas Pontifícia Universidade Católica do Paraná. Curitiba, Novembro 2010 Resumo Este artigo tem por objetivo demonstrar a implementação de um firewall com Iptables Layer7, possibilitando um filtro mais refinado no tráfego corporativo e, controle de banda utilizando HTB para que o consumo de banda seja realmente utilizado por aplicações de interesse ao negócio, limitando o tráfego recreativo e bloqueando aplicativos que não sejam de interesse. 1. Introdução “Segurança é uma das preocupações mais importantes para os ambientes de Serviços em Redes. Serviços de Segurança como autenticação, controle de acesso, Auditoria e criptografia devem ser projetadas.” [1][José.T.Júnio –Redes de Computadores, Makron Books,1999 pág29], Uma política de segurança consiste em uma série de decisões que determinarão o acesso e a integridade dos dados da empresa, o Firewall tem por objetivo proteger a máquina contra acessos indesejados, proteger serviços que estejam rodando na máquina, e bloquear a passagem de determinados dados que não são bem vindos, como por exemplo, conexões de origem da internet para uma rede corporativa ou aos seus dados pessoais. Certamente essas políticas de segurança são proprietárias para cada empresa. É importante observar que toda organização, independente do seu porte, ou atividade, deve conter um política de segurança estabelecida para que não haja eventos inaceitáveis e vulnerabilidades. Os ataques acontecem para levar algum tipo de vantagem sobre falhas nos sistemas de uma organização, por isso a utilização de um Firewall é um quesito mínimo de segurança que cada vez mais e importante no mundo digital, onde são gastos milhões quando falamos em segurança da informação, uma vez o mesmo bem configurado inibe ameaças de ataques ou acesso indesejados. O objetivo desse artigo é demonstrar maneiras para que a banda seja consumida por aplicações de interesse da empresa, limitando o consumo de banda para determinados protocolos, priorizando aplicações de maior importância para o negócio e bloqueando o tráfego indesejado utilizando Iptables Layer 7 [2], e HTB (Token bucket) [3]. A utilização de filtros Layer 7 possibilita o bloqueio de tráfego na ultima camada do modelo OSI, podendo dessa maneira o tráfego de uma aplicação específica ser bloqueado (MSN, Torrent), sem a necessidade de ser utilizado o endereço IP ou a Porta do aplicativo que, podem ser alterados, inutilizando a regra. Uma lista completa dos protocolos suportados pode ser encontrada no site oficial do projeto “http://l7filter.sourceforge.net”. O controle de tráfego e priorização de banda será a função do HTB, que se encontra trabalhando juntamente com o firewall saída dos pacotes, dando prioridade nos serviços essenciais para a organização. A estrutura do artigo será da seguinte forma. Na seção 2 será explicado o funcionamento inicial do Firewall , seu significado,layer 7 , sua instalação e exemplos. Na seção 3 será apresentado o controle de tráfego e seu funcionamento , logo após conclusão sobre este artigo e suas referências. 2. Funcionamento do Firewall. Há mais de uma forma de funcionamento do firewall, basicamente de acordo com o objetivo de seu administrador, que pode controlar acesso a aplicação ou filtragem de pacotes. Os firewalls tradicionais têm como objetivo qualificar o pacote utilizado na camada 4 do modelo OSI (TCP ou UDP) [4], e utilização das portas de origem e/ou destino. Mas este tipo de firewall pode ser falho quando falamos de aplicações onde as portas são aleatórias, como os programas P2P(Peer-to-Peer) [5] , ou mensageiros como MSN, ICQ. 2.1 O que é Iptables. Iptables é o nome da ferramenta onde são criadas regras de firewall e Nat (Network Address Translation), desenvolvido pela NetFilter Core Team, e contribuidores. O iptables faz parte de todas distribuições modernas de Linux. Dentre as funções do Iptables está: • Especificação de portas/endereço de origem/destino • • • • • • • Suporte a protocolos TCP/UDP/ICMP (incluindo tipos de mensagens ICMP) Muito rápido, estável e seguro. Possui mecanismos internos para rejeitar automaticamente pacotes duvidosos ou mal formados. Suporte a especificação de tipo de serviço para priorizar o tráfego de determinados tipos de pacotes. Permite especificar exceções para as regras ou parte das regras Redirecionamento de portas Limitação de passagem de pacotes/conferência de regra (muito útil para criar proteções contra, syn flood, ping flood, DoS, etc),entre outras. 2.2 Passagens dos pacotes pelos filtros. [Figura1] Diante deste Diagrama [Figura1], podemos observar que quando um pacote entra na máquina, o Kernel define o tipo de roteamento interno escolhendo uma Chain. Onde determinará o destino do pacote e será aceito ou rejeitado.Caso seja aceito, continua a caminho do destino e é analisado seu cabeçalho que diz o que deve ser feito com o mesmo,se o pacote analisado não se encaixa em uma regra, ele é descartado na maioria dos casos. Se o destino do pacote é a própria máquina, após roteamento, ele entra no INPUT,é processado,se aceito é encaminhado a saída (OUTPUT). 2.3 Iptables Layer 7 O layer 7 teve o início de seu desenvolvimento em 2003, devido a necessidade de haver apenas firewall com bloqueio de aplicação proprietários, sendo muitas vezes caros e nem sempre eficientes.Então foi desenvolvido está solução em Linux, sendo livre seu uso e adaptação em cada ambiente de utilização. O Layer 7 ou L7 é uma extensão para o Kernel e Iptables, que tem por função identificar o pacote, ou função do aplicativo ,através de expressões regulares na camada de aplicação, verificando o cabeçalho do pacote.Não sendo uma solução de firewall, apenas trabalhando em conjunto com o firewall iptables. Existem diversos casos onde o bloqueio de endereço IP e portas fica trabalhoso devido a possibilidade de utilização aleatória ou desses parâmetros pelo provedor do serviço ou a simples mudança dos mesmos, o bloqueio pode ser efetuado diretamente na camada de aplicação do modelo OSI (Open Systems InterConnect),[6]. 2.4 Instalação do Iptables Layer 7 O passo a passo abaixo irá demonstrar como preparar o Kernel do Debian GNU Linux para o suporte ao Iptables Layer 7. 2.4.1 – Instalação padrão do Debian Lenny. A interface gráfica não é necessária para essa implementação. 2.4.2 – Atualização completa do Sistema # apt-get update # apt-get upgrade # apt-get dist-upgrade 2.4.3 – Instalação dos pacotes necessários para a compilação dos fontes e pacotes úteis para o desenvolvimento da solução. # apt-get install openssh-server vim vim-scripts wget nmap traceroute lynx ftp dnsutils htop wireshark tshark zlib1g-dev kernel-package build-essential libncurses5dev 2.4.4 - Depois de instalados os pacotes, ir para o diretório "/usr/src", onde serão gravados os fontes dos pacotes a ser compilados. # cd /usr/src 2.4.5 - Baixando os pacotes necessários Nesta etapa serão efetuados os downloads dos pacotes necessários para a implementação. As versões utilizadas baseiam-se na instalação e atualização completa do Debian Lenny, conforme descrito nos passos 2.4.1 e 2.4.2. Kernel: # wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.28.tar.bz2 Iptables: # wget http://www.netfilter.org/projects/iptables/files/iptables-1.4.2.tar.bz2 Download dos patches do kernel para utilizar L7 no iptables – Netfilter A versão do Netfilter utilizada foi a 2.21. A ultima versão, 2.22, apresentou erros durante a compilação do iptables. # wget http://downloads.sourceforge.net/l7-filter/netfilter-layer7-v2.21.tar.gz Download dos protocolos L7 Os arquivos contidos nesse pacotes são responsáveis por tratar e classificar juntamente com o iptables o tráfego . Os pacote de protocolos L7 é atualizado constantemente, adicionando novos protocolos e funcionalidades, tornando a implementação do filtro L7 mais eficaz. # wget http://ufpr.dl.sourceforge.net/project/l7filter/Protocol%20definitions/2009-05-28/l7-protocols-2009-05-28.tar.gz 2.4.6 - Descompactando os fontes # tar -xjf linux-2.6.28.tar.bz2 # tar -xjf iptables-1.4.2.tar.bz2 # tar -xzf netfilter-layer7-v2.21.tar.gz # tar -xzf l7-protocols-2009-05-28.tar.gz 2.4.7 - Removendo o padrão da distribuição # apt-get remove --purge iptables 2.4.8 - Aplicando os patches aos fontes do Kernel # ln -s /usr/src/linux-2.6.28 /usr/src/linux # cd /usr/src/linux # patch -p1 < ../netfilter-layer7-v2.21/kernel-2.6.25-2.6.28-layer7-2.21.patch O resultado da aplicação do patch do kernel deve ser parecido com o conteúdo abaixo: Server:/usr/src/linux# patch -p1 < ../netfilter-layer7-v2.21/kernel-2.6.25-2.6.28layer7-2.21.patch patching file net/netfilter/Kconfig patching file net/netfilter/Makefile patching file net/netfilter/xt_layer7.c patching file net/netfilter/regexp/regexp.c patching file net/netfilter/regexp/regexp.h patching file net/netfilter/regexp/regmagic.h patching file net/netfilter/regexp/regsub.c patching file net/netfilter/nf_conntrack_core.c patching file net/netfilter/nf_conntrack_standalone.c patching file include/net/netfilter/nf_conntrack.h patching file include/linux/netfilter/xt_layer7.h 2.4.9 - Configurando o kernel para habilitar o suporta ao Iptables L7 # make menuconfig Para habilitar o suporte ao L7, acessar os menus conforme seqüência e figura [Figura2] abaixo: -- General Setup --Networking Support --Networking Options -- Network packet filtering framework (Netfilter) -- Core Netfilter Configuration -- <M> "layer7" match support (NEW) -- <*> Layer 7 debugging output [Figura 2] Após a ativação do módulo do Kernel, sair do menu de compilação e salvar as alterações. 2.4.10 - Compilação dos fontes do kernel Existem algumas formas de compilar o Kernel do Linux, nesse artigo o método utilizado será o de criação de um pacote .deb com as alterações efetuadas nos fontes e na seqüência a instalação do pacote. O comando abaixo irá gerar o pacote .deb para a instalação do novo Kernel com suporte L7. Esse passo pode ser bem demorado, dependendo da capacidade de processamento do host. # make-kpkg --initrd kernel_image Após o pacote do Kernel com as alterações efetuadas nos fontes ser criado, instalar o .deb usando o utilitário "dpkg". # cd .. # dpkg -i linux-image-2.6.28_2.6.28-10.00.Custom_i386.deb 2.4.11 – Preparação dos fontes do Iptables Depois de o Kernel ser preparado, compilado e instalado, será necessário instalar o Iptables a partir dos fontes, utilizando-se também das alterações na configuração do Kernel para o correto funcionamento. # cd /usr/src/iptables-1.4.2 A biblioteca “libxt_layer7”, que faz parte do pacote do Netfilter é necessária para a compilação do Iptables com Suporte L7. Os arquivos devem ser copiados para o diretório de extensões do Iptables, conforma abaixo. # cp ../netfilter-layer7-v2.21/iptables-1.4.1.1-for-kernel-2.6.20forward/* extensions/ 2.4.12 – Compilação e instalação do Iptables a partir do fontes. Depois dos fontes preparados para o suporte L7, executar os passos abaixo para compilar e instalar o Iptables. # ./configure -with-ksource=/usr/src/linux # make # make install 2.4.13 - Instalação dos protocolos L7 # cd /usr/src/l7-protocols-2009-05-28 # make install 2.4.14 - Após a instalação do pacote gerado, reiniciar o sistema. # shutdown -r now 2.4.15 - Testando o funcionamento do iptables L7 Carregar o módulo # modprobe ipt_layer7 Configurando o Linux para carregar o módulo na inicialização # echo ipt_layer7 >> /etc/modules 2.5 - Exemplo de criação de regra com Iptables Layer 7 Uma regra simples utilizando Iptables L7 deve possuir como exemplo a estrutura abaixo: # iptables –A <INPUT/OUTPUT/FORWARD> -m layer7 --l7proto <PROTOCOLO> -j <DROP/ACCEPT> Exemplo de regra de bloqueio a conexões FTP. # iptables -A FORWARD -m layer7 --l7proto ftp -j DROP 3.Controle de banda e priorização de tráfego. Se imaginarmos uma rede de tráfego de informações, com a velocidade de 4 Mbps,e 100 estações de trabalho,onde qualquer tipo de informação pode ser acessado na internet,sem controle, isso pode se tornar muito prejudicado sem um controle sobre o conteúdo. Dentro de uma rede liberal, onde pode se utilizar programas de compartilhamento de arquivos, como Emule, kazaa ou P2P(Peer-to-Peer), poderão causar enorme congestionamento. Se uma máquina está utilizando esses programas para fazer um download, haverá uma guerra entre os usuários que estão tentando o acesso a uma página comum e está máquina acessando o programa de compartilhamento, causando lentidão para as outras 99 máquinas. Se aumentarmos o link de internet, o problema não seria sanado, apenas aumentaria o poder de transferência do usuário dos programas. Com o controle de tráfego, o administrador de redes pode estar dividindo o principais serviços de sua rede local com o seu link de internet, como por exemplo, o desenho abaixo [Figura3]. [Figura3] 3.1 Funcionamento do controle de tráfego HTB. O HTB (Hierarchy Token Bucket) [7], funciona como um controlador de uso de banda para determinado link,funciona de forma hierárquica, e controlando todo o fluxo de informações que são enviados através da placa de rede,e controlado pelo Qdisc (queuing discipline) ou disciplina de fila. como podemos ver abaixo, a informação entra na máquina, é armazenado em um fila de espera para saída e logo após é transmitido. [Figura4] Na exemplo acima [Figura4], a interface eth0, controla o download e a interface eth1 controlará o upload. 3.2 Instalação do HTB Baseando-se que os passos indicados na instalação do Iptables Layer 7 foram todos concluídos sem problemas, não será necessária a instalação de nenhum pacote adicional para a utilização do HTB. Um teste simples para verificar se os pacotes necessários estão instalados está abaixo. # tc qdisc add dev eth0 root handle 1:0 htb Se nenhum erro ocorrer, a implementação dos scripts para priorizar de tráfego irão funcionar corretamente. Se o Sistema Operacional retornar alguma mensagem de erro, será necessário instalar o pacote “iproute” # apt-get install iproute 3.3 Exemplo de implementação do HTB Podemos citar abaixo dois exemplos de regras utilizando HTB com as devidas legendas: Tc class add dev eth0 parent 1:0 classid htb rate 10kbit ceil 50 kbit # onde : Tc disc add = será adicionada uma classe dev eth0 = interface de fluxo. Parent 1:0 = hierarquicamente abaixo do handle 1:0 Classid 1:1 = maior e menor de identificação da classe. HTB = algoritmos utilizados são o HTB. Rate 10kbit = está classe terá 10 kbits garantidos. Ceil 50kbit = podendo chegar até 50 kbits caso haja link disponível. Ou podemos adicionando um filtro de tráfego : Tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32 match ip Sport 80 0xffff flowid 1:1 # sendo: Tc filter = será adicionada um filtro. Protocol ip = engloba tanto tcp quanto udp. Prio 1 = pode existir prioridades entre os filtros. U32 = tipo de classificador que permite usar atributos dos pacotes. Match ip sport 80 0xffff = sempre que a porta de origem for 80. Flowid 1:1 = direcionar esse tráfego para classe 1:1. 4. Script para utilização do Iptables e HTB O script de exemplo abaixo é um exemplo simples para bloquear a utilização de MSN Messenger e Torrent utilizando regras de Iptables L7 e, reservar 50% de banda para a utilização de HTTP e limitar em 2% a utilização de FTP. O script baseia-se em um link de 10Mbps. #!/bin/bash # TCC - PUCPR # Script de Exemplo para bloqueio com Iptables L7 e priorização de banda com HTB # # Nesse exemplo, serão bloqueados os tráfegos de MSN e Torrent # reservando 50% de banda outbound para HTTP e limitando para 2% de banda # outbound FTP em um link de 10Mbps. # Carregando módulos Iptables L7 modprobe ipt_layer7 # Removendo regras carregadas iptables -F # Bloqueio de MSN Messenger iptables -A FORWARD -m layer7 --l7proto msnmessenger -j DROP # Bloqueio de Torrent iptables -A FORWARD -m layer7 --l7proto bittorrent -j DROP # Removendo políticas de trafego criadas anteriormente tc qdisc del dev eth0 root # Definindo a utilização do HTB na interface eth0 tc qdisc add dev eth0 handle 1:0 root htb # Definindo a classe para o FTP - 2% tc class add dev eth0 parent 1:0 classid 1:1 htb rate 256kbps ceil 256kbps # Definindo a classe para o HTTP - 50% tc class add dev eth0 parent 1:0 classid 1:2 htb rate 5120kbps # Definindo o filtro de tráfego para o FTP tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32 match ip dport 23 0xffff flowid 1:1 # Definindo o filtro de tráfego para o HTTP tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32 match ip dport 80 0xffff flowid 1:2 # Final do Script 5. Conclusão Podemos concluir que a utilização das ferramentas iptables layer 7 e HTB, é de extrema importância para a organização, devido aos bloqueios serem de grande eficácia, e o controle de utilização da banda de internet serem essências para determinados serviços vitais para o funcionamento da empresa. Se imaginarmos uma rede de grande porte, muitas vezes fica difícil o administrador controlar toda demanda de uso, sendo desta forma o controle será centralizado, seguro, e prático. Está solução atende o objetivo que foi proposto no seu início, sendo sempre importância o acompanhamento do seu desempenho e revisão das regras de firewall para que sempre seja eficaz. 6. Referências Bibliográficas [1] José Helvécio T. Júnior, Redes de Computadores, Makron Books, 1999, pág 29 [2] Página do Instituto de Estudos Superiores da Amazônia, estudo sobre firewall, iptables e layer 7. Link: http://www3.iesampa.edu.br/ojs/index.php/computacao/article/view/167/157http://pt.wi kipedia.org/wiki/Kernel [3] Página do Wikipédia, definição sobre HTB Link: http://en.wikipedia.org/wiki/Token_bucket [4] Página de definição sobre firewall Link : http://www.infowester.com/firewall.php [5] Página de definição sobre Peer-to-Peer Link : http://pt.wikipedia.org/wiki/P2P [6] Página do Wikipédia, definição sobre modelo OSI Link : http://pt.wikipedia.org/wiki/Modelo_OSI [7] Página do manual do HTB Link: http://luxik.cdi.cz/~devik/qos/htb/manual/userg.htm