Re: Quais as Portas do Msn ?? - como bloquear pelo squid - não funcionou
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<gonzaga@pbh.gov.br> 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
Reply to: