Discuta este tópico no fórum

Se este conteúdo te ajudou, deixe um presente!

sábado, 16 de agosto de 2014

OpenWRT: Configurando o QoS - Configuração

Este é mais um artigo da série sobre o OpenWRT.

Dando continuidade ao artigo anterior sobre QoS, vou apresentar uma configuração simples de priorização de pacotes.

antigo anterior foi sobre tráfego de dados em rede e o problema do congestionamento. Aproveitei para esclarecer que o QoS não vai deixar sua internet baixando mais rápido. Vai sim dar agilidade para as aplicações que necessitam de resposta rápida e minimizar as consequências do congestionamento no seu link.

Congestionamento no link ocorre quando está chegando mais pacotes do que a conexão consegue enviar. Com isto, começa a formar uma fila no roteador que, quando cheia, irá descartar novos pacotes até que a fila tenha espaço. Isto é esperado pois é uma forma implícita de avisar o emissor da informação que, em algum ponto até o destino, um segmento de rede não está suportando tanto dados e ele deve reduzir a velocidade. Grande parte das transmissões de dados buscam enviar progressivamente a maior taxa de transferência possível. Consequentemente, irá ocorrer sempre o congestionamento no segmento mais lento. O congestionamento é, portanto, um comportamento normal e, inclusive, esperado. O problema é que a fila formada pode ser muito longa.

Normalmente, nossa conexão com a internet é o segmento mais lento de nossos usos da internet. Desta forma, a fila do tráfego que sai do seu computador para a internet (upload) se formará no seu roteador e o que vem da internet para sua rede no roteador da provedora de internet. Quanto ao tráfego que forma fila no nosso roteador, temos controle total e o QoS irá operar sem problemas. E o download? Já em relação ao download, os controles são limitados. A fila do tráfego se forma no roteador da operadora (que fica lá dentro da infraestrutura dela e o roteador que ela deixou na sua casa). Neste, não temos como criar filas com priorização para reordenar os pacotes. O comportamento simplificado é este:

  1. Você pede para baixar um arquivo de 700MB no servidor;
  2. O servidor envia progressivamente o arquivo com uma taxa de transferência cada fez mais alta;
  3. A taxa de transferência de envio supera a taxa de download do seu link com a internet. Começa a formar fila no roteador da operadora;
  4. O servidor ainda não sabe disto e continua a aumentar a taxa de transferência;
  5. A fila no roteador da operadora enche. Pacotes são descartados
  6. O servidor nota a perda de pacotes e pega mais leve. Reduz a taxa de transferência (e volta ao passo 2. até terminar o arquivo)

Então vou poder atuar somente no upload? Não, o QoS será mais efetivo no upload mas atuará no download. Apesar de não poder criar filas com priorização diferenciada no roteador da operadora, com muita sorte, elas fizeram o dever de casa e implementaram um QoS "legal" lá (¯\(ツ)/¯), mas não (e o marco civil da internet não proíbe que seu provedor configure o QoS por critérios técnicos, a exemplo do que iremos implementar aqui). O controle possível do lado do cliente é simular que a velocidade mais lenta está na sua rede interna. Quando o seu roteador notar que a taxa de transferência está atingindo o pico da sua conexão, ele supõe que esteja começando a formar fila no roteador da operadora. Nesta situação, antes de encher a fila no lado de lá e descartar pacotes, o seu roteador simulará um comportamento de congestionamento da rede interna. Como? Ele descartará pacotes. Quê?! Isto é bom? Sim! Lembre-se que o problema são as filas. Fica assim o comportamento (com destaque na mudança):
  1. Você pede para baixar um arquivo de 700MB no servidor;
  2. O servidor envia progressivamente o arquivo com uma taxa de transferência cada fez mais alta;
  3. A taxa de transferência de envio supera a taxa de download do seu link com a internet. Começa a formar fila no roteador da operadora;
  4. Seu roteador nota que a conexão está congestionada (ou quase) e supõe a formação de fila no roteador da operadora. Descarta pacotes antes da fila encher.
  5. A fila no roteador da operadora permanece pequena.
  6. O servidor ainda não sabe disto e continua a aumentar a taxa de transferência;
  7. O servidor nota a perda de pacotes e pega mais leve. Reduz a taxa de transferência (e volta ao passo 2. até terminar o arquivo)
