вторник, 19 апреля 2016 г.

Mikrotik 951G-2HnD. Балансировка нагрузки.

Сегодня мы с вами попробуем поговорить о настройке Load Balancing (балансировки нагрузки) в Mikrotik. Как вы уже знаете по предыдущим постам у меня есть "подопытный" Mikrotik 951G-2HnD, который я и "кручу" в разных конфигурациях. Сегодня мне привалило счастье в виде второго канала в 100 Mbit от Билайн за 1 руб. в месяц (для тех кто не в курсе новая линейка мобильных тарифов "Всё" в некоторых регионах подразумевает подключение домашнего интернета и ТВ за 1 руб., т.е. к примеру, если вы или кто-либо из ваших родственников, как было в моем случае, пользуется тарифом "Всё за 800", то доплатив всего-лишь 1 руб. к "телефонному тарифу" вы получаете "бесплатный интернет" и ТВ) ... глупо было не воспользоваться подобным предложением - т.к. второй высокоскоростной канал в интернет за 1 руб. вещь достаточно полезная. Ну например, можно легко настроить failover, т.е. вариант, когда основной канал в интернет по каким-либо причинам недоступен, а весь траффик идет по второму каналу, или же, load balancing (балансировку нагрузки), когда вы сами выбираете что и через какой канал у вас идет. Таким образом мы имеем двух провайдеров - Ростелеком, который предоставляет доступ в интернет через PPPoE и Билайн, который использует L2TP соответственно.

Прежде чем я буду рассказывать о том что у меня получилось и как - приведу несколько полезных ссылок, которые помогли мне в процессе экпериментов:

Для меня был интересен вариант настройки Load Balancing, в котором пропускная способность обоих каналов суммировалась бы при использовании торрент-клиента. Т.е. говоря проще, я решил сделать "торрентокачалку" на 200 Mbit ;) Зачем? Это скорее риторический вопрос, раз есть резервный канал в интернет на 100 Mbit - неплохо было бы использовать его мощность на 100%. Получилось у меня примерно следующее:



Как видно из скриншотов - суммарная скорость при скачивании популярных раздач на торренте оказалась около 14.2 Mb/sec, т.е. 137,8 Mbit (показаны мгновенные значения скоростей). При этом весь входящий трафик автоматически "поделился" между Билайн (bee-internet) и Ростелеком (dml-internet) в соотношении ~70.5 Mbps и 67.3 Mbps. При этом загрузка CPU у Mikrotik'а составила ~100% :( Именно по этой причине не удалось выжать из приведенной конфигурации больше 140 Mbit. Здесь также следует учитывать и множество других факторов, например, то что оба провайдера предоставляют подключение на скорости до 100 Mbit, т.е. никто не гарантирует "честную сотню", исходящую скорость источников трафика и т.п. 

Как оказалось впоследствии, причиной такой нагрузки на CPU были вовсе не правила PCC, а нагрузка из-за L2TP туннеля. Т.е. если оставить одно подключение к Билайну через L2TP и загрузить канал на 100% - то загрузка CPU также возрастает до 100%. Буквально перед тем как написать эти строки я наткнулся на информацию об обновлении Mikrotik 6.35 (2016-Apr-14 12:55), в котором одним из нововведений отмечался fastpath для l2tp туннелей: "implemented l2tp and lns fastpath/fasttrack support", однако, протестировать эту возможность я пока не успел. Итак, получившаяся у меня конфигурация (здесь я буду рассматривать только те правила, которые касаются непосредственно PCC, рассматривать как поднимать соединение с L2TP и PPPoE мы не будем):

