Mikrotik - QoS / Bandwidth Control / Индивидуальные правила

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


Начнем как всегда - с обрисовки ситуации, которую необходимо решить.

Есть офис с доступом к сети Интернет через одного провайдера, этот провайдер предоставляет скорость равную 2Мб/с. В офисе есть два сервера, почтовый и web, которым необходимо обеспечить стабильный канал независимо как от рабочих станций, так и от самих себя. Так же в офисе есть несколько рабочих мест, которые имеют доступ к сервисам web и icq, так же есть машина системного администратора, которая имею доступ к сервисам без ограничений, но с внутренними правилами распределения трафика.

Чем сложнее задача, тем меньше шансов решить ее в одно-два действия.

Начнем с серверов, считаем, что им для нормальной работы требуется скорость в 512Кб/с, но если канал будет свободен, то пускай пользуются им во всю.

Первым шагом выделим все соединения, которые открывают сервера. Для этого маркируем все соединения, которые открывает web сервер маркером c-srv-web, а соединения, которые открывает почтовый сервер маркером c-srv-mail.

[mkt@OFFICE] > ip firewall mangle add chain=prerouting src-address="192.168.1.1"
action=mark-connection new-connection-mark="c-srv-web"

[mkt@OFFICE] > ip firewall mangle add chain=prerouting src-address="192.168.1.2"
action=mark-connection new-connection-mark="c-srv-mail"

Маркируем все пакеты от веб сервера маркером p-srv-web.

[mkt@OFFICE] > ip firewall mangle add chain=prerouting connection-mark="c-srv-web"
action=mark-packet new-packet-mark="p-srv-web"

Для работы же почтового сервера требуется большее количество портов (smtp, pop, imap...), может быть бывают ситуации, когда необходимо серверу закручивать гайки на столько, что бы ограничивать в скорости каждый сервис индивидуально, но у нас простой случай, по этому маркируем весь трафик почтового сервера маркером p-srv-mail.

[mkt@OFFICE] > ip firewall mangle add chain=prerouting connection-mark="c-srv-mail"
action=mark-packet new-packet-mark="p-srv-mail"

Теперь настало время создать правила для ограничения скорости. Первое условие - сервера гарантированно получают по 512кб/с, второе условие - не мешать друг другу (т.е. нельзя занимать весь канал, даже если он свободен), как следствие из второго максимальное ограничение это весь канал, минус гарантированная ширина для второго сервера, т.е. 1,5Мб/с.

[mkt@OFFICE] > queue tree add name="web server" parent=global-total
packet-mark=p-srv-web limit-at=512000 max-limit=1500000

[mkt@OFFICE] > queue tree add name="mail server" parent=global-total
packet-mark=p-srv-mail limit-at=512000 max-limit=1500000

Создадим правила для рядовых пользователей, считаем, что все они объединены общей группой client, лимит для них 64кб/с - гарантировано и 128кб/с - верхний предел на download и 32кб/с - гарантированно и 64кб/с - верхний предел на upload.

[mkt@OFFICE] > ip firewall mangle add chain=prerouting src-address-list=client
action=mark-connection new-connection-mark=c-client

[mkt@OFFICE] > ip firewall mangle add chain=prerouting connection-mark=c-client
action=mark-packet new-packet-mark=p-client

[mkt@OFFICE] > queue tree add name="client download" parent=local
packet-mark=p-client limit-at=64000 max-limit=128000

[mkt@OFFICE] > queue tree add name="client upload" parent=isp
packet-mark=p-client limit-at=32000 max-limit=64000

local - это локальный интерфейс, а isp - это интерфейс, смотрящий в внешнюю сеть.

При таких лимитах у нас смогут спокойно работать до 16 клиентов не мешая друг другу и серверам, занимая при этом весь позволенный им канал (гарантированный), в реальности же придется давать кому то большую скорость, кому то меньшую.

