quarta-feira, 2 de maio de 2007

Bloqueando Broadcast e Multicast e limitando o tamanho máximo do pacote ICMP com Iptables

Analisando gráficos de meus Access Point e do Gateway de Rede, constatei que o numéro de pacotes de broadcast que trafegavam na ethernet dos equipamentos era demasiado e desnecessário.

Além das proteções inseridas no rádio, quis fazer com que o broadcast e multicast nem mesmo chegasse na ethernet do AP.

Segue ae a dica.

#iptables -A INPUT -m pkttype --pkt-type broadcast -j DROP
#iptables -A INPUT -m pkttype --pkt-type multicast -j DROP

Também limito o tamanho máximo dos pacotes ICMP que trafegam na rede a 300bytes, usando-se da extensão Match (lenght)

#iptables -A INPUT -p icmp -m length --length 300: -j DROP

obs...Os tipos de pacote além de broadcast e multicast, também inclui o unicast mas não vem ao meu caso.

Abraços.
Wagner Assis

Limitando o tráfego P2P com Layer7 e Connlimit

Data de criação: 20/04/2007
Artigo pode sofrer alterações devido novas funcionalidades encontradas.


Trabalho em um provedor de internet, e como todo administrador de redes, controlar efetivamente o tráfego de P2P é um desafio.
Mais do que o tráfego por ele gerado, o número de conexões ativas, assim como o número de pacotes por segundo, pode gerar muitos transtornos devido uma sobrecarga no Access Point.

Pesquisando na internet, encontrei um artigo interessante, sobre o uso de "connlimit no controle de portas¹", mas, em alguns casos não é interessante limitar todas as portas, principalmente se parte de seus clientes são empresas e precisam de acesso full, o que é necessário então é limitar somente o P2P.
A idéia então seria usar um classificador de protocolos, então pensei então em combinar essa idéia com o filtro de protocolo (Layer7)
Existe também o IPP2P, entretanto, como os clientes P2P estão usando técnicas de criptografia, e o IPP2P não é atualizado a quase um ano, prefiro manter no Layer7 que tem atualizações constantes de sua base de protocolos e no core do software.

Referência.
¹- http://under-linux.org/wiki/index.php/Tutoriais/Seguranca/Usando_o_Connlimit


Mãos a obra,
(Levando em consideração que sabe o que faz e tem conhecimento de compilar programas e do próprio kernel)

Requerimentos

Patch Connlimit - ftp://ftp.netfilter.org/pub/patch-o-matic-ng/snapshot/patch-o-matic-ng-20070414.tar.bz2
Patch Layer7 - http://ufpr.dl.sourceforge.net/sourceforge/l7-filter/netfilter-layer7-v2.9.tar.gz
Protocolos Layer7 - http://ufpr.dl.sourceforge.net/sourceforge/l7-filter/l7-protocols-2007-01-14.tar.gz
Kernel 2.6.19.7 - http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.19.7.tar.gz
Iptables 1.3.37 - ftp://ftp.netfilter.org/pub/iptables/iptables-1.3.7.tar.bz2

Decompacte o Kernel
#tar xzpvf linux-2.6.19.7.tar.gz

Descompacte o patch do Layer7
#tar xzpvf netfilter-layer7-v2.9.tar.gz

Descompacte o Connlimit
#tar xjpvf patch-o-matic-ng-20070414.tar.bz2

Descompacte o Iptables 1.3.37
#tar xjpvf iptables-1.3.7.tar.bz2

Aplique o patch do Layer7 ao Kernel
#patch -p1 < ../netfilter-layer7-v2.9/kernel-2.6.18-2.6.19-layer7-2.9.patch

Aplique o Patch do Connlimit
#cd patch-o-matic-ng-20070414
#KERNEL_DIR=../linux-2.6.19.7 IPTABLES_DIR=../iptables-1.3.7 ./runme connlimit -download (a opção -download é porque o connlimit não vem no snapshot padrao do patch-o-matic)

Agora que o kernel já está patcheado, vamos ativar os patch's

#cd linux-2.6.19.7
#make menuconfig
Ativar a opção - Connection tracking flow accounting (Requerido pelo Layer7) Networking->network options->network patcket filtering->IP: Netfilter Configuration->Connection tracking->Connection tracking flow accounting

Ativar a opção - Layer 7 match support
Networking->network options->network patcket filtering->IP: Netfilter Configuration->Layer 7 match support

Ativar a opção de Connlimit
networking->network options->network patcket filtering->IP: Netfilter Configuration->Connections/IP limit match support

Agora, configure o kernel a seu gosto, e compile-o.

Em Slackware
#make all
#make install
#lilo

Em Debian
#make-kpkg --initrd kernel_image
#dpkg -i ../linux-image-2.6.19.7_2.6.19.7-10.00.Custom_i386.deb

