[FUG-BR] Controle de Banda com PF

Vinicius Abrahao vinnix.bsd em gmail.com
Terça Junho 22 08:55:55 BRT 2010


Oi pessoal, bom dia!

Essa thread de controle de banda com PF veio a calhar.

Estou tentando implementar algo que teoricamente deveria ser simples,
lá em casa, mas estou tendo uma dificuldade monstro!

A idéia para experiência é pegar meu speedy 100Kb/s (real) e criar um
controle de banda que
garanta para um determinado cliente (no meu caso uma rádio online do
PSP) uma banda de 20Kb/s e todo
o resto "para quem quiser" lá dentro de casa. Meu objetivo é garantir
a banda para a rádio e ainda assim conseguir
fazer alguns downloads/torrents.

Cheguei a criar as declarações das filas e as regras para fazer match
com o streaming mas até agora só vejo trafego
nas filas que são default.

Abaixo algumas coisas que estão no meu pf.conf que podem (ou não?)
estar interferindo.

---------------------------------------------------------------------------------------------
table <host_psp> {192.168.1.10}
table <rfc1918> const { 192.168.0.0/16, 172.16.0.0/12,  10.0.0.0/8 }


set loginterface $ext_if

set skip on lo
set block-policy return
scrub in all

scrub in on $int_if fragment reassemble
scrub in on $int_if no-df
scrub on $int_if reassemble tcp

altq on $int_if cbq  bandwidth 10Mb queue { q_radio_out , q_internet ,
q_default_out }
  queue q_radio_out      bandwidth 20Kb cbq
  queue q_internet       bandwidth 80Kb cbq
  queue q_default_out    bandwidth  9Mb cbq(default)


pass out quick on $int_if proto tcp from <host_psp> to any
queue q_radio_out
pass out quick on $int_if proto tcp from any to  <host_psp>
queue q_radio_out

Quando vi que o tráfego de rádio não estava indo pra fila que eu
queria, cheguei a apelar com as seguintes regras:

pass out quick on $int_if proto tcp from !<rfc1918> port 9106 to any
queue q_radio_out
pass out quick on $int_if proto tcp from !<rfc1918> to any port 9106
queue q_radio_out
pass out quick on $int_if proto tcp from !<rfc1918> to any
queue q_internet_default

Mas ainda sem sucesso.  :-(

---------------------------------------------------------------------------------------------

Alguns podem estar achando estranho o fato da queue estar na interface
interna, mas conversando
com os amigos no ##freebsd-br @freenode (thanks Porks!) chegamos a
conclusão que o altq só agiria neste caso nas filas
de output, espero estarmos certos quanto a essa conclusão.

No meu primeiro teste (com a interface externa) as coisas estavam indo
por esse caminho:

altq on $ext_if cbq  bandwidth 100Kb queue { q_radio, q_default }
  queue q_radio   bandwidth 20Kb cbq
  queue q_default bandwidth 80Kb cbq(default)

pass in  quick on $ext_if proto tcp from any to any port $radio_port no state
pass out quick on $ext_if proto tcp from any to any port $radio_port
no state queue (r_radio)


---------------------------------------------------------------------------------------------

Bom.. acho que já me prolonguei demais.
Vou dar uma estudada no HFSC, mas basicamente gostaria de saber se é
possível fazer isso que eu estou tentando com o CBQ, e como?
Teoricamente, pelo que li, dá sim, mas estou tendo dificuldades nas
implementações, poderiam me dar uma luz?


Obrigado pela ajuda,
Vinnix

[a.k.a. Vinícius Schmidt]



ANEXO 1: Diagrama do Fluxo (thanks again Porks!)

#<rede interna> --> <NIC_INTERNA_IN> --> <PF> --> <NIC_EXTERNA_OUT>
--> <internet>
#<rede interna> <-- <NIC_INTERNA_OUT> <-- <PF> <-- <NIC_EXTERNA_IN>
<-- <internet>


Mais detalhes sobre a lista de discussão freebsd