Настройка PIPE для распределения пропускной способности канала
Причиной использования данной технологии мною лично весьма банальна - ВИРУСЫ Началось все с того что инет стал весьма медленным а закончилось практически невозможностью пингануть любой www хост, пакеты терялись, связь рвалась, и почта не принимала даже заголовки писем. Оказалось что на паре машин завелись трояны, и своими пакетами забили все 2 мегабита канала. Чтобы это не повторилось достаточно нарезать входящий трафик на каналы, и тогда любое сколь угодно большое количество пакетов с одного или нескольких компьютеров - не смогут забить больше отведенной для них ширины канала. |
Немного теории, чтобы потом было понятно о чем идет речь. IPFirewall позволяет не только
ограничивать IP-пакеты, но и ограничивать скорость их прохождения. Для этого используется
встроенная в ядро FreeBSD система dummynet - эмулятор "плохой" линии связи с настраевыми характеристиками, такими как абсолютная задержка прохождения пакета, ограничение скорости прохождения данных по линии, потеря некоторого числа пакетов. /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 |