# настройка правил PCC в Firewall'е /ip firewall mangle # помечаем пришедшие соединения согласно интерфейсу add action=mark-connection chain=prerouting connection-mark=no-mark in-interface=dml-internet new-connection-mark=conn_Rostelecom add action=mark-connection chain=prerouting connection-mark=no-mark in-interface=bee-internet new-connection-mark=conn_Beeline # помечаем соедиенния на 80,443,110,25 TCP порты, как относящиеся к Билайну (т.е. веб-серфинг и почта только через Билайн) add action=mark-connection chain=prerouting connection-mark=no-mark dst-address-type=!local dst-port=80,443,110,25 in-interface=bridge new-connection-mark=conn_Beeline protocol=tcp # непосредственно PCC add action=mark-connection chain=prerouting connection-mark=no-mark dst-address-type=!local in-interface=bridge new-connection-mark=conn_Rostelecom per-connection-classifier=both-addresses:2/0 add action=mark-connection chain=prerouting connection-mark=no-mark dst-address-type=!local in-interface=bridge new-connection-mark=conn_Beeline per-connection-classifier=both-addresses:2/1 # назначаем routing mark согласно меткам соединений add action=mark-routing chain=prerouting connection-mark=conn_Rostelecom in-interface=bridge new-routing-mark=rout_Rostelecom add action=mark-routing chain=prerouting connection-mark=conn_Beeline in-interface=bridge new-routing-mark=rout_Beeline # таблица маршрутизации /ip route add distance=1 gateway=bee-internet routing-mark=rout_Beeline add distance=1 gateway=dml-internet routing-mark=rout_Rostelecom add distance=1 gateway=dml-internet,bee-internet routing-mark=rout_Mixed # обязательно должен быть маршрут по-умолчанию без меток, в данном случае ECMP add distance=1 gateway=dml-internet,bee-internet

При этом оба соединения и L2TP (bee-internet), и PPPoE (dml-internet) у меня созданы с галкой Add default route и Default Route Distance 3, т.е. в итоге таблица маршрутизации у меня выглядит следующим образом при двух поднятых соединениях:


Flags: X - disabled, A - active, D - dynamic, C - connect, S - static, r - rip, b - bgp, o - ospf, m - mme, B - blackhole, U - unreachable, P - prohibit

Т.е. автоматически добавленные маршруты по-умолчанию и для того, и для другого соединения у нас имеют Distance - 3, и за счет того что мы прописали свой маршрут по-умолчанию на для немаркированных пакетов на основе ECMP с Distance - 1 - они неактивны. Как видно, в таблице маршрутов напротив автоматически созданных маршрутов стоят флаги DS и не стоит A.

Таким образом мы получаем следующее, соединения которые у нас промаркированы как conn_Rostelecom получают метку маршрута rout_Rostelecom и уходят через соединение dml-internet, а соединения промаркированные как conn_Beeline получают метку маршрута rout_Beeline и уходят через интерфейс bee-internet. Соединения не имеющие метки не получают никакую метку маршрута и уходят согласно активному маршруту по-умолчанию без меток.

Продолжение следует ... 

вторник, 12 апреля 2016 г.

Настройка IPTV от Ростелеком в Mikrotik 951G-2HnD.

Этот пост продолжает небольшой цикл статей о различных вариантах применения маршрутизатора Mikrotik, в предыдущих статьях мы посмотрели как настроить Mikrotik для использования с USB-модемом Huawei в различных вариантах - HiLink и Stick. Ну а сегодня настала очередь поговорить о том, как настроить маршрутизатор для совместной работы с провайдероской IPTV приставкой для того чтобы воспользоваться услугами "интерактивного ТВ", т.к. судя по многочисленным форумам вопросов в этой области больше чем ответов. Сразу оговорюсь, что вариантов интерактивного ТВ у Ростелекома несколько - это обычное IPTV через Multicast, а также "Интерактивное ТВ 2.0", т.е. фактически приставка которая будет показывать ТВ при подключении от любого провайдера. В данном случае речь пойдет именно про первый вариант, т.е. multicast (не путать с интерактивным ТВ 2.0). Также, оговорюсь что IPTV через multicast у РТ везде организовано по разному, здесь все зависит и от региона вашего подключения и от способа подключения (xDSL или FTTx), а также от конкретных технических особенностей реализации услуги на местах.