Осталось настроить машину системного админисратора, которая не имеет ограничений по сервисам, но имеет общий лимит по скорости, а так же внутри этого лимита есть лимиты между сервисами. Допустим, что общий лимит это 256кб/с - гарантированно и 512кб/с - верхний предел. Для доступа к web лимит в 64кб/с - гарантировано и 256кб/с верхний предел, для доступа к p2p сетям 128 кб/с - гарантированно и 512кб/с - верхний предел, остальной трафик получает весь оставшийся канал, который остается исходя из общего лимита.

Маркируем соединения.

[mkt@OFFICE] > ip firewall mangle add chain=prerouting src-address="192.168.1.100"
action=mark-connection new-connection-mark=c-admin

Теперь маркируем все пакеты, пакеты с 80 порта, и пакеты с p2p сетей.

[mkt@OFFICE] > ip firewall mangle add chain=prerouting connection-mark=c-admin
action=mark-packet new-packet-mark=p-admin-total

[mkt@OFFICE] > ip firewall mangle add chain=prerouting protocol=tcp src-port=80
connection-mark=c-admin action=mark-packet new-packet-mark=p-admin-web

[mkt@OFFICE] > ip firewall mangle add chain=prerouting p2p=all-p2p
connection-mark=c-admin action=mark-packet new-packet-mark=p-admin-p2p

Создаем ограничения, первое это общее ограничение, потом два дочерних от него, для web и p2p.

[mkt@OFFICE] > queue tree add name="admin-total" parent=global-total
packet-mark=p-admin-total limit-at=256000 max-limit=512000

[mkt@OFFICE] > queue tree add name="admin-web" parent=admin-total
packet-mark=p-admin-web limit-at=64000 max-limit=256000

[mkt@OFFICE] > queue tree add name="admin-p2p" parent=admin-total
packet-mark=p-admin-p2p limit-at=128000 max-limit=512000

В результате получим такую "ступеньку".

На этом все.

Comments: 23

BasterTV
  
Имею домовую сеть не 50 юзероФ.
Микротик 3,23 стоит на RouterBoard RB/450g
Создал группу по Вашей методике:
Адресa 192.168.0.20, 192.168.0.21, 192.168.0.22 и так далее в группу USER:

[mkt@MikroTik] /ip firewall address-list> add address= "192.168.0.20/32 "list= "USER " comment= "User #1 "[mkt@MikroTik] /ip firewall address-list> add address= "192.168.0.21/32 "list= "USER " comment= "User #2 "[mkt@MikroTik] /ip firewall address-list> add address= "192.168.0.22/32 "list= "USER " comment= "User #3 "

Имеется следующая задача:
1. ADSL канал в Интернет 4096/1024.
2. Динамически разделить канал на всех пользователей(активных бывает до 20 из 50).
3. Пометить пакеты и установить приоритеты по всем протоколам, для этой группы USER.
прим.
Почтовых и ВЕБ серверов нет и не нужно.

Ещё необходимо правило для открытия порта 51959 торрента для этой группы.
Также надо открыть порта 21 фтп в мир с компьютера 192.168.0.1.
Зранее спасибо, с ответом не тороплю, напишите толково главное, как у Вас это получается всегда))).
BasterTV
  
Ещё не мешает с оздать вторую группу USER_Limit.
В эту группу занесу юзеров с ограничением скорости каждому в группе к примеру 256/128
Между двумя этими группами USER и USER_Limit, интернет (канал 4096/1024) надо делить динамически.

Ещё: Группу Админ_LIMIT. Тоесть, что я под этим подразумеваю: Мне админу давать меньший приоритет, чем группе USER и группе USER_Limit . Мне и так хватит, а люди должны получть качественную услугу!!!
Sergey Lagovskiy
  
Часть 1
> Итак у меня есть следующая задача.
> Имею домовую сеть не 50 юзеров.
> Микротик 3,23 стоит на RouterBoard RB/450g
> Создал группу по Вашей методике предварительно в размножив
> этот пример в EXCEL с 192.168.0.1 -192.168.0 50:
> Адресa 192.168.0.20, 192.168.0.21, 192.168.0.22
> и так далее в группу USER:

> mkt@MikroTik] /ip firewall address-list> add address= "192.168.0.20/32 "
> list= "USER " comment= "User #1 "[mkt@MikroTik] /ip firewall address-list>
> add address= "192.168.0.21/32 "list= "USER " comment= "User #2 "[mkt@MikroTik]
> /ip firewall address-list> add address= "192.168.0.22/32 "list= "USER " comment= "User #3 "

> Всё работает, огромное спасибо!

> Имеется следующая задача: ADSL канал в Интернет 4096/1024.
> 1. Динамически разделить канал на всех пользователей
> (активных бывает до 20 из 50), 2-5 качает, остальные
> вебстраницы,форумы, аська, скайп, контакт и однокласники.

> Пока я это всё раздаю (Трафик Инспектором, оттуда и наблюдения).

Для этой группы сделаем верхний лимит 512/256 и гарантированный 256/128, хотя ниже есть вариант, когда верхний лимит много больше.

> Ещё необходимо правило для открытия порта (например 51959)
> торрента для этой группы Либо просто группу USER_TORRENT
> и туда вносить клиентов кому открыт порт вышеуказанный
> или другой с приоритететом 8 по р2р.

Конкретно для группы нельзя открыть один порт, порт открывается
для конкретной машины, представь себе, что на порт приходит
входящее соединение, как NAT будет узнавать кому из
группы оно предназначено?

> Также надо открыть порт 21 фтп в мир с моего компьютера
> 192.168.0.1. или какого другого.

ip firewall nat add chain=dstnat dst-address=1.1.1.1 protocol=tcp dst-port=21 action=dst-nat to-addresses=192.168.0.1 to-ports=21
где 1.1.1.1 это внешний адрес


> Не мешает с оздать вторую группу USER_Limit.
> В эту группу занесу юзеров с ограничением скорости
> каждому в группе к примеру 256/128
> Между двумя этими группами USER и USER_Limit, интернет
> (канал 4096/1024) надо делить динамически.

Для этой группы сделаем лимит на 256/128 верхний и 128/64 гарантированный.


> Ещё: Группу Админ_LIMIT. Тоесть, что я под этим
> подразумеваю: Мне админу давать меньший приоритет,
> чем группе USER и группе USER_Limit . Мне и так хватит))),
> а люди должны получть качественную услугу!!!

Ну канал как то не сильно предназначен для качественности, как не крути но 4мб делить на такое количество народу...
Sergey Lagovskiy
  
Часть 2
Вот приблизительно, что в голову пришло

1. Выделить соединения от пользователей
ip firewall mangle add chain=prerouting src-address= "192.168.0.0/24 " action=mark-connection new-connection-mark= "c-users "

2. Основное родительское правило download + upload
queue tree add name= "download " parent=local limit-at=4096000 max-limit=4096000
queue tree add name= "upload " parent=isp limit-at=1024000 max-limit=1024000

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

3:1. Пометить пакеты пользователей
ip firewall mangle add chain=prerouting connection-mark= "c-users " src-address=192.168.0.20/32 action=mark-packet new-packet-mark= "p-user-ivanov "
ip firewall mangle add chain=prerouting connection-mark= "c-users " src-address=192.168.0.21/32 action=mark-packet new-packet-mark= "p-user-petrov "
ip firewall mangle add chain=prerouting connection-mark= "c-users " src-address=192.168.0.30/32 action=mark-packet new-packet-mark= "p-user-limit-sidorov "
ip firewall mangle add chain=prerouting connection-mark= "c-users " src-address=192.168.0.1/32 action=mark-packet new-packet-mark= "p-admin "

4:1. Теперь поделим канал для download
queue tree add name= "download-user " parent= "download " limit-at=3072000 max-limit=3072000
queue tree add name= "download-user-limit " parent= "download " limit-at=896000 max-limit=896000
queue tree add name= "download-admin " parent= "download " limit-at=128000 max-limit=128000