Agora, ainda falta compilar o iptables com suporte a layer7 e connlimit

Primeiro aplicamos os patch's

#cd iptables-1.3.7

Aplique o patch do filtro Layer7 ao iptables
#patch -p1 < ../netfilter-layer7-v2.9/iptables-layer7-2.9.patch

(O patch-o-matic já aplicou o patch ao iptables, visto que definimos o caminho do source do iptables)

Dê permissões para o iptables compilar suas extensões

#chmod +x extensions/.*

Compile o iptables
#KERNEL_DIR=../linux-2.6.19.7 PREFIX=/usr make

Instale o iptables
#make install

Atualize o cache de bibliotecas
#ldconfig

Reinicie o kernel, para ativar as compilações feitas
# shutdown -r now

Agora, insira em seu arquivo de firewall as seguintes linhas.

Crio uma nova chain na tabela mangle para o limite de conexões (CONNLIMIT)
#iptables -v -t mangle -N CONNLIMIT

Classifico cada protocolo de P2P nessa nova chain
#iptables -v -t mangle -A PREROUTING -m layer7 --l7proto edonkey -j CONNLIMIT
#iptables -v -t mangle -A PREROUTING -m layer7 --l7proto ares -j CONNLIMIT
#iptables -v -t mangle -A PREROUTING -m layer7 --l7proto gnutella -j CONNLIMIT
#iptables -v -t mangle -A PREROUTING -m layer7 --l7proto fasttrack -j CONNLIMIT
#iptables -v -t mangle -A PREROUTING -m layer7 --l7proto imesh -j CONNLIMIT
#iptables -v -t mangle -A PREROUTING -m layer7 --l7proto directconnect -j CONNLIMIT
#iptables -v -t mangle -A PREROUTING -m layer7 --l7proto napster -j CONNLIMIT
#iptables -v -t mangle -A PREROUTING -m layer7 --l7proto soulseek -j CONNLIMIT
#iptables -v -t mangle -A PREROUTING -m layer7 --l7proto bittorrent -j CONNLIMIT

Aplico o limite de conexões 15 conexões de P2P por IP (O connlimit só é aplicável em pacotes tcp)
#iptables -v -t mangle -A CONNLIMIT -p tcp -m connlimit --connlimit-above 15 --connlimit-mask 32 -j DROP

Como o connlimit só limita as conexões TCP, as regras acima só se aplicam a esse protocolo, se desejar fazer o controle também de UDP terá q ser feito com cbq,htb,hfsq + layer7 ou então dropando qualquer pacote p2p em UDP, conforma abaixo.

#iptables -v -t mangle -A PREROUTING -p UDP -m layer7 --l7proto edonkey -j DROP

Se você deseja um filtro ainda mais competente e ache que o controle de portas pode ser combinado sem complicações, sugiro as seguintes regras.

#iptables -v -t mangle -N CONNLIMIT
#iptables -v -A FORWARD -p TCP -d 0/0 --dport 4300:4672 -j CONNLIMIT
#iptables -v -A FORWARD -p TCP -d 0/0 --sport 4660:4672 -j CONNLIMIT
#iptables -v -A FORWARD -p TCP -d 0/0 --dport 6881:65000 -j CONNLIMIT
#iptables -v -t mangle -A PREROUTING -m layer7 --l7proto edonkey -j CONNLIMIT
#iptables -v -t mangle -A PREROUTING -m layer7 --l7proto ares -j CONNLIMIT
#iptables -v -t mangle -A PREROUTING -m layer7 --l7proto gnutella -j CONNLIMIT
#iptables -v -t mangle -A PREROUTING -m layer7 --l7proto bittorrent -j CONNLIMIT
#iptables -v -t mangle -A PREROUTING -m layer7 --l7proto fasttrack -j CONNLIMIT
#iptables -v -t mangle -A CONNLIMIT -p tcp -m connlimit --connlimit-above 15 --connlimit-mask 32 -j DROP

Então o iptables aplica o connlimit nas portas conhecidas do emule (source e destination), e nas portas altas de destino, e qualquer P2P que esteja fora desse range de portas, se identificado com o layer7 também entra no connlimit.
Ultimamente nos servidores que possuem controle de banda essas regras estão ativas no controle de p2p em meus servidores, as regras anteriores só com layer7 só as aplico em servidores onde não posso fazer o limite de portas (roteadores por exemplo).

Esteja ciente que alguns protocolos do layer7 são lentos, portanto se o tempo de resposta de sua rede subir, ou apresentar perda de pacotes, tente evitar protocolos lentos como o bittorrent, prefira manter os mais ativos e mais rapidos, como emule e ares.

Espero que seja de alguma ajuda, abraços.
Wagner Assis