Сложившаяся практика следующая, если у вас ADSL подключение, то скорее всего приставка подключается в отдельный порт вашего ADSL модема, далее в нем настраивается соединение bridge (мост) на указанных провайдером VPI:VCI, внутри которого уже действует DHCP от РТ от которого приставка получает IP-адрес. В этом же соединении и работает multicast. Как пример, если мы настроим ADSL модем в режиме моста (bridge), указав в настройках VPI:VCI от услуги IPTV, выключим в модеме встроенный DHCP сервер, не будем группировать порты и т.п., а просто воткнем в один из его портов приставку - то при такой настройке мы скорее всего увидим что она получила IP-адрес от DHCP провайдера, а также принимает потоковое вещание. Это тот случай который мы здесь рассматривать не будем, т.к. нас интересует вариант с multicast'ом через FTTx.

Тут тоже как минимум две схемы реализации (в каждом регионе и даже в разных местах одного и того же региона свои технические особенности), с VLAN'ами и без. В случае с VLAN'ами провайдером выделяется отдельный VLAN, далее ставится управляемый коммутатор, к которому как раз и подключается IPTV приставка (либо аналогичная схема настраивается в каком-нибудь продвинутом роутере), в результате приставка опять же получает IP от РТ'шного DHCP в этом VLAN'е и показывает нам ТВ. В нашем случае мы будем рассматривать схему без VLAN'ов , т.е. схему в которой мы имеем провайдерский кабель подключенный к роутеру, приставка выходит в интернет для соединения с Middleware portal (провайдерским порталом, т.е. интерфейсом, который вы видите в самой приставке) через поднятое через PPPoE соединение с интернет, а сами multicast-пакеты "сыпятся" на физический Ethernet порт вашего подключения, без всякого тегирования, т.е. untagged, и без всяких PPPoE. Именно подключение с таким вариантом реализации IPTV мы и будем рассматривать.

Для тех кому интересно как оно вообще реализовано, что такое middleware и т.п. читаем вот эти две статьи:
Для настройки, собственно, была приобретена вот такая вот IPTV приставка:


Она же ТВ-приставка «Стандарт», она же ТВ-приставка IPTV RT-STB HD, она же, согласно наклейке сзади RT STB HD 1.11-BD 27:


По-сути, данная приставка является "клоном" приставки Infomir MAG 250, но не самой последней ревизии. Из визуальных изменений, как вы уже наверное успели заметить, логотип и "шильдик" оператора, а также измененный пульт ДУ. Судя по многочисленным постам в интернете люди активно перепрошивают эти приставки в оригинальный MAG 250 (ссылка на последнюю прошивку от MAG 250), а также прошивкой от ДНК (в ней кстати заявлена поддержка оригинального пульта от РТ). Вероятнее всего я тоже попробую это сделать и рассказать вам о результатах, а также показать разницу, но все это уже тема для отдельного поста, здесь мы только остановимся на настройках Mikrotik'а. Да, забыл сказать что в офисах РТ эта приставка вам обойдется в ~3600 руб. (возможно вам, кстати, попадется не именно эта модель, а, например Smartlabs SML-282 Base), однако на том же Avito аналогичную б/у приставку можно найти за 900-1500 руб., что я собственно и сделал.


Версия прошивки (F/W) у нее оказалась 1.51595.526 и судя по тому, что обновления для нее отсутствовали, видимо это последняя РТ'шная прошивка под нее на данный момент (кстати, мультикастовый адрес обновления по-умолчанию BRANDING_DEFAULT_UPGRADE_URL у нее судя по всему norm://239.77.65.71:9999). Ну да не будем отвлекаться ;) 

