Назад | Перейти на главную страницу

Ограничение пропускной способности внутреннего интерфейса на шлюзе Linux

Я отвечаю за маршрутизатор филиала на базе Linux (он работает под управлением Debian), который использует одно высокоскоростное подключение к Интернету (eth2) и превращает его примерно в 20 внутренних сетей, каждая с отдельной подсетью (от 192.168.1.0/24 до 192.168). .20.0 / 24) и отдельную VLAN (от eth0.101 до eth0.120). Я пытаюсь ограничить пропускную способность одной из внутренних подсетей, которая постоянно потребляет больше пропускной способности, чем следовало бы. Как лучше всего это сделать?

Моя первая попытка в этом была с wondershaper, о которой я слышал в SuperUser. Вот. К сожалению, это полезно для прямо противоположной ситуации, которая у меня есть ... это полезно на стороне клиента, а не на стороне Интернета.

Моя вторая попытка заключалась в использовании сценария, найденного на http://www.topwebhosts.org/tools/traffic-control.php, который я изменил, так что активная часть:

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

Я хочу, чтобы это ограничило полосу пропускания VLAN 113 (подсеть 192.168.13.0/24) до 3 Мбит вверх и 3 Мбит вниз. К сожалению, похоже, что это вообще не действует! Я очень неопытен с командой tc, поэтому я буду благодарен за любую помощь в этой работе.

Цитата от разработчиков тому, кто пытается сделать то же самое: Управление трафиком на vlan может работать не так, как ожидалось, потому что псевдоустройство vlan не имеет очереди на передачу.

Поскольку вы уже написали свои правила в ограничение скорости по подсети, вопрос в том, чтобы заставить Linux контролировать его.

Я бы предложил обойти это, поместив VLAN в мост (хотя для согласованности вы можете создать мост для каждой VLAN):

brctl addbr br113
btctl addif br113 eth0.113

Затем вы можете применить свой tc правила для br113 вместо того eth0.113.

(Настройка /etc/network/interfaces оставлено в качестве упражнения для читателя, если это сработает ...)

Или может быть проще применить правила управления трафиком к вашему WAN-интерфейсу. eth2; конечный результат должен быть примерно таким же.

Вам нужен интерфейс ifb для зеркалирования входящего потока eth0 на исходящую сторону ifb0.

Попробуй это:

# 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

но перед этим загрузите этот модуль в ядро, чтобы сделать это:

modprobe ifb numifbs=1
ip link set dev $tin1 up