Modelagem de tráfego do Linux usando o TC

6

Minha conexão com a internet é assim:

Internet < -128kbps link- > Roteador Cisco (IP público) < -LAN- > Roteador / servidor Linux (IP público) < -LAN- > PCs comuns (IPs públicos)

O roteador Cisco:

  • o primeiro IP público atribuído ao meu instituição (/ 29)
  • está programado para enviar todos os pacotes através do roteador Linux

O roteador Linux

  • O segundo IP público atribuído ao meu instituição
  • está programado para encaminhar pacotes entre os PCs comuns e a Cisco roteador
  • também atua como servidor (email, web, etc.)

Os PCs normais (4 deles):

  • O restante dos IPs públicos
  • use o roteador Linux como o gateway

Eu habilitei o log de pacotes do iptables no roteador Linux e, às vezes, descobri que:

  • Alguns pacotes são grandes, maiores que 20 KB. Isso é normal? (sim, é normal. Estes não são pacotes, são datagramas IP como o Guy explicou gentilmente)
  • Muitas vezes os dados transmitidos (para a internet) foi maior que 16KB. Por exemplo, em um determinado segundo 10572 bytes entrou (não problema), 63521 bytes saíram (para o roteador Cisco). Isso levaria 4 segundos pelo menos para enviar que 64KB através do link de 128kbps. Enquanto isso o roteador Linux está enviando mais dados ao roteador Cisco, entupindo sua buffers. Não é bom.

Agora, como posso configurar o roteador Linux para moldar o tráfego de uma forma que:

  1. Mantenha a velocidade de transmissão ao máximo quando o tráfego é entre estes PCs comuns e o servidor Linux.
  2. Diminua o tráfego para o exterior mundo para evitar entupir o "fora" linha, usando todos (ou quase todos) o largura de banda disponível (128 kbps). Não mais "> 16KB out segundos" no traçar.
  3. Garanta 24 kbps para cada pessoa regular PC, 24 kbps para o servidor Linux em a qualquer momento. (8bkps sobrando para despesas gerais se necessário). IOW, 5 (pseudo) "Bandas", 24kbps cada um.
  4. No caso de haver algum PC não usando sua banda completa, bastante compartilhar o ocioso largura de banda entre o resto do transmissão de PCs
  5. Dar prioridade a certos pacotes (Pesquisas de DNS, pacotes de controle), prioridade longe dos outros (torrent !!!), dentro de cada banda, e não afetando outras bandas.

Eu já marquei (usando tabelas IP - opção set-xmark) cada pacote de saída para cada PC:

  1. roteador Linux para o mundo exterior, alto nível
  2. roteador Linux para o mundo exterior, prio normal
  3. roteador Linux para o mundo exterior, baixo prio
  4. Primeiro PC normal para o exterior mundo, alto nível

... e assim por diante.

Cada pacote de entrada também é marcado usando este esquema a partir de 16.

Sinto muito por essa longa pergunta, mas desisti de configurar isso usando o comando tc, há muito pouca documentação sobre modelagem de tráfego e não sei para onde ir em seguida.

    
por Yanko Hernández Álvarez 30.09.2009 / 18:41

4 respostas

4

Assumindo que eth0 é uma conexão Ethernet de 100 mbit para o Cisco Router, deve ser algo assim (não é?):

tc qdisc add dev eth0 root handle 1: htb default 2
# 100 mbps
tc class add dev eth0 parent 1: classid 1:1 htb rate 100mbit
# To LAN traffic
tc class add dev eth0 parent 1:1 classid 1:2 htb rate 99000kbit ceil 100mbit
# IN traffic
tc class add dev eth0 parent 1:1 classid 1:3 htb rate 120kbit
# OUT traffic
tc class add dev eth0 parent 1:1 classid 1:4 htb rate 120kbit

# IN “bands” (one for each PC)
tc class add dev eth0 parent 1:3 classid 1:10 htb rate 24kbit ceil 120kbit
tc class add dev eth0 parent 1:3 classid 1:11 htb rate 24kbit ceil 120kbit
tc class add dev eth0 parent 1:3 classid 1:12 htb rate 24kbit ceil 120kbit
tc class add dev eth0 parent 1:3 classid 1:13 htb rate 24kbit ceil 120kbit
tc class add dev eth0 parent 1:3 classid 1:14 htb rate 24kbit ceil 120kbit

