Como definir um limite geral de rede por cliente + prioridade para confirmações TCP

1

Situação seguinte:

  • A rede A está conectada à rede B por meio de uma conexão lenta.
  • Diferentes hosts na rede A gostariam de enviar tráfego para os hosts na rede B.
  • Hosts na rede B enviando comandos para a rede A.

O que fazer:

  • Permitir que os hosts na rede A enviem dados com uma média de 0,3 MBit / se um máximo de 0,5 MBit / s. Eu gostaria de usar o token bucket para isso.
  • Enviar confirmações de TCP com prioridade de A a B. Os comandos da rede B serão enviados com TCP. Eu não quero bloquear a transmissão de comando e, em seguida, os clientes usando a marca de furo para a transmissão de dados de A- > B.

O roteador de gateway é um sistema Linux com duas interfaces. Eu descobri que posso usar tc para configurar a modelagem de tráfego.

Meus comandos:

sudo tc qdisc add dev eth0 handle 1: root tbf rate 300000  burst 500000  latency 1ms

Um speedtest com iperf me deu 265 Kbits / seg como resultado.

Pergunta: Como posso definir as regras tc corretas para limitar o tráfego por cliente e priorizar TCP ACK?

    
por Mr Mueseli 28.07.2017 / 11:27

1 resposta

0

Haveria muito a pedir para responder adequadamente, e tantas implementações possíveis, eu apenas farei algumas suposições e proponho uma solução que você poderia modificar mais tarde.

Você poderia usar flags TCP e conntrack, a máquina de conexão no kernel linux, para descobrir quais conexões são B para as tcp. Em seguida, você poderia marcá-los na máquina de conexão com CONNMARK target. Desta forma, e com -j CONNMARK --restore-mark target, quando um pacote nesta conexão estiver indo na direção A a B, ele será marcado como 100.

No lado do TC, estou usando o htb como um QDISC de classe. A classe HTB irá eliminar pacotes se houver muito tráfego. fq_codel é usado como uma fila. fq_codel organiza filas em cada classe.

O qdisc de raiz htb envia pacotes que não estão marcados na classe 1: 1000. Pacotes marcados irão em 1: 100. tc filter é usado para reconhecer 100 pacotes marcados e enviá-los para a classe 1: 100.

tc class é usado para definir a largura de banda limite.

O código a seguir assume que sua largura de banda máxima é de 1Mb / s, sua interface de rede B é eth0, sua rede A é eth1 e sua camada é ethernet.

# Spread connmark to mark
iptables -t mangle -A POSTROUTING -o eth0 -j CONNMARK --restore-mark

# New TCP connections from B to A : connmark 100
iptables -t mangle -A POSTROUTING -o eth1 -p tcp --syn -m state --state NEW -j CONNMARK --set-mark 100


# Interface : eth0, qdisc : htb, default leaf : 1000
tc qdisc add dev eth0 root handle 1:0 htb default 1000

# Interface eth0, parent branch node : 1:0, branch id : 1:10
tc class add dev eth0 parent 1:0 classid 1:10 htb rate 1000kbit ceil 1000kbit

# CLASS - B to A TCP branch
tc class add dev eth0 parent 1:10 classid 1:100 htb rate 700kbit ceil 1000kbit burst 5k prio 0 linklayer ethernet
# QDISC - Queue
tc qdisc add dev eth0 parent 1:100 handle 110: fq_codel
# FILTER - Filter
tc filter add dev eth0 parent 1:0 protocol ip prio 0 handle 100 fw flowid 1:100

# CLASS - Default branch
tc class add dev eth0 parent 1:10 classid 1:200 htb rate 300kbit ceil 500kbit burst 5k prio 7 linklayer ethernet
# QDISC - default branch queue
tc qdisc add dev eth0 parent 1:1000 handle 1010: fq_codel

Eu posso não ser tão claro quanto gostaria, pergunte-me qualquer coisa que você não entende.

    
por 29.07.2017 / 16:19