Linux Server Hack - Como limitar largura de banda com o Linux, TC, e iproute2!

Lembre-se que fiz um post rápido sobre como escrever um script de balanceamento de carga (ou otimização de largura de banda)?
Bem, hoje eu encontrei um script legal para limitar a largura de banda. Eu acredito que este um caso mais complicado, mas se precisar, pode ser muito útil.
Aqui está o código via Adamsinfo.com:
# Set some variables
#!/bin/bash
EXT_IFACE=”eth0″
INT_IFACE=”eth1″
TC=”tc”
UNITS=”kbit”
LINE=”10000″ #maximum ext link speed
LIMIT=”5000″ #maximum that we'll allow
# Set algumas variáveis para o indivíduo "classes" que nós vamos usar a velocidade de upload forma interna, ou seja, modelar eth0
CLS1_RATE = "200" # classe de tráfego de alta prioridade tem 200Kbit
CLS2_RATE = "300" # Classe Média Prioridade tem 300 kbit
CLS3_RATE = "4500" # classe Bulk tem 4500kbit
# (Vamos definir quais pode pedir a partir do qual mais tarde)
# Set algumas variáveis para o indivíduo "classes" que nós vamos usar a velocidade de download forma interna, ou seja, modelar eth1
INT_CLS1_RATE = "1000" # Priority
INT_CLS2_RATE = "4000" # Bulk
# Delete qdiscs atual.
ou seja, limpar
$) (TC qdisc del dev $ (INT_IFACE raiz)
$) (TC qdisc del dev $ (EXT_IFACE raiz)
# Attach qdiscs raiz.
Estamos usando HTB aqui, e anexar esta qdisc para ambas as interfaces.
Nós vamos rotulá-la "1:0"
$) (TC qdisc add dev $ (INT_IFACE root handle 1:0 htb)
$) (TC qdisc add dev $ (EXT_IFACE root handle 1:0 htb)
# Criar classes de raiz, com os limites máximos definidos
# Um para eth1
$ (TC class add dev $) (1:0) INT_IFACE mãe classid 1:1 htb rate $ (LIMIT) $ (unidades) ceil $ (LIMIT) $ (unidades)
# Um para eth0
$ (TC class add dev $) (1:0) EXT_IFACE mãe classid 1:1 htb rate $ (LIMIT) $ (unidades) ceil $ (LIMIT) $ (unidades)
# Criar classes de criança
# Estes são para nossa interface interna eth1
# Crie uma classe rotulada "1:2" e dar-lhe o limite acima definido
$ (TC class add dev $) (1:1) INT_IFACE mãe classid 1:2 htb rate $ (INT_CLS1_RATE) $ (unidades) ceil $ (LIMIT) $ (unidades)
# Crie uma classe rotulada "1:3" e dar-lhe o limite acima definido
$ (TC class add dev $) (1:1) INT_IFACE mãe classid 1:3 htb rate $ (INT_CLS2_RATE) $ (unidades) ceil $ (INT_CLS2_RATE) $ (unidades)
# Ext_if upload () agora.
Nós também definir quais classes podem pedir emprestado e emprestar.
# Essa classe é garantido 200Kbit e pode estourar até 5000kbit se disponível
$ (TC class add dev $) (1:1) EXT_IFACE mãe classid 1:2 htb rate $ (CLS1_RATE) $ (unidades) ceil $ (LIMIT) $ (unidades)
# Essa classe é garantido 300 kbit e pode estourar até 5000kbit-200Kbit = 4800kbit se disponível
$ (TC class add dev $) (1:1) EXT_IFACE mãe classid 1:3 htb rate $ (CLS2_RATE) $ (unidades) ceil `echo $ (LIMIT) - $ (CLS1_RATE) | bc` $ (unidades)
# 4500kbit Essa classe pode é garantida e não pode estourar passou (5000kbit-200Kbit-300 kbit = 4500kbit).
# Ou seja, mesmo que o nosso volume de tráfego vai louco, as duas classes acima são ainda garantida a disponibilidade.
$ (TC class add dev $) (1:1) EXT_IFACE mãe classid 1:4 htb rate $ (CLS3_RATE) $ (unidades) ceil `echo $ (LIMIT) - $ (CLS1_RATE) - $ (CLS2_RATE) | bc` $ (unidades)
# Adicione pfifo.
Leia mais sobre pfifo em outros lugares, está fora do escopo deste HOWTO.
$) (TC qdisc add dev $ (INT_IFACE pai) 1:2 handle 12: limite pfifo 10
$) (TC qdisc add dev $ (INT_IFACE pai) 1:3 handle 13: limite pfifo 10
$) (TC qdisc add dev $ (EXT_IFACE pai) 1:2 handle 12: limite pfifo 10
$) (TC qdisc add dev $ (EXT_IFACE pai) 1:3 handle 13: limite pfifo 10
$) (TC qdisc add dev $ (EXT_IFACE pai) 1:4 handle 14: limite pfifo 10
# # # Feito acrescentando todas as classes, agora criar algumas regras!
# # #
# INT_IFACE
# Nota direção do "horário de verão '.
O tráfego que sai da nossa interface interna e para os nossos servidores é a velocidade de download do servidor, de modo SOME_IMPORTANT_IP é alocada para 1:2 classe para download.
$) (TC filter add dev $ (INT_IFACE pai) 1:0 protocol ip prio 1 u32 match ip dst SOME_IMPORTANT_IP/32 flowid 1:2
$) (TC filter add dev $ (INT_IFACE pai) 1:0 protocol ip prio 1 u32 match ip dst SOME_OTHER_IMPORTANT_IP/32 flowid 1:2
# Velocidade Todos os outros servidores de download vai 1:3 - não tão importante como os dois acima
$) (TC filter add dev $ (INT_IFACE pai) 1:0 prio protocolo ip dst 1 u32 match ip 0.0.0.0 / 0 flowid 1:3
# EXT_IFACE
# Priorizar os pedidos de DNS
$) (TC filter add dev $ (EXT_IFACE pai) 1:0 protocol ip prio 1 u32 match ip src IMPORTANT_IP/32 match ip sport 53 0xffff flowid 1:2
# O SSH é importante
$) (TC filter add dev $ (EXT_IFACE pai) 1:0 protocol ip prio 1 u32 match ip src IMPORTANT_IP/32 match ip sport 22 0xffff flowid 1:2
# O nosso servidor SMTP Exim também é importante
$) (TC filter add dev $ (EXT_IFACE pai) 1:0 protocol ip prio 1 u32 match ip src 217.10.156.197/32 match ip sport 25 0xffff flowid 1:3
# O volume
$) (TC filter add dev $ (pais) EXT_IFACE flowid 1:0 protocol ip prio 1 u32 match ip src 0.0.0.0 / 0 1:4







