QOS com iptables e tc com WAN instável

1

Eu tenho um roteador / gateway no Linux, quero adicionar um pouco de QoS para reservar largura de banda para um fluxo específico. Isso pode ser feito com iptables / netfilter e tc, mas todos os exemplos começam com o fato de você saber antecipadamente a largura de banda total disponível.

O problema é que minha WAN é uma conexão 3G em movimento, com desempenhos variáveis. No dia 1, eu posso ter 5 Mbps, e o dia chuvoso 2 está abaixo de 2 Mbps. Como posso garantir que meu fluxo 1 sempre terá 100 Kbps disponível com baixa latência?

Pensei em uma solução complexa, com um script diário ou de hora em hora para verificar a largura de banda e criar e aplicar dinamicamente scripts de QoS, mas não é uma boa solução para mim.

    
por Benoit PHILIPPON 10.03.2016 / 16:14

1 resposta

0

Você deve conseguir alcançar seu objetivo com o agendador hfsc. Você terá a capacidade de reservar uma parte da largura de banda e dar garantia de baixa latência com "tempo real", as outras classes irão proporcionalmente preencher o resto da largura de banda com "linkshare".

É importante aqui usar o tempo real e não o compartilhamento de links, porque o tempo real, para garantir o envio de um pacote nos últimos milissegundos, é capaz de impedir que a outra classe envie um pacote. / p>

Para conseguir o que você quer, você precisa definir um caminho para o limite superior alto na classe raiz (10 MB talvez), mas não para ul na folha. Devido à maneira como o hfsc linkshare está compartilhando a largura de banda entre toda a classe "ls", eles compartilharão a largura de banda disponível, acima do valor de m2, se houver mais.

Por exemplo, você pode usar esse tipo de configuração:

# dns, ntp, teamspeak
iptables -t mangle -A POSTROUTING -o eth0 -p udp -m multiport --dports 53,123,9987 -j CLASSIFY --set-class 1:100
# Default tcp
iptables -t mangle -A POSTROUTING -o eth0 -p tcp -j CLASSIFY --set-class 1:200
# Default udp
iptables -t mangle -A POSTROUTING -o eth0 -p udp -j CLASSIFY --set-class 1:300

# ROOT QDISC - default goes on class 100 because it's probably arp gratuitous or whois since all ip traffic is already classified
tc qdisc add dev eth0 root handle 1:0 hfsc default 100

# ROOT CLASS - Interface eth0, noeud parent de la branche : 1:0, id de la branche : 1:10
tc class add dev eth0 parent 1:0 classid 1:10 hfsc ls m2 10000kbit ul m2 10000kbit

# CLASS 100 - VOIP, DNS, NTP
tc class add dev eth0 parent 1:10 classid 1:100 hfsc sc m1 400kbit d 10ms m2 100kbit
# QDISC
tc qdisc add dev eth0 parent 1:100 handle 110: fq_codel quantum 300 noecn # fq_codel requires to change the quantum for low bandwitdth

# CLASS 200 - some tcp
tc class add dev eth0 parent 1:10 classid 1:200 hfsc ls m1 80kbit d 10ms m2 80kbit
# QDISC - some tcp
tc qdisc add dev eth0 parent 1:200 handle 210: fq_codel

# CLASS 300 - some udp
tc class add dev eth0 parent 1:10 classid 1:300 hfsc ls m1 20kbit d 10ms m2 20kbit # ratio tcp / udp will then be 4:1
# QDISC - some udp
tc qdisc add dev eth0 parent 1:300 handle 310: fq_codel quantum 300 noecn

Os valores podem precisar ser alterados de acordo com sua necessidade, especialmente na classe 100, embora eu tenha tentado escrever esses números para caber no seu 3G.

Você deve ler mais sobre man tc-hfsc, este post e este artigo para saber mais sobre o hfsc e como funciona.

    
por 14.03.2016 / 23:14