Подключаем наш Mikrotik, настраиваем его и настраиваем на нем PPPoE соединение с интернет (предполагается что интернет от Ростелеком на вашем Mikrotik'е уже работает), вставляем приставку в 5-й порт. Его мы будем делать "выделенным", т.е. в каком плане, на нем у нас будет работать интернет и на него же будут идти multicast пакеты, т.е. непосредственно эфир. Зачем я решил вынести приставку в отдельный порт? Для того чтобы multicast траффик не "сыпался" на все порты маршрутизатора. Немного поясню ... можно настроить Mikrotik так, что при просмотре HD канала на приставке (скорость потока при этом составляет в среднем ~10 Mbit) эти 10 Mbit входящего UDP траффика будут "сыпаться" на все порты маршрутизатора сразу (пример такой настройки приведен например здесь - MikroTik hAP lite и Beeline (IPoE/L2TP/IPTV), правда тут настройка для Билайн, но не суть). Такой вариант настройки тоже имеет право на существование, но согласитесь, если мы знаем что приставка у нас подключена к какому-то определенному порту, то зачем нам лишний трафик на других портах? Плюс конечно в том что можно смотреть IPTV через VLC, например, на ПК, но мне, например, это не нужно. Поэтому в инструкции ниже мы будем выносить 5-й порт отдельно, как порт для приставки (да, для более продвинутых читателей сразу скажу, что мы не будем объединять его bridge'ем с ether1, мы будем использовать именно IGMP Proxy из пакета Multicast).
  1.  Устанавливаем пакет Multicast. Для этого заходим на http://www.mikrotik.com/download и качаем архив с Extra packages соответствующий архитектуре вашего маршрутизатора. Для Mikrotik 951G-2HnD - это раздел MIPSBE и 6.34.4 (если у вас не эта версия ПО, лучше ее обновить до 6.34.4). Далее из архива all_packages-mipsbe-6.34.4.zip извлекаем пакет multicast-6.34.4-mipsbe.npk и перетаскиваем его Drag & Drop'ом в раздел Files в WinBox'е или загружаем его в Mikrotik любым другим способом, например, через SSH или FTP.
  2. Перезагружаем девайс - System - Reboot. В результате в разделе Routing у нас должен появиться IGMP Proxy.
  3. Далее ... всем известно что у нас Mikrotik по умолчанию имеет IP - 192.168.88.1, а DHCP сервер поднятый в нем по умолчанию раздает адреса LAN-клиентам из диапазона 192.168.88.0/24, или же из пула 192.168.88.10-192.168.88.254. У меня локальная подсеть - это не 192.168.88.0/24, а 172.17.112.0/24, поэтому на скринах ниже и т.п. - не удивляйесь, сам Mikrotik - это 172.17.112.1, ну а адреса из этой подсети - это его локальная подсеть.

    Как известно, в конфигурации по-умолчанию для портов ether3, ether4, ether5 указан master-port ether2. Открываем настройки порта ether5 (Interfaces -> Ethernet) к которому у нас подключена IPTV приставка и в графе Master Port ставим значение none. Плюс переименовываем его в ether5-master для удобства.
  4. Далее идем в раздел Bridge и добавляем новый мост, который мы назовем bridge-iptv. На закладке Ports добавляем туда наш порт ether5-master (отдельный bridge мы создаем для того, если в будущем захотим добавить еще какие-то порты туда, например, если у нас появится вторая IPTV приставка и мы захотим использовать еще и порт ether4 для IPTV). В результате выполнения пунктов 4 и 5 мы должны видеть примерно следующее:

  5. Теперь идем в раздел IP - Addresses и назначаем порту ether1 (физический "WAN-порт", в который у нас вставлен кабель от Ростелеком) IP адрес - 1.1.1.1/24 (может быть и не совсем корректно, но тут важно другое - чтобы у нас заработал IGMP Proxy на WAN порту, на который будут приходить ТВ-поток обязательно должен быть назначен любой адрес, можете взять не 1.1.1.1, а, к примеру, какой-нибудь серый IP), а мосту bridge-iptv назначаем IP - 172.17.113.1/24. Обратите внимание, локальная сеть у нас это 172.17.112.1/24, а в случае с bridge-iptv мы берем другую подсеть - 172.17.113.1/24. Здесь важно сделать именно другую подсеть, т.к. если повесить сюда локальный адрес, который у вас на обычном интерфейсе bridge - возможны зависания маршрутизатора при трансляции потока, т.е. ситуация когда IPTV работает, а интернет - нет. Поэтому здесь мы указываем другую подсеть.
  6. Далее в разделе DCHP Server мы создаем отдельный DHCP Server с именем defconf-5 на интерфейсе bridge-iptv, создаем pool адресов default-dhcp-5, в IP - Pool как 172.17.113.10-172.17.113.254 и назначаем этот pool нашему DHCP серверу. Также в настройках DHCP Server - Networks создаем новую сеть со следующими параметрами:
    Address: 172.17.113.0/24;
    Gateway: 172.17.113.1;
    Netmask: 24;
    DNS Servers: 172.17.113.1.
  7. Теперь самое главное ;) В разделе Routing - IGMP Proxy создаем Upstream интерфейс на ether1, а в Alternative Subnets прописываем у него 0.0.0.0/0, а также создаем Downstream интерфейс (т.е. галочку Upstream в настройках мы у него не ставим) на bridge-iptv:

  8. Теперь создадим два правила Filter rules на вкладке IP - Firewall - Filter Rules (см. правила 1 и 2), так как показано на рисунке:


    Т.е. одно правило Accept для протокола 2 (igmp) для цепочки input и другое правило, тоже разрешающее (accept) - для протокола 17 (udp) и цепочки forward, где Dst. Port равен 5000. Оба правила задаются для In Interface - ether1.
  9. Далее включаем приставку в розетку (если до этого она была включена, проще выключить ее и включить, чтобы она получила IP адрес по новой), ждем пока она загрузится и убеждаемся в том что она получила IP адрес из подсети 172.17.113.1/24. Если вы все сделали по написанному, то ТВ у вас уже должно работать.
