Limitando a largura de banda na interface interna no gateway Linux

4

Eu sou responsável por um roteador de escritório baseado em Linux (que executa Debian) que pega uma única conexão de Internet de alta velocidade (eth2) e a transforma em cerca de 20 redes internas, cada uma com uma sub-rede separada (192.168.1.0/ 24 a 192.168.20.0/24) e uma VLAN separada (eth0.101 a eth0.120). Estou tentando restringir a largura de banda em uma das sub-redes internas que está consistentemente mastigando mais largura de banda do que deveria. Qual é a melhor maneira de fazer isso?

Minha primeira tentativa foi com o wondershaper, sobre o qual eu ouvi sobre o SuperUser aqui . Infelizmente, isso é útil exatamente para a situação oposta que eu tenho ... é útil no lado do cliente, não no lado da Internet.

Minha segunda tentativa foi usar o script encontrado no link , que modifiquei para que a parte ativa seja :

tc qdisc add dev eth0.113 root handle 13: htb default 100
tc class add dev eth0.113 parent 13: classid 13:1 htb rate 3mbps
tc class add dev eth0.113 parent 13: classid 13:2 htb rate 3mbps
tc filter add dev eth0.113 protocol ip parent 13:0 prio 1 u32 match ip dst 192.168.13.0/24 flowid 13:1
tc filter add dev eth0.113 protocol ip parent 13:0 prio 1 u32 match ip src 192.168.13.0/24 flowid 13:2

O que eu quero fazer é restringir a largura de banda na VLAN 113 (sub-rede 192.168.13.0/24) para 3mbit up e 3mbit para baixo. Infelizmente, parece não ter efeito algum! Eu sou muito inexperiente com o comando tc, então qualquer ajuda para conseguir este trabalho seria apreciada.

    
por Jack Scott 06.12.2012 / 05:14

2 respostas

2

Cite os desenvolvedores para alguém tentando fazer a mesma coisa: Fazer controle de tráfego na vlan pode não funcionar como esperado, porque o pseudo-dispositivo vlan não tem nenhuma fila de transmissão.

Como você já escreveu suas regras para limite de taxa por sub-rede , é uma questão de fazer com que o Linux avalie o controle.

Eu sugeriria trabalhar em torno dele colocando a VLAN em uma ponte (embora, para fins de consistência, você queira criar uma ponte para cada VLAN):

brctl addbr br113
btctl addif br113 eth0.113

Você pode aplicar as regras de tc a br113 em vez de eth0.113 .

(Configurar /etc/network/interfaces é deixado como um exercício para o leitor, se isso funcionar ...)

Ou pode ser mais simples aplicar as regras de controle de tráfego à sua interface WAN eth2 ; o resultado final deve ser o mesmo.

    
por 06.12.2012 / 05:29
1

Você precisa de uma interface ifb para espelhar o fluxo de entrada de eth0 para o lado de saída de ifb0.

Tente isto:

# Interface virtual for incomming traffic
tin1="ifb0"
# Interface connect to out lan
int1="eth0"
# Clean interface
tc qdisc del dev $int1 handle ffff: ingress
tc qdisc del root dev $tin1
tc qdisc add dev $int1 handle ffff: ingress
# Redirecto ingress eth0 to egress ifb0
tc filter add dev $int1 parent ffff: protocol ip u32 match u32 0 0 action mirred egress redirect dev $tin1
# Add classes per ip
tc qdisc add dev $tin1 root handle 2: htb default 20
tc class add dev $tin1 parent 2: classid 2:1 htb rate 20480kbit
tc class add dev $tin1 parent 2:1 classid 2:5 htb rate 80kbit ceil 20480kbit
tc filter add dev $tin1 protocol ip parent 2: prio 1 u32 match ip src 192.168.1.5/32 flowid 2:15

mas antes, carregue este módulo no kernel para fazer isso:

modprobe ifb numifbs=1
ip link set dev $tin1 up
    
por 08.02.2013 / 12:41