Сообщество - Лига Сисадминов

Лига Сисадминов

2 419 постов 18 939 подписчиков

Популярные теги в сообществе:

39

Mikrotik. QoS для дома

Сегодня я хотел бы немного рассказать о приоритетах.

Статья не претендует на охват всей информации по QoS на Mikrotik. Это демонстрация набора правил, позволяющих настроить несложную схему приоритезации трафика и пополнять её по мере необходимости.


Надеюсь, коллеги помогут советами в комментариях.


Говоря о QoS, обычно подразумевают два направления — более или менее равномерное деление канала по количеству пользователей, либо приоритезацию трафика. Направления эти вполне дополняют друг-друга, но для дома, для семьи заниматься делением канала я смысла не вижу и, если вас интересует эта тема, сошлюсь на исчерпывающе раскрывающую тему статью «MikroTik QoS — развенчание мифов».


Я же сосредоточусь на приоретизации трафика, благо это несколько проще.


Ограничение скорости передачи данных может быть выполнено двумя способами:


1. Отбрасываются все пакеты, превышающие лимит скорости передачи (шейпер).

2. Задержка превысивших заданное ограничение скорости передачи пакетов в очереди и отправка их позже, как только появляется такая возможность, т.е. выравнивание скорости передачи (шедулер).

Как видно на иллюстрации, шейпер режет всё, что не влезло, а шедулер просто притормаживает.

Соответственно, именно шедулер нам и нужен.


Теперь необходимо поделить трафик на классы и задать каждому классу свой приоритет. Первый класс обслуживается в первую очередь, последний — в последнюю.


Самый простой вариант такого решения, который зачастую и используется — просто пустить приоритетом VoIP-трафик, а весь остальной по остаточному принципу, но я сделаю чуть сложнее.


Итак, план таков:


prio_1: DNS, ICMP, ACK — в первую очередь идёт служебный трафик. Установка и разрыв соединений, резолвинг имён и т.п.

prio_2: SIP — VoIP очень любит минимальные задержки.

prio_3: SSH и игры — удалённый доступ важен для работы. Игры — для отдыха.

prio_4: RDP и HTTP/HTTPS — веб, видео и т.п.

prio_5: всё, что не опознано выше — в принципе, можно принудительно загнать сюда торренты. Благо дома порты с которых работают клиенты вполне известны.


Маленькое лирическое отступление:

Если мы поищем информацию о QoS в Mikrotik, то найдём несколько вариантов скриптов, начиная от монструозного QOS script by Greg Sowell или явно основанного на нём The Mother of all QoS Trees, заканчивая Traffic Prioritization Script (кстати, советую отнестись к нему с большой осторожностью, автор явно довольно смутно понимает, что делает и поэтому скрипт делает явно не то, что было задумано). У всех этих скриптов есть одна общая проблема — они написаны довольно давно и в значительной степени устарели по одной простой причине — мир изменился.


Сегодня, благодаря всеобщему шифрованию трафика, мы не можем так запросто взять и с помощью L7-regexp отловить трафик youtube, например, или Skype. Поэтому, используя такие скрипты, внимательно отнеситесь к вопросу определения трафика. Это, на мой взгляд, единственная сложность в этом вопросе.


Теперь разметим трафик согласно плана выше. В коде я использую interfaceBandwidth, т.е. ширину канала. У меня он симметричный и равен 100М. Если у вас отличается ширина канала, то необходимо изменить значение interfaceBandwidth на необходимое. Если канал асинхронный, то скрипт будет сложнее за счёт необходимости отдельно маркировать пакеты для входящего и исходящего трафика. Это несложно, но значительно увеличит скрипт, ухудшив его читаемость и, в целом, выходит за рамки статьи.


В address-list я демонстрирую возможность массовой вставки адресов из FQDN (для примера взяты адреса кластеров из wiki Мира Танков). Разумеется, можно просто прописать необходимые IP вручную.

#Set bandwidth of the interface

:local interfaceBandwidth 100M


# address-lists

:for i from=1 to=10 do={/ip firewall address-list add list=WoT address=("login.p"."$i".".worldoftanks.net")}