# OUT “bands” (one for each PC)
tc class add dev eth0 parent 1:4 classid 1:15 htb rate 24kbit ceil 120kbit
tc class add dev eth0 parent 1:4 classid 1:16 htb rate 24kbit ceil 120kbit
tc class add dev eth0 parent 1:4 classid 1:17 htb rate 24kbit ceil 120kbit
tc class add dev eth0 parent 1:4 classid 1:18 htb rate 24kbit ceil 120kbit
tc class add dev eth0 parent 1:4 classid 1:19 htb rate 24kbit ceil 120kbit

Gostaria de obter algo assim:

+-----------------------------------------------------------+
|                      100 mbits (1:1)                      |
+---------+------------------------+------------------------+
| 99mbits |   120 kbits In (1:3)   |  120 kbits Out(1:4)    |
+  (1:2)  +----+----+----+----+----+----+----+----+----+----+
+---------+ PC1| PC2| PC3| PC4| PC5| PC1| PC2| PC3| PC4| PC5|
          |1:10|1:11|1:12|1:13|1:14|1:15|1:16|1:17|1:18|1:19|
          +----+----+----+----+----+----+----+----+----+----+

E para cada banda:

# PC1, IN
tc qdisc add dev eth0 parent 1:10 handle 20: prio
tc qdisc add dev eth0 parent 20:1 handle 22: sfq perturb 10
tc qdisc add dev eth0 parent 20:2 handle 23: sfq perturb 10
tc qdisc add dev eth0 parent 20:3 handle 24: sfq perturb 10

# PC1, OUT
tc qdisc add dev eth0 parent 1:15 handle 21: prio
tc qdisc add dev eth0 parent 21:1 handle 25: sfq perturb 10
tc qdisc add dev eth0 parent 21:2 handle 26: sfq perturb 10
tc qdisc add dev eth0 parent 21:3 handle 27: sfq perturb 10

+--------------------++--------------------+
|       PC1 IN       ||      PC1 OUT       |
+--------------------++--------------------+
|     PRIO (20:0)    ||     PRIO (21:0)    |
|      |      |      ||      |      |      |
| Prio | Prio | Prio || Prio | Prio | Prio |
|   1  |   2  |   3  ||   1  |   2  |   3  |
|(20:1)|(20:2)|(20:3)||(21:1)|(21:2)|(21:3)|
+------+------+------++------+------+------+
|  SFQ |  SFQ |  SFQ ||  SFQ |  SFQ |  SFQ |
|(22:0)|(23:0)|(24:0)||(25:0)|(26:0)|(27:0)|
+------+------+------++------+------+------+

E assim por diante.

As regras devem ser assim

# PC1, OUT
tc filter add dev eth0 protocol ip parent 1:0 prio 1 handle 1 fw flowid 21:1
tc filter add dev eth0 protocol ip parent 1:0 prio 1 handle 2 fw flowid 21:2
tc filter add dev eth0 protocol ip parent 1:0 prio 1 handle 3 fw flowid 21:3

# PC1, IN
tc filter add dev eth0 protocol ip parent 1:0 prio 1 handle 16 fw flowid 20:1
tc filter add dev eth0 protocol ip parent 1:0 prio 1 handle 17 fw flowid 20:2
tc filter add dev eth0 protocol ip parent 1:0 prio 1 handle 18 fw flowid 20:3

e assim por diante.

Alguma sugestão, comentários, etc? (Eu não tenho experiência no campo)

    
por 07.10.2009 / 18:15
2

dê uma olhada aqui - é tutorial bastante simples como usar o mecanismo de qt htb. em essência você marca pacotes no iptables e então atribui a diferentes ques dependendo da marca.

alternativamente você pode olhar para hfsc , ele pode realmente funcionar melhor com essa conexão de internet lenta, embora eu nunca usei isso.

em relação ao tamanho do pacote - não consigo imaginar um grande pacote de 20kB. mesmo jumbo-frames em ethernet são mais curtos [9kB].

edit: como explica Some Guy - LEN é o tamanho do pacote IP desfragmentado, e não o tamanho do quadro no fio.

    
por 30.09.2009 / 19:06
0

Estou fazendo uma configuração semelhante, mas meus pacotes não estão indo para as aulas certas ...

eu faço algo como

PRIO_WEB=1
MARK_WEB=10

tc filter add dev eth0 protocol ip parent 1:0 prio $PRIO_WEB handle $MARK_WEB fw flowid 1:10

iptables -t mangle -A PREROUTING -p tcp --dport 3128 -m tos --tos Maximize-Throughput -j MARK --set-mark $MARK_WEB

os pacotes não vão lá por algum motivo ...

    
por 28.10.2009 / 16:30
-1

Que tipo de Cisco é isso? Você também pode configurar o IOS, pode ser um pouco mais fácil de configurar do que o Linux tc.

    
por 30.09.2009 / 19:12