Как стать автором
Обновить

Ограничение полосы пропускания по времени суток с помощью ipfw

Время на прочтение3 мин
Количество просмотров3.6K
В этой статье описывается, как изменить скорость пользователям под NAT, по времени суток с использованием демона планировщика.

Используется система FreeBSD 8.1, но этот вариант изменения скорости доступен и на всех остальных версиях, где есть ipfw и cron, а это значит — практически на всех ветках и релизах FreeBSD.

О том, как скомпилировать ядро рассказывать детально я не буду, скажу лишь только то, что в нем должны находиться следующие инструкции активирующие использование фаервола и шейпера DUMMYNET:

options IPFIREWALL
options IPFIREWALL_VERBOSE
options IPFIREWALL_VERBOSE_LIMIT=50
options IPFIREWALL_FORWARD
options IPFIREWALL_DEFAULT_TO_ACCEPT
options IPDIVERT
options DUMMYNET
options HZ=1000


Есть большое множество способов изменение скорости по времени, но опишу только 2, которые сам использую. Они не идеальны, но для локальной сети 10-20 человек, без белого внешнего IP адреса и с суммарной пропускной способностью канала в 20 мбит/с подойдут отлично.

Итак, первый способ

Здесь используется метод подмены рабочего конфига с помощью cron.
Итак предположим у нас имеется 2 файла на разные временные периоды:
firewall.conf-01-09 — фаервол на время с 01:00 до 09:00
firewall.conf-09-01 — фаервол на время с 09:00 до 01:00
с 01:00 до 09:00 мы будем давать пользователям высокую скорость, а во все остальное время, это с 09:00 до 01:00, заявленную по тарифу скорость.

Кладем эти 2 файла в например в /home/admin/firewall.
Далее, создаем скрипт sh, на всякий случай, который будет опускать и поднимать все интерфейсы, через которые работает ipfw, и делать /etc/netstart (это можно не делать, а можно сразу выполнять скрипт фаервола, но лично у меня, и у некоторых людей бывали всякие необыкновенные ошибки, вида no buffer space available и прочее, что решалось простым /etc/netstart). Выглядеть в скрипте это будет так:

#!/bin/sh
cp /home/admin/firewall/firewall.conf-01-09 /etc/firewall.conf
sh /etc/firewall.conf

ifconfig rl0 down
ifconfig rl1 down

ifconfig rl0 up
ifconfig rl1 up
/etc/netstart


Сохраняем этот скрипт с названием firesh-01-09.sh, изготавливаем аналогичный скрипт для дневного времени с 09:00 до 01:00 и наконец-то открываем cron (/etc/crontab) в который запишем, что, когда и от какого пользователя запускаем:

SHELL=/bin/sh
PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin

#minute hour mday month wday who command
# Firewalls
0 1 * * * root sh /home/admin/firewall/firesh-01-09.sh
0 9 * * * root sh /home/admin/firewall/firesh-09-01.sh


Теперь в 01:00 и в 09:00 ваши правила будут скопированы в /etc/firewall.conf, перечитаны новые и переподняты интерфейсы.

Второй способ

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

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

# Day firewall, 09:00 - 01:00

# Admins
ipfw pipe 230 config bw 0Mbit/s
ipfw pipe 130 config bw 0Mbit/s

# Users
ipfw pipe 107 config bw 5Mbit/s
ipfw add pipe 1107 ip from 192.168.0.107 to any out
ipfw pipe 1107 config bw 5Mbit/s

# VPN Users
ipfw pipe 246 config bw 1Mbit/s

ipfw pipe 128 config bw 5Mbit/s
ipfw add pipe 1128 ip from 192.168.0.128 to any out
ipfw pipe 1128 config bw 5Mbit/s

ipfw pipe 102 config bw 0Mbit/s

# Test users
ipfw pipe 35 config bw 0Mbit/s
ipfw pipe 36 config bw 0Mbit/s
ipfw pipe 37 config bw 0Mbit/s
ipfw pipe 38 config bw 0Mbit/s

ifconfig rl0 down
ifconfig rl1 down

ifconfig rl0 up
ifconfig rl1 up


Собственно процедура запуска конфига по времени из cron остается как в первом способе, только здесь не допускается использование команды /etc/netstart, так как мы работаем с одним конфиг файлом firewall.conf, который уже загружен в память, и при использовании этой команды вновь зачитается конфиг из /etc/firewall.conf, в котором у вас описаны стандартные правила.

Информация по DUMMYNET
Мануал по способам компиляции ядра
IPFW
Подробный мануал по DUMMYNET
Теги:
Хабы:
Всего голосов 28: ↑21 и ↓7+14
Комментарии26

Публикации

Истории

Работа

Ближайшие события

27 августа – 7 октября
Премия digital-кейсов «Проксима»
МоскваОнлайн
28 – 29 сентября
Конференция E-CODE
МоскваОнлайн
28 сентября – 5 октября
О! Хакатон
Онлайн
30 сентября – 1 октября
Конференция фронтенд-разработчиков FrontendConf 2024
МоскваОнлайн
3 – 18 октября
Kokoc Hackathon 2024
Онлайн
7 – 8 ноября
Конференция byteoilgas_conf 2024
МоскваОнлайн