Você está na página 1de 5

Incrementando seu Firewall com o Layer 7 Filter

Autor: Fabiano <fabiano.pires at gmail.com> Data: 26/04/2006

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.

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) e 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.

Arquivos necessários

2.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)

2.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 www.kernel.org (que não vai conter esses patches), pode fazer com que algo deixe de funcionar. VOCÊ FOI AVISADO!!!!

2.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, a menos que ele seja muito antigo (a versão mínima recomendada pelos autores é a 1.2.11 ).

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 www.kernel.org)

OBS: É necessário que as coisas sejam feitas nesta ordem.

3.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

"uname -r".

).

Esse texto vai aparecer junto da versão do Kernel quando você digitar

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.

3.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

3.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").

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

Bibliografia e leituras recomendadas

Artigos sobre HTB no BR-Linux:

http://www.vivaolinux.com.br/artigo/Incrementando-seu-Firewall-com-o-Layer-7-Filter