Mas o download não pode deixar o download mais lento? Pode. Ligeiramente mais lento e provavelmente você nunca irá perceber. O que você irá perceber é que os demais pacotes (como a negociação de três passos do TCP, uma conversa VOIP, etc) irão chegar antes. Conexões UDP que exijam mais do que sua conexão, entretanto, não terão o mesmo efeito. Contudo, elas normalmente não são usadas para volume de dados e se beneficiarão da ausência de fila dos pacotes TCP.

Outro porém é se a sua rede local for mais lenta que a sua conexão internet. Para redes locais sem fio, principalmente quando esta estiver com baixa qualidade e a internet for bem rápida (algo acima de 20Mbits/s), pode ser possível que a fila de upload se forme no seu computador e a de download no seu roteador. Isto está incentivando padrões mais rápidos de wireless, como a 802.11ac.

Chega de papo, vamos a configuração.

O QoS é implementado pelo próprio kernel do Linux. A interface usada para configurá-lo é via o comando tc em conjunto com regras do iptables. Lidar diretamente com o tc é um pouco complicado, principalmente para quem não tem nem intimidade com o terminal. Para facilitar a vida, foram criados alguns pacotes para simplificar a configuração do QoS e evitar que você veja o tc. Um dos mais populares é o qos-scripts. Ele é limitado mas deve atender 97,23% dos casos.

Uma vantagem é a existência da configuração web para este pacote. Para instalar ambos, instale o "luci-app-qos". Se for configurar "na mão", basta o "qos-scripts".

Pela interface web Luci, acesse "Rede/QoS". As opções gerais são simples. Você vai habilitar a configuração e configurar a "Velocidade de recebimento" (download) e a "Velocidade de envio" (upload). Você pode usar valores um pouco abaixo do observado para garantir a atuação. A opção "Calcular overhead" já faz um pouco desta redução. O "half-duplex" indica se seu download e upload influenciam um no outro. Normalmente não é o caso pois temos taxa de download e upload fixas definidas pelo plano.

Dúvidas:

P: Se eu configurar o download acima do que eu tenho?
R: O QoS não irá atuar.

P: Se eu configurar abaixo?
R: Ele vai limitar sua conexão a esta velocidade. Meu provedor aumentou minha conexão de 1Mbit/s para 5Mbit/s e só fiquei sabendo quando ele enviou o aviso do "presente" pelo correio.

P: E se meu provedor fornece velocidades variáveis?
R: Se ele não fizer o QoS do lado dele, senta e chora. Lembre-se que você compra 1Mbit/s mas ele não precisa entregar exatamente isto todo tempo... Como a variação será para baixo, vai cair no caso da primeira pergunta.

Falta apenas as regras de classificação. Existem 4 classes por padrão na interface web:
  • prioritário: para pacotes pequenos como DNS e o ACK do TCP
  • expressa: para pacotes maiores com urgência, como VOIP e jogos Online
  • baixa: para transferência sem urgência e volumosas (torrent, dropbox, backup)
  • normal: para demais casos
A configuração pode ser feita por endereço de origem, de destino, serviço (identificado pelo layer7), protocolo de transporte, porta de destino ou volume de dados trafegado.

Por padrão, pela interface vemos as seguintes regras:
  • DNS e SSH são prioritários;
  • FTP, HTTP, SMTP, POP, IMAP, SMB são normais;
  • AIM/ICQ (nostálgico) são expressos.
Ainda existe algumas regras ocultas, só visíveis no arquivo de configuração:
  • UDP com pacote menor que 500 bytes é expresso;
  • ICMP é prioritário;
  • Portas 1024-65535 são baixa;
  • TCP com pacote menor que 128 bytes de pedido de conexão (SYN) ou confirmação (ACK) são prioritários
Sugiro sempre usar a interface web para, ao menos, criar uma configuração inicial. Se quiser se aventurar no arquivo de configuração, ele é bem legível e fica em /etc/config/qos.

Por fim, habilite e dispare o serviço QoS em Sistema/Inicialização.