#

/ip firewall mangle

# prio_1

add chain=prerouting action=mark-packet new-packet-mark=prio_1 protocol=icmp

add chain=prerouting action=mark-packet new-packet-mark=prio_1 protocol=tcp port=53

add chain=prerouting action=mark-packet new-packet-mark=prio_1 protocol=udp port=53

add chain=prerouting action=mark-packet new-packet-mark=prio_1 protocol=tcp tcp-flags=ack packet-size=0-123

# prio_2

add chain=prerouting action=mark-packet new-packet-mark=prio_2 dscp=40

add chain=prerouting action=mark-packet new-packet-mark=prio_2 dscp=46

add chain=prerouting action=mark-packet new-packet-mark=prio_2 protocol=udp port=5060,5061,10000-20000 src-address=192.168.100.110

add chain=prerouting action=mark-packet new-packet-mark=prio_2 protocol=udp port=5060,5061,10000-20000 dst-address=192.168.100.110

# prio_3

add chain=prerouting action=mark-packet new-packet-mark=prio_3 protocol=tcp port=22

add chain=prerouting action=mark-packet new-packet-mark=prio_3 address-list=WoT

# prio_4

add chain=prerouting action=mark-packet new-packet-mark=prio_4 protocol=tcp port=3389

add chain=prerouting action=mark-packet new-packet-mark=prio_4 protocol=tcp port=80,443

# prio_5

add chain=prerouting action=mark-packet new-packet-mark=prio_5

Аккуратно уложим размеченный трафик в очередь:

queue tree add max-limit=$interfaceBandwidth name=QoS_global parent=global priority=1

:for indexA from=1 to=5 do={

/queue tree add \

name=( "prio_" . "$indexA" ) \

parent=QoS_global \

priority=($indexA) \

queue=ethernet-default \

packet-mark=("prio_" . $indexA) \

comment=("Priority " . $indexA . " traffic")

}

И последнее, коль скоро Mikrotik поддерживает WMM, было бы логично разметить трафик и для него.


Делается это тем же mangle-ом с помощью команды set_priority. Согласно wiki Mikrotik'а, таблица приоритетов WMM выглядит довольно причудливо:

1,2 — background

0,3 — best effort

4,5 — video

6,7 — voice.


Разметим приоритеты, используя те же правила, что и для маркировки пакетов:

/ip firewall mangle

# prio_1

add chain=prerouting action=set-priority new-priority=7 protocol=icmp

add chain=prerouting action=set-priority new-priority=7 protocol=tcp port=53

add chain=prerouting action=set-priority new-priority=7 protocol=udp port=53

add chain=prerouting action=set-priority new-priority=7 protocol=tcp tcp-flags=ack packet-size=0-123

# prio_2

add chain=prerouting action=set-priority new-priority=6 dscp=40

add chain=prerouting action=set-priority new-priority=6 dscp=46

add chain=prerouting action=set-priority new-priority=6 protocol=udp port=5060,5061,10000-20000 src-address=192.168.100.110

add chain=prerouting action=set-priority new-priority=6 protocol=udp port=5060,5061,10000-20000 dst-address=192.168.100.110

# prio_3

add chain=prerouting action=set-priority new-priority=5 protocol=tcp port=22

add chain=prerouting action=set-priority new-priority=4 address-list=WoT

# prio_4

add chain=prerouting action=set-priority new-priority=3 protocol=tcp port=3389

В принципе, на этом всё.


В будущем, при необходимости, можно подумать о формировании динамических адресных листов, периодически формируемых из кэша DNS скриптами типа:

:foreach i in=[/ip dns cache all find where (name~"youtube" || name~"facebook" || name~".googlevideo")]

do={:put [/ip dns cache get $i address]}

для отбора онлайнового видео.


Или детектить Skype с помощью поиска upnp-правил:

:foreach i in=[/ip firewall nat find dynamic and comment~"Skype"]

do={:put [/ip firewall nat get $i dst-port]}

Но пока у меня такой необходимости нет.


Скрипты из статьи доступны на GitHub'е. Если у вас что-то не заработало, есть идеи или комментарии — пишите.


