[FUG-BR] Controle de Banda com PF

Gabriel Fonseca gabriel em ethx.com.br
Terça Junho 22 10:58:49 BRT 2010


Em 22 de junho de 2010 08:55, Vinicius Abrahao <vinnix.bsd em gmail.com>escreveu:

> 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>
> -------------------------
> Histórico: http://www.fug.com.br/historico/html/freebsd/
> Sair da lista: https://www.fug.com.br/mailman/listinfo/freebsd
>


Vinícius,

    Aplique as filas nas regras de filtragem que confiram com entrada de
tráfego na interface interna.

    No seu caso ficaria assim:

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

    Isso no caso de você querer fazer o enfileiramento da fila q_radio_out
somente com destino any porta 9106.
    Lembre-se que quando vc define as portas nas regras de saída da
interface interna vc está definindo a porta de origem do seu host na rede
interna.

    Para verificar se o tráfego esta batendo com as filas utilize pfctl -vvs
q .

Espero ter ajudado.
Att.

> Gabriel "ethX" Fonseca <


Mais detalhes sobre a lista de discussão freebsd