Ah, se for testar outra alternativa de QoS (como o wshape dsl-qos-queue ou o wshaper), desative o qos-scripts. Nunca use mais de uma estratégia de QoS ao mesmo tempo! Você também pode montar na mão regras usando o iptables e o tc. Será um belo aprendizado.


Até a próxima.

17 comentários:

  1. Saiu a nova versão 14.07 final do trunk. Faz um post sobre ela por favor.

    ResponderExcluir
    Respostas
    1. Gosto de testar com calma antes de escrever sobre um recurso. Como estou com pouco tempo neste momento, vai demorar um pouco mais. Mas é o próximo tópico da lista. :-)

      Excluir
  2. Blz Luiz,

    Na interface web, no campo nº de bytes, deixo em branco mesmo?
    Outra coisa, preciso criar uma regra para inserir a porta do transmission? e especifico como expressa a conexão do transmission? pergunto pois quando estou baixando torrent, o transmission usa uns 90% da minha conexão, detonando a navegação web ou acesso da minha rede na net...
    Valeu pelos seus posts, toda a configuração do meu roteador está baseada neles.

    Anderson.

    ResponderExcluir
    Respostas
    1. nº de bytes pode ficar em branco. É para classificar uma conexão pelo volume trafegado.

      Se instalar o l7-protocols, deve funcionar o filtro pelo tipo de protocolo (bittorrent). Só não vai funcionar para conexões cifradas e, possivelmente, para torrent em UDP.

      config classify
      option target 'Bulk'
      option layer7 'bittorrent'

      Você também pode configurar a regra em função da porta que o transmission recebe (para receber conexão). Só não sei se o transmission usa esta mesma porta para conexões ativas (quando você inicia a conexão). Olhando por cima, creio que ele usa uma porta aleatória neste caso.

      Excluir
  3. Primeiramente obrigado Luiz, no Brasil pra mim vc é referência em openwrt, agora é dúvida em todos seus tutoriais, hehe

    veja se está correto, criei duas regras iguais e deixei marcado TODOS, apenas para os IPs dos xone e ps4

    Como eu jogo CSGO, criei as regras conforme consta no próprio site da steam

    deixei várias portas como prioridade, quando são várias portas na sequência, eu digito 27000-27036 ou 27000:27036 ?

    criei uma regra para o ip do meu computador, prioridade baixa, serviço bittorrent, porta 50001, é só isso?

    se funcionar mesmo, vou conseguir jogar com ping baixo e torrent aberto ou não funciona tão bem assim ?

    Sobre colocar os serviços, isso faz diferença? não é apenas TCP, UDP que interessa?

    obrigado mais uma vez.. abraço..

    ResponderExcluir
    Respostas
    1. Olá Anônimo,

      Obrigado pela preferência. ;-)

      Não entendi o "deixei marcado TODOS". Para todos os filtros? Não é muito legal criar uma regra para os consoles, uma vez que eles têm tanto tráfego de download como em tempo real.

      Quanto a priorizar pelas portas, é isso mesmo. Intervalo é com o traço. Normalmente você não precisaria especificar o computador de origem, uma vez que torrent/CSGO/etc seriam tratados da mesma forma, não importando a origem.

      Sim, você vai conseguir jogar o CS com o torrent rolando. Claro que um pouco ele ainda afeta mas pode se tornar imperceptível. Joguei muito sem desligar o torrent.

      Serviço analisa o protocolo pelos seus dados e não pela porta. Isto possibilita detectar protocolos sem uma porta padrão. O FTP, por exemplo, usa uma segunda porta alta aleatória para troca de dados. Se a porta do protocolo for fixa, não precisa usar o serviço.

      Excluir
  4. É possivel criar uma configuraçao de regra qos para cada cliente separadamente por ex: ip 1xxx2 200kbps up e 2048 download ip 1xxx3 200kbps up e 2048 download? Esta de parabens esse blog esta me ajudando muito, obrigado! ^^

    ResponderExcluir
    Respostas
    1. Ubirajara,

      Sim, só não nas soluções prontas do OpenWRT. Normalmente ele consideram que todos os clientes tem direito de usar o link sem limite. O que elas buscam é minimizar a latência mas dividir a taxa de transferência de forma democrática.

      Se gostou, olhe esse artigo mais novo:
      http://luizluca.blogspot.com.br/2015/10/openwrt-configurando-o-qos-utilizando-o.html

      Se quiser mesmo limitar, olhe no fórum do blog (links no começo e fim da página), como na msg:
      http://luizluca.blogspot.com.br/2015/10/openwrt-configurando-o-qos-utilizando-o.html

      Excluir
  5. Olá, parabéns, ótimo artigo!

    Você sabe se é possível fazer priorização de pacotes através do campo Traffic Class de cabeçalho IPv6?

    ResponderExcluir
    Respostas
    1. Vinicius,

      Como suspeitava, o qos-scripts não tem suporte para IPv6. Mas vai ter na próxima versão. Dizem que você pode simplesmente copiar os scripts para fazer o backport para o CC, mas "os resultados podem varias"
      https://dev.openwrt.org/ticket/13225

      Ainda, precisaria de regras que usam o dscp. Sinceramente, eu trocaria pelo SQM, que usa o DSCP e funciona no IPv6

      http://luizluca.blogspot.com.br/2015/10/openwrt-configurando-o-qos-utilizando-o.html

      Só nunca testei a eficácia para ipv6.

      Excluir
  6. CAra gostei do post, mas fui baixar o pack do qos direto no meu openwrt e da a mensagem abaixo, o que posso fazer pra resolver??

    Collected errors:
    * satisfy_dependencies_for: Cannot satisfy the following dependencies for luci-app-qos:
    * libc * libc * libc * kernel (= 3.3.8-1-d6597ebf6203328d3519ea3c3371a493) * kernel (= 3.3.8-1-d6597ebf6203328d3519ea3c3371a493) * kernel (= 3.3.8-1-d6597ebf6203328d3519ea3c3371a493) * kernel (= 3.3.8-1-d6597ebf6203328d3519ea3c3371a493) * kernel (= 3.3.8-1-d6597ebf6203328d3519ea3c3371a493) * kernel (= 3.3.8-1-d6597ebf6203328d3519ea3c3371a493) * libc * libc * libc * libc * kernel (= 3.3.8-1-d6597ebf6203328d3519ea3c3371a493) * kernel (= 3.3.8-1-d6597ebf6203328d3519ea3c3371a493) * libc * kernel (= 3.3.8-1-d6597ebf6203328d3519ea3c3371a493) * libc *
    * opkg_install_cmd: Cannot install package luci-app-qos.

    ResponderExcluir
    Respostas
    1. Denny, o sintoma parece de uma instalação de pacotes que não corresponde a versão do seu OpenWRT. Você baixou manualmente? Ou compilou o seu OpenWRT?

      Excluir
  7. Boa noite Luiz, tentei instalar o pacote luci-app-qos e retornou a mensagem "Unknown package 'luci-app-qos'.", tem alguma dica para me passar?
    Desde já grato.

    ResponderExcluir
    Respostas
    1. Baixasse a lista de pacotes antes (opkg update)? O openwrt não guarda isto para economizar espaço.

      Excluir
  8. Ola Luiz, como faco controle de download por ip usando iptables?

    ResponderExcluir
    Respostas
    1. Valdiney,

      Esse controle no OpenWRT/LEDE é feito pelo tc do Linux. Você pode praticamente fazer qualquer coisa com isso. A conf padrão já tenta reduzir a latência ao máximo mesmo sobre carga, que melhora em muito a sensação de velocidade de coisas interativas. Mas isso não vai melhorar a taxa de transferência. Porém, se seu objetivo é limitar "comercialmente" a velocidade, tem exemplos em: https://wiki.openwrt.org/doc/howto/packet.scheduler/packet.scheduler como: https://wiki.openwrt.org/doc/howto/packet.scheduler/packet.scheduler.example2
      Pode ser um pouco complicado mas cortar taxa de transferência de algum dos usuários não é algo que atraiu o interesse dos desenvolvedores do OpenWRT/LEDE. Você sempre pode fazer um novo pacote ;) Se quiser buscar na internet, o termo é "traffic shaping", que você pode combinar com OpenWRT ou, genericamente, Linux.

      Excluir
  9. I am really happy to say it’s an interesting post to read . I learn new information from your article , you are doing a great job . Keep it up. You should also check my post.
    Mahadev Book

    ResponderExcluir