Aí vai. Se alguém achar algum erro ou inconsistência, favor me avisar. Quem quiser publicar este artigo em seu site, sinta-se à vontade, mas por favor, desde que seja citado o autor. Um abraço, Fabiano. Incrementando seu Firewall com o Layer 7 Filter
Neste artigo demonstro como compilar, instalar e utilizar o L7 Filter, um filtro de pacotes que se baseia no protocolo da aplicação utiliza. 1) Introdução As formas tradicionais de classificação de pacotes, baseadas geralmente no tipo de protocolo de transporte, na camada 4 do modelo de rede OSI (TCP ou UDP) e nas portas de origem e/ou destino, são suficientes na maioria dos casos. Porém ela pode ser ineficaz em alguns casos específicos, como por exemplo, no caso de programas de P2P (programas de compartilhamento de arquivos, como o Kazaa) que utilizam portas aleatórias ou em caso de serviços rodando em uma porta não padrão (por exemplo um servidor HTTP rodando na porta 1111). Em casos como este, o uso de um classificador de pacotes que faz a análise dos dados na camada de aplicação (camada 7 do modelo OSI) torna-se indispensável. 2) Funcionamento O sistema atua como uma extensão do iptables, e é utilizado através da sintaxe "-m layer7 --l7proto XXXX" onde XXXX é o protocolo desejado (veremos alguns exemplos mais à frente). Vamos a um exemplo mais concreto: # iptables -I INPUT -m layer7 --l7proto fasttrack -j DROP Este comando "derruba" (-j DROP) pacotes que utilizem o protocolo FastTrack (--l7proto fasttrack) estejam entrando na máquina (-I INPUT). Vale lembrar que o protocolo FastTrack é utilizado pelo Kazaa e por outros aplicativos P2P. Perceba que não é feita nenhuma referência à portas ou endereços IP (embora elas possam ser utilizadas em conjunto - você poderia escrever essa regra de forma a afetar apenas um host especificamente). Também é possível utilizar o L7-Filter em conjunto com a ferramenta tc, para fazer controle de banda. 3) Arquivos necessários 3.1) Arquivos do projeto (disponíveis em http://l7-filter.sf.net) netfilter-layer7-vX.X.X.tar.gz -> Contém os patches que serão aplicados no kernel e no iptables (X.X.X é a versão do arquivo) l7-protocols-YYYY_MM_DD.tar.gz -> Contém os arquivos com as definições de protocolos. (YYYY_MM_DD é a data das definições) 3.2) Fontes do Kernel (disponíveis em http://www.kernel.org ou nos CD's/repositórios da sua distribuição) Pacote Debian (sarge): FIXME Pacote Conectiva 10 : kernel26-source-2.6.11-72032U10_21cl.i386.rpm Pode ser utilizado um kernel da família 2.4 ou 2.6 (nos meus exemplos, estarei utilizando a família 2.6) Obs: É preferível que você SEMPRE utilize os fontes cedidos pela sua distribuição. A razão é que as distribuições costumam aplicar patches elas mesmas no kernel, e utilizar o kernel direto de http://www.kernel.org (que não vai conter esses patches), pode fazer com que algo deixe de funcionar. VOCÊ FOI AVISADO !!!! 3.3) Fontes do iptables (disponíveis em http://www.netfilter.org ou nos CD's da sua distribuição) Pacote Debian (sarge): apt-get source iptables Pacote Conectiva 10 : não tem (ou eu não achei :-P ) Obs: Pelos motivos já expostos acima, é preferível que você utilize o fonte do iptables da sua distribuição, à menos que ele seja muito antigo (a versão mínima recomendada pelos autores é a 1.2.11 ). 4) Descompactando, Compilando e Instalando Para facilitar, vamos descompactar todos os arquivos em /usr/src. # tar -zxvf netfilter-layer7-vX.X.X.tar.gz -C /usr/src # tar -zxvf l7-protocols-YYYY_MM_DD.tar.gz -C /usr/src # tar -jxvf iptables-1.X.XX.tar.bz2 -C /usr/src # tar -jxvf linux-2.6.XX.tar.bz2 -C /usr/src (se você estiver utilizando a versão do kernel de http://www.kernel.org) Obs: É necessário que as coisas sejam feitas nesta ordem. 4.1) Patch do Kernel (aqui vou considerar que você já possui os fontes do seu kernel no diretório /usr/src/linux-2.6.xx e que um link simbólico de nome /usr/src/linux aponta para este diretório.). Entre no diretório /usr/src/linux e execute o seguinte comando # patch -p1 < ../netfilter-layer7-vX.X.X/kernel-2.6-layer7-X.X.X.patch Após isso, você deve habilitar algumas coisas no kernel: * Em "Device Drivers -> Networking support -> Networking options" marque a opção "Network packet filtering". Depois entre nela e em "Netfilter Configuration" e marque "Layer 7 match support". Você provavelmente vai querer marcar outras opções, ou talvez todas elas. * Se você pretende utilizar o CBQ ou o HTB para limitação de banda (eu utilizo o HTB), você deve verificar se eles estão selecionados em "Device Drivers -> Networking support -> Networking options -> QoS and/or fair queueing". Aqui eu tenho todas as opções selecionadas. * Opcionalmente você pode editar o arquivo Makefile do Kernel e na linha EXTRAVERSION você acrescenta a um texto sugestivo (como L7 ou algo assim ...). Esse texto vai aparecer junto da versão do Kernel quando você digitar "uname -r". Feito isso, compile e instale o novo kernel. Não vou entrar em detalhes aqui sobre como fazer isso, pois isso fugiria do escopo do artigo e já há muita documentação sobre isso na Internet. 4.2) Patch do iptables Entre no diretório /usr/src/iptables-1.X.XX e execute o seguinte comando: # patch -p1 < ../netfilter-layer7-vX.X.X/iptables-layer7-X.X.X.patch Compile o iptables com o comando: Conectiva # make BINDIR=/usr/bin LIBDIR=/usr/lib MANDIR=/usr/man Debian Sarge # make BINDIR=/sbin LIBDIR=/lib MANDIR=/usr/share/man e instale com o comando Conectiva # make BINDIR=/usr/bin LIBDIR=/usr/lib MANDIR=/usr/man install Debian Sarge # make BINDIR=/sbin LIBDIR=/lib MANDIR=/usr/share/man install 4.3) Arquivos de Definições de Protocolos Entre no diretório /usr/src/l7-protocols-YYYY_MM_DD e digite o comando # make install Isso vai criar um diretório /etc/l7-protocols e copiar os arquivos para lá. Simples não? Quando for atualizar as definições basta repetir estes passos (descompactar o arquivo com as definições atualizadas, entrar na pasta e executar "make install"). 5) Testando e Exemplos Testando: Crie uma regra qualquer que combine com um protocolo que você utilize nesta máquina. Por exemplo, se você possui um servidor web rodando nesta máquina, crie a seguinte regra: # iptables -A INPUT -m layer7 --l7proto http Agora gere algum tráfego (acessando as páginas do seu servidor) e em seguida execute o seguinte comando: # iptables -nvxL OUTPUT -m layer7 --l7proto http Isto vai mostrar a contagem de pacotes e bytes que casam com esta regra (pacotes que a máquina enviou via protocolo http). Eu uso essa técnica (junto com awk/grep/cut e rrdtool) para gerar gráficos de consumo de banda. Bloqueando Protocolos # iptables -A FORWARD -m layer7 --l7proto msnmessenger -j DROP e acabe com o uso do MSN Messenger na sua rede. Limitando ("shapeando") a taxa de downloads: Obs: Este exemplo pressupõe que você conhece um pouco de CBQ/HTB. Caso você não esteja familiarizado com a ferramenta tc, sugiro uma lida nos artigos que estão na área de referência. Use o iptables para marcar os pacotes que coincidem com sua regra: # iptables -A PREROUTING -t mangle -i eth0 -j MARK --set-mark 6 No caso foi colocada a marca 6. Poderia ser utilizado qualquer número (desde que seja inteiro, positivo e diferente de zero) Depois, crie um filtro que pega tudo o que estiver com a marca definida (6, no nosso caso) e joga para a classe definida (no caso abaixo 1:1). tc filter add dev eth1 protocol ip parent 1:0 prio 1 handle 6 fw flowid 1:1 ----------------------------------------------------------------------------------------------------------------------------- Referências e Leitura Recomendada: * Site do Projeto Layer 7 Classifier (http://l7-filter.sf.net) * Layer 7 Classifier HOWTO (http://l7-filter.sourceforge.net/HOWTO) * Artigos sobre HTB no BR-Linux (http://br-linux.org/tutoriais/001648.html e http://br-linux.org/tutoriais/001794.html) * Linux Advanced Routing & Trafic Control HowTo (LARTC) (http://www.lartc.org) * The Ultimate Traffic Conditioner (http://www.tldp.org/HOWTO/Adv-Routing-HOWTO/lartc.cookbook.ultimate-tc.html) Em 04/01/06, Luiz Gonzaga da Mata<[EMAIL PROTECTED]> escreveu: > Em Qua, Janeiro 4, 2006 18:17, Fabiano Pires escreveu: > > Eu fiz um tutorial explicando como instalar e utilizar o l7-filter. > > Está aguardando aprovação no "Viva o Linux". Caso haja interesse, > > posso enviá-lo via email para a Lista > > > > Fabiano, > > Se puder enviar o tutorial para meu email, agradeço. > > Um abraço, > > Luiz Gonzaga da Mata. > > > > > -- Abraços, Fabiano

