Postado originalmente por
apsilva
Primeiro post meu aqui no under-linux. Como sempre recorro ao fórum para os problemas que enfrento no dia-a-dia, resolvi repassar uma experiência que tive esses dias. Talvez seja útil pra alguém...
No provedor que trabalho, sempre tem uns clientes que não sabem monitorar sua rede. Sempre tem atualização do Windows rodando, software p2p, funcionário fazendo download sem permissão... enfim... tudo que a maioria das redes tem. Aí o cara não consegue usar o Skype, a navegação fica lenta, não consegue receber e-mails e liga reclamando que não tá funcionando nada.
Estive quebrando a cabeça pra poder priorizar o tráfego deles, mas não consegui nada muito prático pro meu caso. Usamos Hotspot e quando o usuário loga, já cria uma queue dinâmica com as limitações de banda dele. Porém, é útil se você quiser fazer isso para um cliente ou outro.
O primeiro passo é marcar os pacotes que queremos priorizar.
Primeiro eu crio uma expressão regular com Layer7 pra reconhecer os pacotes de ligações Skype para Skype. [1]
Código :
/ip firewall layer7-protocol
add comment="" name=SkypeParaSkype regexp="^..\\x02............."
Depois as address-lists com os endereços dos servidores do Skype e de alguns "velocímetros de internet" que tem por aí, pra testar:
Código :
add address=193.120.212.0/24 comment=Skype disabled=no list=rede-skype
add address=213.146.167.0/24 comment="" disabled=no list=rede-skype
add address=77.67.32.0/24 comment="" disabled=no list=rede-skype
add address=213.146.189.0/24 comment="" disabled=no list=rede-skype
add address=149.13.32.0/24 comment="" disabled=no list=rede-skype
add address=200.159.128.189 comment=RJNet disabled=no list=medidores
add address=200.195.144.42 comment=Copel disabled=no list=medidores
add address=186.233.88.161 comment="PC Ativo" disabled=no list=medidores
add address=200.187.80.31 comment="Teste sua velocidade" disabled=no list=medidores
add address=81.92.212.76 comment=Abeltronica.com disabled=no list=medidores
add address=74.209.160.12 comment=Speedtest.net disabled=no list=medidores
add address=74.125.234.0/24 comment=Speedtest.net disabled=no list=medidores
add address=189.50.144.15 comment="" disabled=no list=medidores
Marquei os pacotes com o mangle:
Primeiro marco as conexões do Skype através da address-list e se não pegar pela address-list, pega pelo Layer7. Marco os pacotes dessas conexões também.
Código :
/ip firewall mangle
add action=mark-connection chain=prerouting comment=Skype disabled=no \
dst-address-list=rede-skype new-connection-mark=cSkype passthrough=yes
add action=mark-connection chain=prerouting comment="" disabled=no \
layer7-protocol=SkypeParaSkype new-connection-mark=cSkype passthrough=yes
add action=mark-packet chain=prerouting comment="" connection-mark=cSkype \
disabled=no new-packet-mark=pSkype passthrough=no
Depois marco as conexões e os pacotes da address-list que criei anteriormente com os IPs dos medidores (source e destination):
Código :
add action=mark-connection chain=prerouting comment=Medidores disabled=no \
dst-address-list=medidores new-connection-mark=cMedidores passthrough=yes
add action=mark-connection chain=prerouting comment="" disabled=no \
new-connection-mark=cMedidores passthrough=yes src-address-list=medidores
add action=mark-packet chain=prerouting comment="" connection-mark=cMedidores \
disabled=no new-packet-mark=pMedidores passthrough=no
Após isso, marco as conexões e os pacotes do que considero navegação: download de arquivos menores. Marco somente os arquivos que tem tamanho de 0 a 300000 bytes (300k). [2]
Código :
add action=mark-connection chain=prerouting comment="Navegacao" \
connection-bytes=0-300000 disabled=no new-connection-mark=cNavegacao \
passthrough=yes protocol=tcp
add action=mark-packet chain=prerouting comment="" connection-mark=cNavegacao \
disabled=no new-packet-mark=pNavegacao passthrough=no
Marco o que considero download de arquivos (arquivos acima de 300k): [2]
Código :
add action=mark-connection chain=postrouting comment=Downloads \
connection-bytes=300000-1000000000 disabled=no new-connection-mark=\
cDownload passthrough=yes protocol=tcp
add action=mark-packet chain=prerouting comment="" connection-mark=cDownload \
disabled=no new-packet-mark=pDownload passthrough=no
Depois que os pacotes importantes foram marcados, o resto é resto. [2]
Código :
add action=mark-connection chain=prerouting comment=Restante disabled=no \
new-connection-mark=cRestante passthrough=yes
add action=mark-packet chain=prerouting comment="" connection-mark=cRestante \
disabled=no new-packet-mark=pRestante passthrough=no
Com os pacotes marcados, basta implementar as queues.
Eu usei as Simple Queues, mas dá pra usar as Queue Tree também.
Aqui eu criei uma queue principal de 210k/210k, com nome de 'geral' que vai limitar o IP 10.25.50.252:
Código :
/queue simple
add burst-limit=0/0 burst-threshold=0/0 burst-time=0s/0s comment="" \
direction=both disabled=no dst-address=0.0.0.0/0 interface=all limit-at=\
0/0 max-limit=210k/210k name=geral parent=none priority=8 queue=\
default-small/default-small target-addresses=10.25.50.252/32 total-queue=\
default-small
Daqui em diante só criei uma simple queue pra cada serviço que eu quero priorizar (skype, medidores, navegação, download e o restante, nessa ordem). O parent de todos eles é essa queue principal que criamos anteriormente.
Código :
add burst-limit=0/0 burst-threshold=0/0 burst-time=0s/0s comment="" \
direction=both disabled=no dst-address=0.0.0.0/0 interface=all limit-at=\
0/0 max-limit=200k/200k name=skype packet-marks=pSkype parent=\
geral priority=4 queue=default-small/default-small \
target-addresses=10.25.50.252/32 total-queue=default-small
add burst-limit=0/0 burst-threshold=0/0 burst-time=0s/0s comment="" \
direction=both disabled=no dst-address=0.0.0.0/0 interface=all limit-at=\
0/0 max-limit=200k/200k name=restante packet-marks=pRestante \
parent=geral priority=8 queue=default-small/default-small \
target-addresses=10.25.50.252/32 total-queue=default-small
add burst-limit=0/0 burst-threshold=0/0 burst-time=0s/0s comment="" \
direction=both disabled=no dst-address=0.0.0.0/0 interface=all limit-at=\
0/0 max-limit=210k/210k name=download packet-marks=pDownload \
parent=geral priority=7 queue=default-small/default-small \
target-addresses=10.25.50.252/32 total-queue=default-small
add burst-limit=0/0 burst-threshold=0/0 burst-time=0s/0s comment="" \
direction=both disabled=no dst-address=0.0.0.0/0 interface=all limit-at=\
0/0 max-limit=200k/200k name=navegacao packet-marks=pNavegacao \
parent=geral priority=6 queue=default-small/default-small \
target-addresses=10.25.50.252/32 total-queue=default-small
add burst-limit=0/0 burst-threshold=0/0 burst-time=0s/0s comment="" \
direction=both disabled=no dst-address=0.0.0.0/0 interface=all limit-at=\
0/0 max-limit=200k/200k name=medidores packet-marks=pMedidores \
parent=geral priority=5 queue=default-small/default-small \
target-addresses=10.25.50.252/32 total-queue=default-small
Nessas regras eu filtro o tráfego pela marcação que ele tem, dou uma certa quantidade de banda e defino a prioridade de cada um deles. Dessa forma, por exemplo, quando o usuário fizer um download e for falar no skype, a ligação não vai picotar. O skype vai roubar do download a quantidade necessária de banda pra poder falar. A navegação vai pegar banda do download quando necessário... enfim, os serviços com maior prioridade vão pegar banda dos menos previlegiados.
Coloquei 10k a mais para download porque se eu deixar igual as outras regras, os downloads não terminam. A transmissão do arquivo termina abruptamente.
[1] - Para ligações de Skype para telefone comum, muda a regra, mas tem coo marcar também.
[2] - Somente exemplo, tem como otimizar implementando mais opções.
Pra mim isso não serve porque teria que fazer tooooodas essas regras da queue para cada cliente. Iria ferrar com o processamento das RouterBoard. Se alguém tiver alguma idéia de como fazer isso sem eu ter que alterar as queue dinâmicas que o hotspot gera, agradeço bastante!