Спасибо за внимание!


UPD: В исходной версии поста в скриптах была ошибка (неверно указана цепочка) из-за которой трафик не попадал в очередь. Сейчас она исправлена.


UPD: В тексте скрипта в статье обнаружена ошибка. Прошу использовать версию с GitHub'а.

Показать полностью 1
10

Когда пятничным вечером сначала "Ну за*бись!", потом "Пфух, за*бись!", а ты даже не успел ничего починить

Когда пятничным вечером сначала "Ну за*бись!", потом "Пфух, за*бись!", а ты даже не успел ничего починить

На самом деле, сервак просто испытывал определённую нагрузку во время резервирования БД по crontab'у и при заливке дампа в облако. Длилось это четыре минуты, и именно в это время шефу удалось попасть на тормозящий сайт.

51

DHCP Failover

Failover - ближе всего термин «отказоустойчивость», был придуман для обеспечения высокой доступности каких-либо сервисов. Вы дублируете какую-то часть системы или даже систему целиком для того, чтобы при отказе ваши пользователи не остались ни с чем. Круто, когда для пользователя отказ пройдет незаметно. Неплохо, когда отказ повлечет небольшое снижение качества услуги. Плохо, когда пользователя пошлют далеко и надолго просто потому, что всё сломалось. Это было так, лирическое отступление.


Теперь что касается DHCP. Задача сервера тут состоит из двух частей: выдавать адреса (каждый раз добавляйте мысленно «и сопутствующие настройки») новым пользователям и продлять аренду адресов для уже существующих клиентов.


Классические принципы построение отказоустойчивого сервиса предусматривали распиливание диапазона выдаваемых адресов в некотором процентном соотношении между двумя серверами (80 на 20, например). Первый сервер раздавал адреса, второй тихо был в резерве. Когда первый становился недоступен, включался в систему второй и «поддерживал штаны», пока первый снова не становился доступным. Безусловно, если «распилить» диапазон 50/50, то теоретически всё хорошо. НО! Во-первых, а что если вами используется больше половины диапазона? Во-вторых, вспомним, что в жизни есть резервации (запомненные пары MAC-IP), которые делаются не просто так, а с какой-то целью (на этот адрес прописываются особые разрешения в firewall и т.д.). Если для компа запомнен адрес из одной половины, то его нет во второй половине, очевидно.


Вторая классическая схема – кластер. Это когда у вас есть несколько железок, а поверх них некоторая программная надстройка, которая обеспечивает единую виртуальную «точку входа» для сервиса. Короче, клиент обращается к DHCP всегда одинаково, а виртуалка с сервисом может практически мгновенно съебаться с одного физического сервака на другой абсолютно незаметно для этого самого клиента. Это нехило страхует от физических проблем, а страховку от логических обеспечивают своевременные бэкапы и предыдущая схема. Но дорого и не избавляет от проблем с резервациями в случае сочетания с предыдущей схемой.


И третий вариант, который предлагает нам виндовый сервер начиная с версии 2012. Два сервера полностью дублируют друг-друга. При этом возможно как распределение нагрузки в определенном процентном соотношении, так и «горячее резервирование», при котором резервный сервер исправно реплицируется с основным, но запросы не обрабатывает до отказа основного. Справедливости ради: linux тоже так умеет. Вот, например. И в той и в другой ОС такая связка может состоять только из двух серверов, однако сервер может участвовать уже в максимум 31 связке. Также при желании можно пошаманить с репликацией файлов dhcp.leases и dhcp.static в linux, но зачем городить колхоз, когда есть готовые решения?

Пара схем. Одна область (scope) может участвовать только в одной связке одновременно.

Я буду рассматривать настройку виндового варианта. Просто потому, что использую его. Предполагается, что работающий DHCP у вас уже есть, просто вы дозрели до того, что хотите сделать failover. Сервер1 – на нем работает dhcp сейчас, Сервер2 – пустой.

1) Поднимете роль DHCP на Сервере2

2) В свойствах области на Сервере1, которую реплицируем выберите «только DHCP».

