Ограничение скорости на шлюзе с помощью Traffic Control ( TC + NAT)

Есть шлюз, ОС Ubuntu 12.04. Задача настроить доступ для пользователей локальной сети в интернет с ограничением скорости. Помимо Squid на котором тоже есть возможность органичить скорость, возникла потребность зарезать пололу пропускания для некоторых пользователей, так же можно сделать приоритетность трафика. ТС будет более приоритетен чем Squid, поэтому правила сквида у которых скорость будет больше чем у правил TC не будут работать. TC сможет обеспечит гарантированную скорость для начальства, ограничит особо прожорливых пользователей, у которых по каким либо причинам есть прямой доступ без сквида, а также будет возможность обеспечить приоритеты для разных ыидов трафика.

Настроим NAT

https://onedayadmin.sytes.net/nat-ubuntu-12-04/

Настроим Traffic Control

Так как скорость можно ограничить только на исходящем интерфейсе, то трафик идущей от клиентов в интернет прийдется ограничивать на eth0(интерфейс смотрящий в интернет), а там работает NAT и все src adress-а будут адресом нащего сервера. Поэтому создадим виртуальный интерфейс ifb0 на котором мы сможем увидеть адреса клиентов.

nano /etc/network/interfaces

Добавим в конец

 

class="class-code">post-up modprobe ifb

post-up ifconfig ifb0 up

post-up tc qdisc add dev eth2 handle ffff: ingress

tc filter add dev eth2 parent ffff: protocol ip u32 match u32 0 0 action mirred egress redirect dev ifb0

post-up /root/tc.sh

eth1 смотрит в локальную сеть.

Создадим скрипт с правилами управления трафиком для TC.

nano /home/scripts/tc.sh

#!/bin/bash

int_iface=eth2

if_virt=ifb0

func () {

# Удаляем все обработчики на интерфейсе

tc qdisc del dev $int_iface root

tc qdisc del dev $if_virt root

tc qdisc del dev $int_iface ingress

# Перенаправим трафикс локалки eth2 на виртуальный интерфейс

tc qdisc add dev $int_iface handle ffff: ingress

tc filter add dev $int_iface parent ffff: protocol ip u32 match u32 0 0 action mirred egress redirect dev $if_virt

}

func

# download #

tc qdisc add dev $int_iface root handle 1: htb default 1

#Main speed

tc class add dev $int_iface parent 1: classid 1:1 htb rate 100Mbit burst 30K

#For routers

tc class add dev $int_iface parent 1:1 classid 1:2 htb rate 10Mbit ceil 20Mbit burst 30K

#For admins

tc class add dev $int_iface parent 1:1 classid 1:3 htb rate 40Mbit ceil 80Mbit burst 30K

# upload #

tc qdisc add dev $if_virt root handle 1: htb default 1

#Main speed

tc class add dev $if_virt parent 1: classid 1:1 htb rate 100Mbit burst 30K

#For routers

tc class add dev $if_virt parent 1:1 classid 1:2 htb rate 10Mbit ceil 20Mbit burst 30K

#For admins

tc class add dev $if_virt parent 1:1 classid 1:3 htb rate 40Mbit ceil 80Mbit burst 30K

#admins

tc filter add dev $int_iface parent 1: protocol ip u32 match ip dst 192.168.21.20 flowid 1:3

tc filter add dev $if_virt parent 1: protocol ip u32 match ip src 192.168.21.20 flowid 1:3

Добавим в cron

crontab -e

Добавим строку

*/3 * * * * /root/tc.sh

 Проверим наш список правил.

tc class show dev eth2