[FUG-BR] Controle de Banda com PF

Nenhum_de_Nos matheus em eternamente.info
Terça Junho 22 12:21:59 BRT 2010


On Tue, June 22, 2010 10:58, Gabriel Fonseca wrote:
> 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.
>

você pode mudar a forma como o pf trata os estados das conexões. procure
pela seção:

set state-policy option

em http://www.openbsd.org/faq/pf/options.html

isto pode ser definido por regra ou de modo geral.

matheus

-- 
We will call you cygnus,
The God of balance you shall be

A: Because it messes up the order in which people normally read text.
Q: Why is top-posting such a bad thing?

http://en.wikipedia.org/wiki/Posting_style


Mais detalhes sobre a lista de discussão freebsd