3) На Сервере2 в свойствах сервера (ipv4) создать все нестандартные опции. Нестандартные – это те, которых не было в дефолтных списках и вам их когда-то приходилось создавать на Сервере1. Например, опция для Forefront TMG клиента 252-WPAD. Нестандартные опции сами не отреплицируются.

4) На Сервере1 там же на «IPv4» нажать правой кнопкой мыши и выбрать «Configure failover»

5) Настроить всё в соответствии со своим представлением о прекрасном. Например, по мануалу отсюда. Ну, собственно, пройти мастер, задать парольную фразу и расставить галочки в соответствии с задачами все смогут.

6) Чудесно, у вас два активных DHCP с одинаковым пулом в одной сети и никаких конфликтов =)

Из граблей – резервации не реплицируются автоматом, их надо пинать руками (на области, на том сервере, где делали изменения ПКМ и «реплицировать эту область»). Все дополнительные настройки области (добавления новых опций dhcp, например) тоже требуют пинка для репликации. Есть вроде отдельная софтина, которая делает это автоматом, но меня, как практически единоличного админа DHCP, устраивает и этот вариант.


В чем разница «hot standby» и «load balance». Для объяснения нам потребуется знать о параметре maximum client lead time (MCLT). Вы его задаете при настройке failover.

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

Показать полностью 4
12

Постоянные ребилды и фейлы HGST под HP

Всем привет, не знаю с кем еще обсудить - поэтому кидаю клич народу.

Дело в том, что исторически сложилось, что мы используем сервера HP и HGST диски. Когда серверов под проектом было мало, проблему как-то не замечали, однако когда их число перевалило за 30 - мы получаем 1-2 отвала HGST (и HTS и HTE) дисков в неделю, сначала года мы пережили уже более 70 реблидов. Интересно, что все тесты и SMART сфейлившихся дисков говорят что они ok - даже бедов нет. Месяц переписки с HGST никакого результата не дал - каждый раз одно и то же - протрите стекла, постучите по колесам (пришлите вывод SMART, прогоните тесты, попробуйте выключить-включить). Последний ответ вообще порвал - нигде мол не заявлено что HGST и HP могут работать - так что идите на йух - мы вас не знаем.

Всвязи с этим вопрос - может кто-то еще сталкивался с такой проблемой? Решал как-то?

Модели рейдов и контролеров P410, P420, P812, P420i, P812, H241. Среди них есть конечно старенькие - но есть и те, что еще поддерживаются. От каждого из них хотя бы раз происходил отвал или ребилд.

Прошивки контролеров последние, HGST прошивок не поставляет.

Вопрос к специалистам

Знакомый обратился с панической просьбой подсказать, можно ли обойти слежение за трафиком интернет-брожений в локальной сети?


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


Так как моя специализация - ремонтировать компы и ноутбуки, в сети и ее администрировании я разбираюсь лишь на начальном уровне, а ля настроить простенькую сетку и чтоб работал.


Теперь, как я это понял и перефразировал: есть ли софт для слежения интернет-серфинга с возможностью отслеживать все URL, по которым переходили, и возможность подключения к этой сетке по удаленке и, соответственно, просмотру трафика?

64

Ужасы в картинках

В продолжении поста картинки лабораторных по сетям.

Статическая маршрутизация (каждая точка – хост, каждый хост – студент):

Экзамен на 5 курсе:

Он же, то уже с «розданными» мною подсетями и в процессе настройки:

Ёлочка на старшем курсе, снеговик – на младшем:

Мануал по тому, как коммитить диплом:

И небольшое заключение:

Сегодня день рождения у нашего бывшего преподавателя по сетям. Месяца не проходит, как вспоминаю его добрым словом. Он дал отличную базу в плане образования, он никогда не отказывал в помощи студентам (как по учебе, так и моральной, и материальной, вроде поддержки проектов). Он никогда не кричал на нас, максимум бился головой об стол =) Никто не смог выиграть у него зачёт в Warcraft. Он научил меня играть в преферанс и кучу народа в настолки. Спасибо!

Показать полностью 5
82

Об образовании в ИТ. Приятное исключение.

Сегодня не образовательный пост, но об образовании.


