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
Download

Otimização do consumo de banda utilizando Iptables