Решение на основе htb.init без VPN-серверов.
Дано:
eth0 - смотрит в локалку
eth1 - смотрит в инет
NAT на eth1 включен, и клиенты, подключенные к eth0, могут ходить в инет через eth1.
Клиентов 150 и они имеют адреса из диапазона 192.168.0.1-150.
Необходимо:
Ограничить максимальную скорость для каждого клиента потолком в 1МБит. Минимальной гарантируемой скорости для клиентов не установлено (то есть - при загруженном канале, пропускная способность делится поровну).
Решение:
1. В скрипте htb.init проверяем и корректируем по вкусу переменные HTB_PATH, HTB_CACHE, TC, IP, MP.
2. cp htb.init /etc/init.d/htb
3. В папке, в которую указывает HTB_PATH, создаем следующие файлы:
eth0:
R2Q=20
DEFAULT=0
R2Q - коэффициент, определяющий соотношение точности/скорости работы шейпера (см. Замечание 1).
DEFAULT - идентификатор класса, в который попадают пакеты, если они не попадают под другие правила. Класс с идентификатором 0 существует всегда и пропускает пакеты без всякого шейпинга, то есть на полной скорости.
Этим файлом мы инициализировали шейпер на интерфейсе eth0.
eth0-2.root:
RATE=20Mbit
Этим файлом мы создали корневой класс траффика на интерфейсе eth0 и ограничили максимальную скорость отдачи через этот класс 20-ю мегабитами.
eth0-2:2001:
RATE=100Kbit
CEIL=1Mbit
LEAF=sfq
RULE=192.168.0.1
Этим файлом мы создали класс для первого клиента.
RATE - гарантируемая скорость для клиента. Поскольку в нашем случае не нужно гарантировать никакой скорости, но HTB этого требует, исходим из неравенства: 20000Кбит / 150 > RATE.
CEIL - максимальная скорость для клиента при свободном канале.
LEAF - указывает, что класс является одним из листов дерева, то есть в него попадает трафик, удовлетворяющий определенному правилу (RULE). Параметр sfq означает, что мы хотим, чтобы внутри этого класса скорость распределялась равномерно между сессиями.
RULE - правило, задающее, какой трафик будет попадать в этот класс (см. Замечание 1). В данном случае в класс попадает весь трафик, имеющий IP назначения 192.168.0.1.
eth0-2:2002:
RATE=100Kbit
CEIL=1Mbit
LEAF=sfq
RULE=192.168.0.2
.........
eth0-2:2150:
RATE=100Kbit
CEIL=1Mbit
LEAF=sfq
RULE=192.168.0.150
Замечание 1: О назначении и значениях параметров, которые указываются в файлах, и о именах файлов можно узнать из скрипта htb.init - там вверху есть неплохая справка.
Замечание 2: В именах файлов всё, что идет после точки, является комментарием.
Замечание 3: В файлах можно использовать комментарии, начинающиеся с #.
4. /etc/init.d/htb start
Всё, шейпер включен. Далее, если что-то изменится в конфигруации, нужно сделать /etc/init.d/htb restart.
Проверить работу скрипта htb.init, кроме спидтестов, можно просмотром конфигурации командами:
tc class show dev eth0
tc qdisc show dev eth0