Сейчас почти под каждым постом об ИТ встречается коммент, что, мол, образования в области ИТ считай что нет, а то что есть – говно и все знания получают с помощью самообучения.


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


Больше половины народа пришли учиться абсолютно «нулёвые» в области ИТ, в том числе и я. У кого-то не было информатики в школе. У меня учитель говорил: «ты что, думаешь, если бы я умел программировать или админить, я бы пошел в школу учить?!». Так что первый семестр мы гнали школьную программу: Pascal + алгоритмы (схемы Горнера, массивы и деревья, инфиксная-постфиксная записи), таблицы истинности, заголовки файлов в hex-редакторе, представления переменных в памяти, операции с плавающей точкой и т.д. И две супер-лекции: «как поставить Ubuntu в дуал бут с виндой и не снести винду при этом» и «как работать с консолью в линуксе – основные команды». Ну и всякая муть типа истории развития ИТ.


Второй семестр добавил Delphi и чистый Си. Добавилось псевдо-ООП в паскале + графические модули. Из лабораторных помню шашки, игру с графикой на паскале, какие-то калькуляторы/часы на дельфях. На Си писали «свой shell» (обрабатывал ввод математических выражений и какие-то команды). Это не всё, лабораторных было много и всё по-взрослому: обязательная проверка корректности ввода (за это прям дрючили), обязательно читаемый код, обязательная документация к большим проектам типа игр.


Второй курс добавил книгу Таненбаума «Современные операционные системы» с задачами, WinAPI, MFC, C++, C#. Паскаль закончился, зато на WinAPI добавились многопроцессные и многопоточные приложения.


Дальше со второго по четвертый курс были ASP.Net, системное программирование под Linux по одноименной книжке (с межпроцессным взаимодействием – все эти разделяемая память, семафоры, сигналы, сообщения, сокеты и т.д.), Qt, чуток Perl и Python (буквально несколько регулярок), PHP. Базы данных (sqlite, mysql, DB2, Oracle). Параллельные вычисления (CUDA). UML (описание всех этапов разработки: от составления ТЗ и описания процессов до подбора физической конфигурации серверов). Графика в OpenGL. Сортировки (полный том Кнута). Криптография (как вся математика типа вычислений в полях Галуа или поиска простого числа, так и практика – писали реализацию DES, AES, RSA, RC4; писали свою реализацию PGP с шифрованием и подписью). Еще был COM (с книгой, где засыпаешь через полстраницы). Писали клиент-серверные приложения (сервер под Linux, пользовательская часть под виндой).


На 4 курсе задания чаще всего уже не включали в себя конкретный язык – делай на чём душа пожелает. На четвертом же курсе начались сети. Мы с товарищем прошли весь курс за год, так что его разделить на семестры не смогу. Вот примерная программа на 2,5 года: модель OSI и адресация в сетях, статическая маршрутизация (Linux, cisco, HP), динамическая маршрутизация (OSPF, BGP, так же Linux, cisco, HP), VLAN (без заморочек типа VTP правда), GRE туннели, DNS (Bind9), DHCP, Squid + SquidGuard, Apache, iptables, LARTC, ну и наверняка что-то забыла.


Всё, абсолютно всё по всем ИТ курсам было с практикой. И почти всё с высокими требованиями, приближенными к продакшену: читаемый код с комментариями; проверка пользовательского ввода; программа не должна вылетать с системными ошибками, что бы ни случилось; никакой лишней инфы для пользователя (например, во вьюхах к БД не должны отображаться ID), если вход по паролю, то храним не пароли, а хэши и т.д. На старших курсах обучение разбавлялось докладами на самые разные темы (как работает процессор, как происходит нагрузочное тестирование, как работает Bluetooth, как делать презентации и научные доклады).


Ну и собственно итог: такое образование позволило практически всем выбрать свою специализацию и углубиться в неё. На мой взгляд, приличное образование в ИТ всё-таки встречается. Да, я уже не помню половину, но инфа по программированию очень помогает в траблшутинге и составлении ТЗ, кто бы что ни говорил.


P.S.: пруфы по сетям в следующем посте.

Показать полностью
Отличная работа, все прочитано!