Como sempre, o principal vilão hoje de qualquer Administrador de Redes, Provedores e outros são os programas P2P, e clientes que reclamam que não tem a banda total garantida devido aos medidores de tráfego do tipo RJNET entre outros.
Aqui então vamos nós para uma aventura de marcação de pacotes e priorização dos mesmos, juntamente com a integração da marcação destes pacotes com o TC ( Traffic Control ) do GNU/Linux.
O sistema foi testado em um Debian GNU/Linux, com kernel 2.6.22.15, iptables versão 1.3.8, patch-o-matic, layer7 versão 2.17, protocolos versão 2008-02-10, imq para o kernel.
Não vou entrar nos detalhes de como compilar kernel, iptables entre outros, vamos por a mão na massa.
Primeiro, redirecionamos o trafego de download e upload para as interfaces virtuais:
iptables -v -t mangle -A PREROUTING -m comment --comment "Trafego Upload" -i eth+ -j IMQ --todev 0
iptables -v -t mangle -A POSTROUTING -m comment --comment "Trafego Download" -o eth+ -j IMQ --todev 1
usamos o eth+ por termos várias interfaces de rede.
Logo após, criamos a CHAIN chamada P2P e adicionamos o que queremos
iptables -t mangle -N P2P
iptables -t mangle -A P2P -m layer7 --l7proto ares -j MARK --set-mark 0x7
iptables -t mangle -A P2P -m layer7 --l7proto ares -j CLASSIFY --set-class 1:7
iptables -t mangle -A P2P -m layer7 --l7proto ares -j RETURN
iptables -t mangle -A P2P -m layer7 --l7proto edonkey -j MARK --set-mark 0x7
iptables -t mangle -A P2P -m layer7 --l7proto edonkey -j CLASSIFY --set-class 1:7
iptables -t mangle -A P2P -m layer7 --l7proto edonkey -j RETURN
iptables -t mangle -A P2P -m layer7 --l7proto bittorrent -j MARK --set-mark 0x7
iptables -t mangle -A P2P -m layer7 --l7proto bittorrent -j CLASSIFY --set-class 1:7
iptables -t mangle -A P2P -m layer7 --l7proto bittorrent -j RETURN
iptables -t mangle -A FORWARD -j P2P
iptables -t mangle -A POSTROUTING -j P2P
Criamos a chain P2P e adicionamos nela a marcação de pacotes e setando a classe para o qual vai ser direcionado o P2P ares, edonkey e bittorrent. O Return funciona para caso ele encontre algo antes, tipo, alguem usando ares, ele nao desça ate o final da chain procurando mais coisas.
Após marcar e setar a classe, vamos criar as classes usando o TC
ip link set dev imq0 up
ip link set dev imq1 up
tc qdisc add dev imq0 root handle 1: htb default 1
tc qdisc add dev imq1 root handle 1: htb default 1
tc class add dev imq0 parent 1: classid 1:1 htb rate 100Mbit
tc class add dev imq1 parent 1: classid 1:1 htb rate 100Mbit
#P2P
tc class add dev imq0 parent 1:1 classid 1:7 htb rate 512kbit prio 7
tc class add dev imq1 parent 1:1 classid 1:7 htb rate 512kbit prio 7
# Aqui setamos a classe do P2P 1:7 para 512kbit com a prioridade 7
Logo após, adicionamos o filtro à classe
tc filter add dev imq0 parent 1: prio 7 protocol ip handle 7 fw flowid 1:7
tc filter add dev imq1 parent 1: prio 7 protocol ip handle 7 fw flowid 1:7
Ou seja, estamos agora controlando a banda de trafego P2P.
Vamos agora adicionar um "feature" a essas regras. Marcando por ex.: tudo que vai para rjnet.com.br sair com a banda de 2mbit.
iptables -t mangle -N WEB
iptables -t mangle -A WEB -m string --algo bm --string "rjnet.com.br" -j MARK --set-mark 0x6
iptables -t mangle -A WEB -m string --algo bm --string "rjnet.com.br" -j CLASSIFY --set-class 1:6
iptables -t mangle -A WEB -j CONNMARK --save-mark
iptables -t mangle -A FORWARD -j WEB
iptables -t mangle -A POSTROUTING -j WEB
tc class add dev imq0 parent 1:1 classid 1:6 htb rate 2048kbit prio 0
tc class add dev imq1 parent 1:1 classid 1:6 htb rate 2048kbit prio 0
tc filter add dev imq0 parent 1: prio 0 protocol ip handle 6 fw flowid 1:6
tc filter add dev imq1 parent 1: prio 0 protocol ip handle 6 fw flowid 1:6
tc filter add dev imq1 parent 1: protocol ip match ip dst 200.159.128.189 flowid 1:6
Sendo assim, teremos marcado tudo que conter rjnet.com.br com uma banda de 2mbit.
Esse cenário foi montado em testes e esta funcionando normalmente.
Abraços!
Mostrando postagens com marcador patch-o-matic. Mostrar todas as postagens
Mostrando postagens com marcador patch-o-matic. Mostrar todas as postagens
terça-feira, 18 de março de 2008
quarta-feira, 2 de maio de 2007
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
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
Assinar:
Postagens (Atom)