5:1. Поделим канал для upload
queue tree add name= "upload-user " parent= "upload " limit-at=704000 max-limit=704000
queue tree add name= "upload-user-limit " parent= "upload " limit-at=256000 max-limit=256000
queue tree add name= "upload-admin " parent= "upload " limit-at=64000 max-limit=64000

6:1 Добавляем правила на пользователей
queue tree add name= "ivanov " parent= "download-user " packet-mark= "p-user-ivanov " limit-at=512000 max-limit=256000
queue tree add name= "ivanov " parent= "upload-user " packet-mark= "p-user-ivanov " limit-at=128000 max-limit=64000
queue tree add name= "petrov " parent= "download-user " packet-mark= "p-user-petrov " limit-at=512000 max-limit=256000
queue tree add name= "petrov " parent= "upload-user " packet-mark= "p-user-petrov " limit-at=128000 max-limit=64000
queue tree add name= "sidorov " parent= "download-user-limit " packet-mark= "p-user-limit-sidorov " limit-at=256000 max-limit=128000
queue tree add name= "sidorov " parent= "upload-user-limit " packet-mark= "p-user-limit-sidovov " limit-at=128000 max-limit=64000
queue tree add name= "admin " parent= "download-admin " packet-mark= "p-admin " limit-at=128000 max-limit=128000
queue tree add name= "admin " parent= "upload-admin " packet-mark= "p-user-admin " limit-at=64000 max-limit=64000

значения лимитов можно и поменять, главное что бы суммарно лимит не превышал основное ограничение
Sergey Lagovskiy
  
Часть 3
или...

3:2. Пометить пакеты пользователей
ip firewall mangle add chain=prerouting connection-mark= "c-users " src-address-list= "users " action=mark-packet new-packet-mark= "p-user "
ip firewall mangle add chain=prerouting connection-mark= "c-users " src-address-list= "users-limit " action=mark-packet new-packet-mark= "p-user-limit "
ip firewall mangle add chain=prerouting connection-mark= "c-users " src-address-list= "admin " action=mark-packet new-packet-mark= "p-admin "

4:2. Теперь поделим канал для download
queue tree add name= "download-user " parent= "download " packet-mark= "p-user " limit-at=3072000 max-limit=256000
queue tree add name= "download-user-limit " parent= "download " packet-mark= "p-user-limit " limit-at=896000 max-limit=128000
queue tree add name= "download-admin " parent= "download " packet-mark= "p-admin " limit-at=128000 max-limit=128000

5:2. Поделим канал для upload
queue tree add name= "upload-user " parent= "upload " packet-mark= "p-user " limit-at=704000 max-limit=64000
queue tree add name= "upload-user-limit " parent= "upload " packet-mark= "p-user-limit " limit-at=256000 max-limit=64000
queue tree add name= "upload-admin " parent= "upload " packet-mark= "p-admin " limit-at=64000 max-limit=64000

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

тут рассматриваются довольно сложные и запуттанные примеры который для явного вкусителя сиго искуства явлеются интересными и я понимаю что не хочится рассматривать самые примитивные способы и кажется что они настока явные и простые что о них даже не стоит говорить. Но может я просто не вижу может есчё что... вот сижу и пытаюсь в голове собрать картиру простого способа ограничение трафика, ведь прежде чем делать широкий шаг нужно начать с маленького, пусть даже быстрого но шага. я непойму картину того с чего нужно начать и чем закончить чтоб начел считатся трафик исходяший от пользователей и чтоб его ограничивать, там кусочиек там кусочек в голове собрать немогу ( наверно потому что 2 дня не сплю сижу ковыряю сервер (интересно просто) ) если вам не трудно объесните на самом банальном примере как можно простом как делается ограничение просто трафика для просто пользователя, вот так всё банально.

1 lan
1 wan

