segunda-feira, 21 de junho de 2010

Controle de Banda com PF

Na lista FUG-BR o colega Renato Frederick deu uma receitinha bem
interessante para controle de banda com o pf, a qual reproduzo aqui:

Faz-se as filas na interface, neste exemplo o link é de 100Mb e está
conectado á xl0 e temos 2 clientes(e o "resto" que vai pro que não tem tráfego explicitamente detalhado):

altq on $ext_if bandwidth 100Mb queue { cliente1 cliente2 default_dmz }

define-se dos 100Mb quanto que cliente1 e cliente2 vai ter e o resto pra default_dmz:

queue cliente1 bandwidth 2Mb priority 4 qlimit 1000 cbq(red)
queue cliente2 bandwidth 8Mb priority 4 qlimit 1000 cbq(red)
queue default_dmz bandwidth 80Mb priority 4 qlimit 1000 cbq(default,borrow)

lembrando que a some dos queue nao pode passar o bandwitdh declarado acima.

note que estou usando o algorítimo RED para fazer o ALTQ, no link[1] você vê mais detalhes dos algorítimos disponíveis.

Também na DMZ eu joguei o borrow, ou seja, os 80Mb da DMZ pode "tomar" banda do cliente2 e cliente2, caso precise, seria como as prioridades que o IPFW tem.


Agora basta colocar uma linha no final de cada regra de pass out pra indicar que esta regra vai ser associada a uma destas queue:


Ex, uma regra que era assim, liberando o cliente1 a conectar a qq local:

pass out quick on $ext_if proto { tcp udp } from { $cliente1 } port > 1023 to any keep state

fica assim:

pass out quick on $ext_if proto { tcp udp } from { $cliente1 } port > 1023 to any queue cliente1 keep state

as regras que eu quero que compartilhem os 80Mb eu não declaro nenhum queue, ele vai pegar o que está como default acima:

pass out quick on $ext_if proto tcp from port $ftp_ports to any port > 1023 keep state



Observe que isto faz o tráfego de output.

para fazer de input, repete-se a mesma coisa, só que a ext_if vai ser substituida pela int_if(ou o nome que você dá pra interface interna) no altq e o queue nao vai ser no pass out, vai ser no pass in e você não vai poder
usar o keep state, vai ter que declarar uma regra de pass out e outra de pass in, senão o keep state cria o retorno sem queue.

a referência: [1]http://openbsd.org/faq/pf/queueing.html

o post original está aqui

Nenhum comentário:

Postar um comentário