Для примера вот скриншот соответствующий работающему каналу TV1000 MegaHit HD в приставке:


Что мы видим здесь?

  • На закладке Routing - IGMP Proxy - MFC видны текущие multicast группы, к которым присоединилась приставка, в данном случае это 233.3.4.84. В которой источником вещания является сервер 213.140.243.48. Именно так должна выглядеть закладка MFC при корректных настройках.
  • В логе мы видим что UDP пакеты приходят с 213.140.243.48:SPort -> 233.3.4.84:5000 на интерфейс ether1. Т.е. вещание действительно ведется не через PPPoE соединение, а не физический WAN порт.
  • Смотрим трафик на интерфейсе ether5-master (аналогичная картина у нас кстати и на bridge-iptv, т.к. в этот мост пока входит всего 1 интерфейс) и видим что при работающем HD канале средняя скорость передачи на порту - 9.0 Mbps.

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

Ну вообщем-то и все. Кстати, для тех кто не знает, каналы можно смотреть не только на приставке, но и в том же VLC, например, URL канала TV1000 MegaHit HD в данном случае будет udp:[email protected]:5000 (для вашего региона он может быть другим). Т.е. подключаем к пятому порту Mikrotik'а ПК с установленным на него VLC Player'ом, запускаем VLC, нажимаем Ctrl-N (Открыть URL), вводим URL канала и смотрим.

Полезные ссылки


Дополнения и замечания от пользователей

  • VideoUserr: Есть неточность - создаваемые в файерволе правила обязательно должны быть выше запрещающих!
  • VideoUserr: Еще небольшое дополнение (видимо зависит от прошивки) - на последней версии прошивки при такой настройке получалось так что, мультикаст по UDP на порт приходит, но дальше никуда не идет, понадобилось создать дополнительное третье правило forward UDP accept где необходимо указать In. Interface - порт куда приходит мультикаст, Out. Interface - куда отдавать.