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
quarta-feira, 2 de maio de 2007
Assinar:
Postar comentários (Atom)
Um comentário:
realmente excelente material, implementei no slackware 11 sem problemas funciona muito bem unica coisa que achei estranho eh que de tempos em tempos tenho que atualizar a base de bados dos protocolos, mas acho que deve ser normal atualizo e fica tudo certo, vou tentar o novo artigo que voce postou tambem, mas obrigado me ajudou muito
German Sachelaride
Postar um comentário