Справедливо и равномерно разделить канал



  • Доброго времени суток!
    Есть канал 100 мбит и необходимо разделять его в равных пропорциях динамически (в зависимости от количества активных ip-адресов) например:
    работает 1 пользователь -  получает 100 мбит
    работает 100 пользователей - каждый получает 1 мбит
    работает 200 пользователей каждый получает 0.5 мбит
    Решаемо ли это на данном дистрибутиве ? Если да то как ?



  • Ключевое слово - Limiter.



  • Спасибо за ответ!
    Лимитер уже пробовал. Вот видеоролик (55 мбайт) - правильно ли я делаю настройки под данную задачу ?
    За основу был взят этот пост http://forum.pfsense.org/index.php/topic,41708.msg241470.html#msg241470 только в лимитерах не указывал mask т.к. мне показалось это правильным.
    http://dl.dropbox.com/u/1493350/pfsense/limiter.avi



  • И при такой настройке приоритет за тем адресом кто первый установил больше соединений, скорость не делится поровну между двумя активными адресами.



  • Если хочешь идеально равномерно то тогда на каждый хост необходимо создавать отдельную очередь и правило.



  • Поставил голую freebsd 7.2 release и сделал как написано тут http://www.opennet.ru/base/net/transparent_shaper.txt.html
    Все работает идеально.
    При 12-ти активных закачках у одного пользователя второй пользователь может закачивать файл и смотреть youtube на канале 1mbit.
    Реализуемо ли подобное в pfsense ?
    Как приблизительно можно накликать мышкой в web-интерфейсе pfsense эти правила

    #!/bin/sh

    cmd="ipfw -q"
           lan=em1 # Net0 на корпусе сервера
           wan=em2 # Net1 на корпусе сервера
           urate=95Mbps
           drate=95Mbps

    # Эти TCP-порты будут иметь больший приоритет, нежели остальные.
           # Не идеально, но верно для большинства случаев.
           gtcp="20,21,22,23,25,80,110,179,443,2222,3389,8080,8081"

    # Вес для разных классов трафика
           gtw=3 # Высокоприоритетный TCP
           btw=2 # Остальной TCP
           ipw=4 # Остальной IP (в основном, это UDP)

    $cmd flush
           $cmd pipe flush

    $cmd pipe 100 config bw $drate
           $cmd pipe 200 config bw $urate

    # WAN -> LAN
           $cmd queue 111 config weight $gtw queue 50 pipe 100 gred 0.002/5/15/0.05 mask dst-ip 0xffffffff
           $cmd queue 112 config weight $btw queue 50 pipe 100 gred 0.002/5/15/0.05 mask dst-ip 0xffffffff
           $cmd queue 113 config weight $ipw queue 50 pipe 100 mask dst-ip 0xffffffff

    # LAN -> WAN
           $cmd queue 211 config weight $gtw queue 50 pipe 200 gred 0.002/5/15/0.05 mask src-ip 0xffffffff
           $cmd queue 212 config weight $btw queue 50 pipe 200 gred 0.002/5/15/0.05 mask src-ip 0xffffffff
           $cmd queue 213 config weight $ipw queue 50 pipe 200 mask src-ip 0xffffffff

    # Management and loopback
           $cmd add allow all from any to any via em0
           $cmd add allow all from any to any via lo0

    # Block unwanted traffic
           $cmd add deny all from 192.168.0.0/16 to any
           $cmd add deny all from any to 192.168.0.0/16
           $cmd add deny all from 10.0.0.0/8 to any
           $cmd add deny all from any to 10.0.0.0/8
           $cmd add deny all from 172.16.0.0/12 to any
           $cmd add deny all from any to 172.16.0.0/12
           $cmd add deny all from 127.0.0.0/8 to any
           $cmd add deny all from any to 127.0.0.0/8

    # WAN -> LAN
           $cmd add queue 111 tcp from any to any $gtcp out xmit $lan
           $cmd add queue 111 tcp from any $gtcp to any out xmit $lan
           $cmd add queue 112 tcp from any to any out xmit $lan
           $cmd add queue 113 ip from any to any out xmit $lan

    # LAN -> WAN
           $cmd add queue 211 tcp from any to any $gtcp out xmit $wan
           $cmd add queue 211 tcp from any $gtcp to any out xmit $wan
           $cmd add queue 212 tcp from any to any out xmit $wan
           $cmd add queue 213 ip from any to any out xmit $wan



  • Реализуемое, сначала необходимо определится с постановкой задачи.



  • One thing to keep in mind.

    If you don't select anything under "Mask" then all users on that subnet share what ever you set under bandwidth limit in my case it was 3Mbit down and 2 Mbit up but if select source and destination under "Mask" then each user in that subnet will get 3/2 dedicated connection.

    Переводить надо ?

    Плюс хватит 2-ух трубок - на вход и выход и кол-во сессий ограничьте на каждого клиента (Maximum number of established connections per host) - 70-100 хватит. А то есть любители покачать торренты, знаете ли.



  • @SysR:

    Реализуемое, сначала необходимо определится с постановкой задачи.

    100 мбит интернет канал и 100 пользователей в локальной сети.
    Pfsense-box включаем в разрыв ethernet-сегмента между апстримом и локальной сетью. Можно в режиме роутера, можно в режиме моста - не суть важно.
    Необходимо чтобы торренты одного пользователя не мешали серфингу другого.
    Или например 99 пользователей запустили utorrent и закачивают/раздают. 100-й пользователь при этом не должен испытывать значительных задержек при серфинге.
    Если активны 100 пользователей - каждый получает 1/100 (1мбит) канала не мешая при этом другим.
    Если активны 25 пользователей - каждому по 1/25 канала (4мбита).



  • Если я правильно понял, необходимо делить канал по типу трафика и хостам?

    Тогда:
    1. Определяем вес каждого сервиса, например, ХТТП (порт 80) будет иметь приоритет выше чем торенты (те все остальное 1024-65534)
    2. Включаем на интерфейсе WAN шейпер, в поле bandwidth задаем скорость канала например с типом очереди Hierarchical Fair Service Curve.
    3. Создаем на интерфейсе WAN например очереди: qAck (Для ТСР), qWeb (наш ХТТП), qOther (все остальное)
    Очередь qAck должна быть 10-12% от ширины канала с опцией Real Time такой же (те гарантировано 10-12% полосы)
    Очередь qWeb задаем например 30%, реалтайм ставим 30% и upperlimit даем 90% (те гарантировано 30% но не более 90%, 10% на АСК)
    Очередь qOther задаем к примеру 20% с аперлимитом до 70% и ставим опцию default и Explicit Congestion Notification (те скорость очереди мы никак не гарантируем но если канал свободен то до 70% можно взять)

    Особенность планировщика HFSC та что суммарная скорость очередей не может превышать 70% общей скорости канала (поля bandwidth и Real Time)

    Далее на файрлволе на внешнем интерфейсе создаем правила по трафику (по портам) для ВЕБ и для ВСЕ ОСТАЛЬНОЕ и в расширенных опциях указываем Ackqueue/Queue qAck/qWeb qAck/qOther для протокола TCP и Ackqueue/Queue none/qWeb none/qOther для протокола UDP

    Можно например использовать планировщик Class-Based Queueing у него есть опция borrow тот же аперлимит но не контролируемый

    В следующем посте опишу как разделить это по хостам

    P.S. Попадает ли трафик в очереди можно посмотреть в Status - Queues



  • Теперь по хостам.

    На интерфейсе ЛАН включаем очередь HFSC на скорость подключения.
    Создаем очередь qAck одну на всех с шириной 10%
    Создаем очередь qUser1 даем ему например скорость 1% с опцией аперлимит 70%
    На файрволе на внутреннем интерфейсе создаем правило для ИР адреса где указываем выше созданные очереди.

    Но я бы так не делал, хлопотно очень, делил бы только по типу сервиса или в крайнем случае по группам адресов. В планировщике HFSC есть опции уменьшения скорости конекта с m1 до m2 по истечению d секунд.



  • d - милисекунд (milliseconds )



  • Решил тут запостить.
    Есть локальная сеть и несколько туннелей openvpn.
    Lan сетей -3шт и выше
    Один WAN - 20Мб\с
    Внутри сети провайдера 100Мб\с (пул из внешних IP)

    Помогите выпрямить руки.

    Требования такие:
    На LAN1 выделен канал - 8Мб\с, на LAN2 - 6Мб\с и на LAN3 - 1Мб\с.
    LAN3 - общественный Wi-Fi, поэтому выбрал тип шейпера PRIQ и установил лимит в 1мб\с, Queue limit - в 2000, закрыл все порты кроме 80, 53, 443
    такие же настройки на те интерфейсы, которым наша контора предоставляет интернет, просто режу канал на весь интерфейс без всяких трубок. Правда все порты разрешены (правильно ли в этом случае использовать PRIQ, не вылезут ли они со своими P2P сверх своей скорости? )
    На speedtest.net показывает ту скорость, которую указал.

    LAN1 и LAN2 - это внутренние сети, там использую CBQ . И так настраиваю трубки:
    Выставляю скорость в интернет на интерфейс: 8 и 6 Мб\с
    Далее qACK выделяю 10% канала. Заодно ставлю галку " Borrow from other queues when available"
    Я так понял, что если трубки не хватает, то можно и от других отъедать, если они свободны.
    Приоритет 6

    Трубке qP2P ставлю приоритет 1
    использовать как трубу по умолчанию
    15% полосы
    галку " Borrow from other queues when available"
    Queue limit - 500

    qOthersHigh - 60% полосы (сюда входит web трафик)
    галку " Borrow from other queues when available"
    Приоритет - 4

    WAN - CBQ
    Bandwidth - 90Mb\s (реально пров дает 25), вот тут я не знаю как быть - выставлять скорость физического канала
    или выставлять столько сколько пров дает? Ведь на LAN я уже выставил, что скорость будет фиксированной.
    qACK, qP2P, qOthersHigh - так же как и на LAN

    Все делаю мастером.

    При таком раскладе так же режется трафик по OpenVPN и по LAN, пинг c pfsense до соседней машинки 900мс идет.
    хотя без шейпера  1-2мс. В инет пинги нормальные.

    Как мне сделать так, чтобы определенные подсети вообще не шейпились.

    Сделал alias (UNLIME)- запихал туда все подсети, на которых 100Мб\с
    Сделал трубку qUnlim - выставил 90мб\с
    В Floating прописал правило * UNLIME * UNLIME * * qUnlime
    Но шейпер валится с ошибкой, что скорость в трубке qUnlim, превышает скорость интерфейса.
    Как можно сделать так, чтобы alias не шейпился?



  • Идти от обратного. Не создавать отдельную очередь , а указать в созданных ранее Floating Rules в сурс или дестинэйшн (в зависимости от ситуации) ваш алиас. Если алиас будет в дестинэшн - то ставить галку на not , т.е. получится not destination.
    Отследить правильно ли работает правило во Floating Rules легко - поставить на нужном галку Log , сделать reset states для чистоты и в Status: System logs: Firewall отслеживать, периодически нажимая f5 для рефреша.

    И не забывать делать Reset States!



  • Идти от обратного. Не создавать отдельную очередь , а указать в созданных ранее Floating Rules в сурс или дестинэйшн (в зависимости от ситуации) ваш алиас. Если алиас будет в дестинэшн - то ставить галку на not , т.е. получится not destination.

    Спасибо, но я так примерно и делал:
    В Floating прописал правило    *   UNLIME   *  ! UNLIME   *   *    qUnlime
    или

    • !UNLIME   *  ! UNLIME   *   *    qOthersHight
      Пробовал в Adwanced указывать not/qOthersHight qACK/not и тп.
      Но это все равно шейпирует трафик на этом алиасе. Точнее выше выставленного Bandwidh на интерфейсе никак не прыгает. Можно ли вообще убрать шейпирование на этих адресах?
      Сейчас смотрю на Limiter, но честно говоря не пойму как им пользоваться.


  • @schmel:

    Идти от обратного. Не создавать отдельную очередь , а указать в созданных ранее Floating Rules в сурс или дестинэйшн (в зависимости от ситуации) ваш алиас. Если алиас будет в дестинэшн - то ставить галку на not , т.е. получится not destination.

    Спасибо, но я так примерно и делал:
    В Floating прописал правило    *   UNLIME   *  ! UNLIME   *   *    qUnlime
    или

    • !UNLIME   *  ! UNLIME   *   *    qOthersHight
      Пробовал в Adwanced указывать not/qOthersHight qACK/not и тп.
      Но это все равно шейпирует трафик на этом алиасе. Точнее выше выставленного Bandwidh на интерфейсе никак не прыгает. Можно ли вообще убрать шейпирование на этих адресах?
      Сейчас смотрю на Limiter, но честно говоря не пойму как им пользоваться.

    Невнимательно читаете написанное мною . В созданных РАНЕЕ правилах! Не нужно создавать новые правила!
    В созданных ранее (в каждой!) указать в дестинэйшн !UNLIME . Далее, включить логирование на некоторых правилах для проверки и сделать reset states. И всё, можно идти в логи и смотреть.



  • 2pfsensizator: Получилось ли у тебя настроить limiter в соответствии с твоей задачей? Можешь скриншоты или видео выложить?
    @SysR:

    Если хочешь идеально равномерно то тогда на каждый хост необходимо создавать отдельную очередь и правило.

    Т.е. на каждого пользователя нужно создавать отдельную очередь и правило? А если пользователей 100, для каждого вручную все создавать?



  • В созданных ранее (в каждой!) указать в дестинэйшн !UNLIME

    а понял теперь, попробую, спасибо.



  • Создал правила мастером, выбрал один WAN и несколько LAN, в floating в каждое правило прописал в destination !UNLIME
    Все равно на speedtest провайдера (адреса из alias) скорость не поднимается выше той, что указана на интерфейсе. (qInternet)
    Как можно еще попробовать?



  • В логах смотрим, попадают ли адреса из Unlime в правила floating. Если да , то неправильно настроены правила.




  • Я как Вы и сказали, сделал в destination !UNLIME во всех правилах.
    Но почему-то если замерять скорость на speedtest.net до серверов провайдера весь трафик попадает в p2p трубу (по умолчанию, фиксированная) и скорость не превышает отведенных % на трубу p2p. Если измерить до других серверов, то используется qOtherHight и скорость нормальная. А если убрать !UNLIME с 80 порта, то все нормально, трафик ограничивается шириной отведенной трубы qInternet на адреса провайдера, но все равно шейпится.
    Может во floating еще какое правило добавить нужно?



  • reset states делали после всех настроек шейпера или пиф ребутили?

    P.s. На вашем скрине в правом верхнем углу висит предупреждение о неправильных настройках шейпера. Вы его читали-исправляли?



  • @werter:

    reset states делали после всех настроек шейпера или пиф ребутили?

    P.s. На вашем скрине в правом верхнем углу висит предупреждение о неправильных настройках шейпера. Вы его читали-исправляли?

    States сбрасывал, сейчас вот перезагрузил - тоже самое если указывать !UNLIME, http трафик попадает в p2p трубку. Ошибку писал шейпер, что для интерфейса opt1 (этот интерфейс для wi-fi) не задана трубка по умолчанию, хотя в настройках стояла галка на qOthersDefault, снял галку и поставил потом заново - вроде перестал писать, но все осталось так же. Может есть какие-то скрытые правила во floting или CBQ всегда неизвестный трафик отправляет в трубку по умолчанию?



  • Настройте шейпер ВНИМАТЕЛЬНО (!) и ПОНИМАЯ ЧТО ДЕЛАЕТЕ (!) с нуля. У меня все отлично работает. Шейпит только то , что я указываю.

    P.s. Исп-ую HFSC в кач-ве алгоритма шейпинга.



  • А с чем может быть связано, что правила ! алиас не грузятся фаерволом (вверху ошибка крутится постоянно)



  • @nomeron:

    А с чем может быть связано, что правила ! алиас не грузятся фаерволом (вверху ошибка крутится постоянно)

    Там и о причине обычно пишется. Попробуйте пересоздать проблемный алиас.



  • @werter:

    Настройте шейпер ВНИМАТЕЛЬНО (!) и ПОНИМАЯ ЧТО ДЕЛАЕТЕ (!) с нуля. У меня все отлично работает. Шейпит только то , что я указываю.
    P.s. Исп-ую HFSC в кач-ве алгоритма шейпинга.

    Удалил все правила, настроил заново, но все равно весь неизвестный трафик попадает в p2p трубу (p2pCatchAll).
    Pfsense 2.0.1
    CBQ
    работает, если только по умолчанию использовать трубу со скоростью интерфейса qLink и выставить на нее высший приоритет, но так не катит, так как остальной паразитный трафик тоже будет попадать в эту трубу.
    Если не секрет - не поделитесь своим конфигом?



  • решил пока таким способом:
    1. Создал отдельную трубку qLink и выставил bandwidh 90Mb\s

    LAN
    –qLink (90 Mb\s)
    --qInternet (14Mb\s)
    ----qp2p (5%)
    ----qOthersHight (70%)
    ----qOthersDefault (20%)

    2. Во Floating Rules, как подсказал werter во все правила в destination добавил !UNLIME
    3. Самое первое правило сделал  * * * UNLIME * * qACK/qLink

    Может кто подскажет более удобное решение?



  • Блин, способ работает, но видать не на всех.
    В другом филиале такая же версия и такие же правила, но если я создаю qLink с bandwidht > bandwidht qInternet, то выскакивает соответствующая ошибка:

    There were error(s) loading the rules: bandwidth for qLink higher than interface/tmp/rules.debug:48: errors in queue definition pfctl: Syntax error in config file: pf rules not loaded - The line in question reads [48]: queue qLink on le0_vlan100 bandwidth 90Mb priority 6 qlimit 3000 cbq ( ecn ) ..

    В этом плане сделал по другому: на интерфейс назначил скорость 100Мб\с (физическая скорость порта)
    Создал трубку qLink - 98Mb\s
    На трубку qInternet назаначил скорость в 14Мб\с

    Будут ли какие-либо подводные камни при такой конфигурации?


Locked