Песочница →
Ограничение полосы пропускания по времени суток с помощью ipfw
В этой статье описывается, как изменить скорость пользователям под NAT, по времени суток с использованием демона планировщика.
Используется система FreeBSD 8.1, но этот вариант изменения скорости доступен и на всех остальных версиях, где есть ipfw и cron, а это значит — практически на всех ветках и релизах FreeBSD.
О том, как скомпилировать ядро рассказывать детально я не буду, скажу лишь только то, что в нем должны находиться следующие инструкции активирующие использование фаервола и шейпера DUMMYNET:
Есть большое множество способов изменение скорости по времени, но опишу только 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). Выглядеть в скрипте это будет так:
Сохраняем этот скрипт с названием firesh-01-09.sh, изготавливаем аналогичный скрипт для дневного времени с 09:00 до 01:00 и наконец-то открываем cron (/etc/crontab) в который запишем, что, когда и от какого пользователя запускаем:
Теперь в 01:00 и в 09:00 ваши правила будут скопированы в /etc/firewall.conf, перечитаны новые и переподняты интерфейсы.
Этот способ конечно намного проще,но как-то прижился у меня не очень хорошо но я люблю старое доброе проверенное и поэтому пользуюсь первым способом.
Второй способ состоит из простого sh скрипта, в котором определенному pipe задается скорость, а затем перечитывается по времени, выглядит это примерно так:
Собственно процедура запуска конфига по времени из cron остается как в первом способе, только здесь не допускается использование команды /etc/netstart, так как мы работаем с одним конфиг файлом firewall.conf, который уже загружен в память, и при использовании этой команды вновь зачитается конфиг из /etc/firewall.conf, в котором у вас описаны стандартные правила.
Информация по DUMMYNET
Мануал по способам компиляции ядра
IPFW
Используется система 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
30.09.2011 00:46+0400