10 компов в сети ( в одной сети не в 2х 3х итд итп а одной ^_^ )

ну и можно просто как вариации показать как на разных машинах этих 10ти можно гибко настроить регулировку этого ограничения трафика.

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

ух настрочил......... спасибо за внимание =)
Анонимный
  
Здравствуйте, вопрос от новичка, который ищет замену трафик инспектору, а микротик работает только с ip адресами или есть возможность создавать правила по Mac адресу. А то раздача инета по ip напоминает детский лепет с точки зрения безопасности.(
Sergey Lagovskiy
  
И да и нет, смотря как подойти к проблеме.
На пример есть dhcp, который справляется, скажем так с приветствием пользователей, т.е. выдает ему адрес, вторым шагом становится привязка этого адреса к маку в dhcp и в arp, больше этому маку не будет выдаваться другой адрес, а если на карте прописать адругой адрес руками, то благодаря привязки в arp с этой картой общение не состоятся.
Можно жить и без dhcp и прописывать адреса вручную, это уже вопрос удобства, но главное, что можно связать конкретную карту с конкретным адресом.
Хотя тут всегда есть вероятность подмены мака на карте, тогда вторым уровнем защиты может быть какая либо аутентификация пользователя (через тунельный протоком или radius).
Анонимный
  
3:1. Пометить пакеты пользователей
ip firewall mangle add chain=prerouting connection-mark= "c-users " src-address=192.168.0.20/32 action=mark-packet new-packet-mark= "p-user-ivanov "
ip firewall mangle add chain=prerouting connection-mark= "c-users " src-address=192.168.0.21/32 action=mark-packet new-packet-mark= "p-user-petrov "
ip firewall mangle add chain=prerouting connection-mark= "c-users " src-address=192.168.0.30/32 action=mark-packet new-packet-mark= "p-user-limit-sidorov "
ip firewall mangle add chain=prerouting connection-mark= "c-users " src-address=192.168.0.1/32 action=mark-packet new-packet-mark= "p-admin "

А postrouting кто делать будет, для аплоада сделали, а для даунлоада?
Max
  
Сергей, скажите, возможно ли с помощью скриптового языка mikrotik (исполнение скрипта) задать вложенные условные переходы типа if - else - if (т.е. условие внутри условия) ?
Или есть что-то типа goto ?

Полдня попыток, ошибок и поиска решения не дали понимания. Подскажите, искать ли дальше.
Sergey Lagovskiy
  
да, можно.

:if ($bs = " ") do={
:set bs 0;
}
Max
  
Вот, разобрался - спасибо. Пример лесенки if-else-if выглядит так:
# -------------------------------------
:local x "0 ";
:if ($x = "0 ") do={
:log info "test _0_ "
} else={:if ($x = "1 ") do={
:log info "test _1_ "
} else={:if ($x = "2 ") do={
:log info "test _2_ "
} else={:log info "Lagovskiy-test _else_ "}
}
}

# --------------------------------------
Quest
  
Чувак, блин, я готов тя расцеловать за этот афигенный метирал! Большое человеческое спасибо! (Сорри за орфографию, это от эмоций:))
Анонимный
  
Теперь поделим канал для download
queue tree add name= "download-user " parent= "download " packet-mark= "p-user " limit-at=3072000 max-limit=256000

Насколько я понял limit-at это гарантированная скорость а max-limit максимальная, почему скорости указаны наоборот, или я не правильно понял ?
Alan
  
Добрый день !

Спасибо огромное за такое скурпулезное и в полной мере понятное разъяснение как работать с этой милой железякой.

Удачи и свершений !
Анонимный
  
ув.Sergey Lagovskiy, возможно ли пустить торрент трафик через 2-4. канала.
но так чтобы серф остался для каждой подсети через свои канали.
1 канал для 1 сети
2. для 2 сети. а торрент качался с 2 каналов.
10 мб.
10 мб.
торрент закачка в 20 мб. в инете не нашол. все только блокируют торрент.
а я хочу в 2 раза бистрее оддать клиенту файл и освободить канал.
спс жду ответа.
Анонимный
  
