Controlando a banda do tráfego P2P com Layer7 - Versão 2008
Autor: Guilherme de Freitas Figueiredo | Publicado: 2008-03-18T11:05:00-03:00

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 0iptables -v -t mangle -A POSTROUTING -m comment --comment "Trafego Download" -o eth+ -j IMQ --todev 1usamos o eth+ por termos várias interfaces de rede.Logo após, criamos a CHAIN chamada P2P e adicionamos o que queremosiptables -t mangle -N P2Piptables -t mangle -A P2P -m layer7 --l7proto ares -j MARK --set-mark 0x7iptables -t mangle -A P2P -m layer7 --l7proto ares -j CLASSIFY --set-class 1:7iptables -t mangle -A P2P -m layer7 --l7proto ares -j RETURNiptables -t mangle -A P2P -m layer7 --l7proto edonkey -j MARK --set-mark 0x7iptables -t mangle -A P2P -m layer7 --l7proto edonkey -j CLASSIFY --set-class 1:7iptables -t mangle -A P2P -m layer7 --l7proto edonkey -j RETURNiptables -t mangle -A P2P -m layer7 --l7proto bittorrent -j MARK --set-mark 0x7iptables -t mangle -A P2P -m layer7 --l7proto bittorrent -j CLASSIFY --set-class 1:7iptables -t mangle -A P2P -m layer7 --l7proto bittorrent -j RETURNiptables -t mangle -A FORWARD -j P2Piptables -t mangle -A POSTROUTING -j P2PCriamos 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 TCip link set dev imq0 upip link set dev imq1 uptc qdisc add dev imq0 root handle 1: htb default 1tc qdisc add dev imq1 root handle 1: htb default 1tc class add dev imq0 parent 1: classid 1:1 htb rate 100Mbittc class add dev imq1 parent 1: classid 1:1 htb rate 100Mbit#P2Ptc class add dev imq0 parent 1:1 classid 1:7 htb rate 512kbit prio 7tc 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 7Logo após, adicionamos o filtro à classetc filter add dev imq0 parent 1: prio 7 protocol ip handle 7 fw flowid 1:7tc filter add dev imq1 parent 1: prio 7 protocol ip handle 7 fw flowid 1:7Ou 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 WEBiptables -t mangle -A WEB -m string --algo bm --string "rjnet.com.br" -j MARK --set-mark 0x6iptables -t mangle -A WEB -m string --algo bm --string "rjnet.com.br" -j CLASSIFY --set-class 1:6iptables -t mangle -A WEB -j CONNMARK --save-markiptables -t mangle -A FORWARD -j WEBiptables -t mangle -A POSTROUTING -j WEBtc class add dev imq0 parent 1:1 classid 1:6 htb rate 2048kbit prio 0tc class add dev imq1 parent 1:1 classid 1:6 htb rate 2048kbit prio 0tc filter add dev imq0 parent 1: prio 0 protocol ip handle 6 fw flowid 1:6tc filter add dev imq1 parent 1: prio 0 protocol ip handle 6 fw flowid 1:6tc filter add dev imq1 parent 1: protocol ip match ip dst 200.159.128.189 flowid 1:6Sendo 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!