Настройка PIPE для распределения пропускной способности канала


 

Причиной использования данной технологии мною лично весьма банальна - ВИРУСЫ

Началось все с того что инет стал весьма медленным а закончилось практически невозможностью пингануть любой www хост, пакеты терялись, связь рвалась, и почта не принимала даже заголовки писем. Оказалось что на паре машин завелись трояны, и своими пакетами забили все 2 мегабита канала. Чтобы это не повторилось достаточно нарезать входящий трафик на каналы, и тогда любое сколь угодно большое количество пакетов с одного или нескольких компьютеров - не смогут забить больше отведенной для них ширины канала.

 

Немного теории, чтобы потом было понятно о чем идет речь.

IPFirewall позволяет не только ограничивать IP-пакеты, но и ограничивать скорость их прохождения. Для этого используется встроенная в ядро FreeBSD система dummynet - эмулятор "плохой" линии связи с настраевыми характеристиками, такими как абсолютная задержка прохождения пакета, ограничение скорости прохождения данных по линии, потеря некоторого числа пакетов. 
Dummynet состоит из каналов (pipe, труба) и очередей (queue). Канал характеризуется пропускной способностью (биты в секунду), задержкой прохождения пакета (в секундах), размером очереди (сколько данных может одновременно "находится" в канале), процентом потерь. Задать эти значения Вы можете с помощью команды 

/sbin/ipfw pipe <номер> config bw <скорость> delay <время> queue <очередь> plr <процент> , где

 <номер> - номер канала. Выбирается администратором произвольно из диапазона 1-65534 

<скорость> - пропускная способность канала. Задается в виде числа, интерпретируемого как биты в секунду. Возможно также задание и единицы измерения из следующего набора: bit/s, Kbit/s, Mbit/s, Bytes/s, KBytes/s,MBytes/s. Единицы измерения указываются после числа без пробелов: 2MBytes/s, 64Kbit/s. 

<время> - время задержки пакета в миллисекундах, всегда прибавляется к времени нахождения любого пакета в канале в не зависимости от текущей загрузке канала.

<очередь> - размер очереди в пакетах или в килобайтах (если указана единицы измерения - Bytes или KBytes). Не поместившиеся в очередь пакеты отбрасываются

<процент> - процент потерянных пакетов. Обычно используется для эмуляции плохих линий связи при проверке устойчивости сетевого программного обеспечения к сбоям. Задается как вещественное число от 0 до 1 (0 - потерь нет, 1 - теряются все пакеты). 

не буду описывать как все это работает, ибо подобной информации в нете море.....

 

В общем сначала

Чтобы эта возможность имела место быть, нужно собрать ядро со следующими опциями

IPFIREWALL - собственно включает ipfw

DUMMYNET - Система ограничения пропускной способности определенных соединений,

как пересобрать ядро где-то тут у меня написано

короче

options IPFIREWALL

options DUMMYNET

компилим и перегружаемся

В общем можно сделать по разному в зависимости от того, как у Вас задаются правила для ipfw

Можно написать скрипт в котором будут соответствующие команды ipfw, а можно сделать так ,как сделал я, просто добавив в файл /etc/rc.firewall соответствующий набор правил, которые при каждой загрузке фряхи будут применяться автоматически.

Предположим у вас есть канал 2 mbit/s который нужно разделить некоторым образом, чтобы раздать приоритеты использования трафика, в зависимости от "важности" пользователя

Схема выглядит так: Сначала описываются каналы (абсолютная пропускная способность), потом в каждом канале прописываем очереди прохождения пакетов, а затем присваиваем ипам пользователей требуемую очередь.

> ipfw pipe 1 config bw 2Mbit/s

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

> ipfw queue 1 config pipe 1 weight 80 queue 20 mask dst-ip 0xffffffff
> ipfw queue 11 config pipe 1 weight 80 queue 20 mask src-ip 0xffffffff
> ipfw queue 2 config pipe 1 weight 50 queue 20 mask dst-ip 0xffffffff
> ipfw queue 12 config pipe 1 weight 50 queue 20 mask src-ip 0xffffffff

queue 20 - указывает на количество пакетов в очереди 

weight - указывает на приоритет в очереди (1-100) -  думаю не надо объяснять, что чем больше тем важнее :)

mask dst-ip 0xffffffff - описывает маску  подсети исходящего трафика.
mask src-ip 0xffffffff - описывает маску  подсети входящего трафика.

Когда я только делал это, то в нете находил опцию dst-addr - причем почти везде, уж не знаю где это работает но на моей фре 5.1 это не прокатило :( в общем  > man ipfw - как всегда поможет точно узнать какая из опций является корректной

Ну вот собственно механизм готов, и теперь только осталось присвоить каждому компьютеру соответствующую очередь.

Отдаем приоритет директору c ip = 192.168.0.1 

> ipfw add queue 1 ip from any to 192.168.0.1
> ipfw add queue 11 ip from 192.168.0.1 to any

а затем равномерно распределяем трафик между всеми остальными пользователями

> ipfw add queue 2 ip from any to 192.168.0.0/24
> ipfw add queue 12 ip from 192.168.0.0/24 to any

Собственно это все, за исключением того, что можно нарезать сколь угодно много каналов с разной пропускной способностью, и обусловить несколько очередей . Это целесообразно сделать, если вы хотите безусловно при любой нагрузке на трафик оставить гарантированную ширину канала для кого-то одного либо для группы привилегированных пользователей.

Таблицу готовой конфигурации pipe можно увидеть набрав с консоли команду

> ipfw pipe show

оглавление

Hosted by uCoz