Здравствуйте Сергей, помогите мне пожалуйста решить мою проблему. Я не могу поднять GRE туннель через IPSec. Я настроил туннель и начал настраивать IPSec и уперся в ключ и метод аутентификации на удаленном микротике выбран rsa key я выбираю а микротике который на моей стороне тоже rsa key (что это вообще такое и с чем его едят я не представляю) ниже появляется параметры локальный и удаленный ключ (где мне их взять? Что ужно знать? Это какая то фраза пароль или что? Как мне его создать?) на удаленный микротик я не могу зайти и общаться с человеком который его настраивал не очень хочется) Надеюсь на вашу помощь. Спасибо
Sergey Lagovskiy
  
Пару публичный-приватный rsa ключ можно создать с помощью утилиты ssh-keygen с параметром "-t rsa " утилита их мира linux/unix, в windows я ее встречал только в cygwin-е.
Удачных поисков :)
Анонимный
  
Здравствуйте Сергей, есть ли у Вас какие либо наработки по мультикасту в микротике ? В частности интересует настройка IGMP Proxy или альтернативный способ просмотра IPTV на STB приставке за роутером. Вариант забриджевать wan интерфейс роутера и воткнуть туда приставку не предлагать, интересуют именно варианты проброса IPTV в LAN. Собственно до недавнего момента был настроен роутер на базе RB493G и на нем IGMP Proxy -> IPTV от билайна прекрасно работало на их STB приставке воткнутой в LAN, но мощи RB493G стало не хватать и на замену был собран x86 роутер на базе Intel Atom, все общие настройки касающиеся фаера, маршрутов и самого IGMP Proxy были один в один скопированы, но просмотр IPTV нормально не возможен, картинка периодически замерзает, разморозить можно либо переключив канал с пульта STB приставки, либо нужно подождать некоторое время и оно снова начинает показывать и так по кругу. С чем это связано и как лечить непонятно. Может у Вас есть какие мысли на этот счет ?
Анонимный
  
Доброго времени суток.
Сергей у меня немного другая схема, Вы могли бы помочь ?
Филиал нашей организации подключен по микротику: провайдер выделил канал с реальным IP. И с этой ip адресом подняли IP-Tunnel между филиалом и головным офисом. В филиале DHCP поднята на микротик (сеть 192.168.105.0/24).

Можно настроить QoS чтоб правило применялось ко всем одинакового, например первым прошел трафик RDP, HTTP, и т.д.?
Спасибо.
Анонимный
  
Сергей, а как быть, если нужно к ограничению скорости добавить балансировку 2-ч каналов? Добавить два правила для маркировки пакетов? Так не работает! Как правильно?
Sergey Prassolov
  
Сергей, здравствуйте!
Вы не могли бы опубликовать работу по настройке микротика, когда нужно:
Запретить все сайты, кроме нужных для НЕКОТОРЫХ машин..
Например, машина1, машина5, машина6 запретить доступ на все сайты все, кроме ------------.ru, машина2, машина3 запретить доступ на все, остальные машины разрешить доступ на все.
Максим Богослов
  
Добрый день!
У меня стоит задача более простая, просто динамически распределять между всей локалкой скорость. Я решил просто использовать данный кусок:
[mkt@OFFICE] > ip firewall mangle add chain=prerouting src-address-list=client
action=mark-connection new-connection-mark=c-client

[mkt@OFFICE] > ip firewall mangle add chain=prerouting connection-mark=c-client
action=mark-packet new-packet-mark=p-client

[mkt@OFFICE] > queue tree add name= "client download " parent=local
packet-mark=p-client limit-at=64000 max-limit=128000

[mkt@OFFICE] > queue tree add name= "client upload " parent=isp
packet-mark=p-client limit-at=32000 max-limit=64000

Но это не помогло. Не подскажете в чем я мог ошибиться?