Яндекс.Метрика

    Песочница

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

    В этой статье описывается, как изменить скорость пользователям под 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