Настоящее суммирование интернет-каналов — OpenMPTCPRouter



    Можно ли объединить несколько интернет-каналов в один? Вокруг этой темы куча заблуждений и мифов, даже сетевые инженеры с опытом часто не знают о том, что это возможно. В большинстве случаев, объединением каналов ошибочно называют балансировку на уровне NAT или failover. Но настоящее суммирование позволяет пустить одно единственное TCP-подключение одновременно по всем интернет-каналам, например видеотрансляцию так, чтобы при обрыве любого из интернет-каналов вещание не прерывалось.

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

    Мифы про суммирование каналов


    Есть много бытовых роутеров, поддерживающих функцию Multi-WAN. Иногда производители называют это суммированием каналов, что не совсем верно. Многие сетевики верят, что кроме LACP и суммирования на L2 уровне, никакого другого объединения каналов не существует. Мне часто доводилось слышать, что это вообще невозможно от людей, которые работают в телекомах. Поэтому попробуем разобраться в популярных мифах.

    Балансировка на уровне IP-подключений


    Это самый доступный и популярный способ утилизировать несколько интернет-каналов одновременно. Для простоты представим, что у вас есть три интернет провайдера, каждый выдаёт вам реальный IP-адрес из своей сети. Все эти провайдеры подключены в роутер с поддержкой функции Multi-WAN. Это может быть OpenWRT с пакетом mwan3, mikrotik, ubiquiti или любой другой бытовой роутер, благо сейчас такая опция уже не редкость.

    Для моделирования ситуации представим, что провайдеры выдали нам такие адреса:

    WAN1 — 11.11.11.11
    WAN2 — 22.22.22.22
    WAN2 — 33.33.33.33
    

    То есть, подключаясь к удалённому серверу example.com через каждого из провайдеров, удаленный сервер будет видеть три независимых source ip клиента. Балансировка позволяет разделить нагрузку по каналам и использовать их все три одновременно. Для простоты представим, что мы делим нагрузку между всеми каналами поровну. В итоге, когда клиент открывает сайт, на котором условно три картинки, он загружает каждую картинку через отдельного провайдера. На стороне сайта это выглядит как подключения с трёх разных IP.


    При балансировке на уровне подключений, каждое TCP-подключение идёт через отдельного провайдера.

    Такой режим балансировки часто несёт проблемы для пользователей. Например, многие сайты жёстко привязывают cookie и токены к IP-адресу клиента, и если он внезапно изменился, то запрос отбрасывается или клиента разлогинивает на сайте. Это часто воспроизводится в системах клиент-банка и на других сайтах со строгими правилами пользовательских сессий. Вот простой наглядный пример: музыкальные файлы в VK.com доступны только при действительном ключе сессии, который привязан к IP, и у клиентов, использующих такую балансировку, часто не проигрываются аудио, потому что запрос ушёл не через того провайдера, к которому привязана сессия.


    При загрузке торрентов балансировка на уровне подключений суммирует пропускную способность всех каналов

    Такая балансировка позволяет получить суммирование скорости интернет-канала, при использовании множества подключений. Например, если у каждого из трёх провайдеров скорость 100 Мегабит, то при загрузке торрентов мы получим 300 Мегабит. Потому что торрент открывает множество подключений, которые распределяются между всеми провайдерами и в итоге утилизируют весь канал.

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


    Одно подключение всегда будет использовать только один интернет-канал

    Это справедливо и для видео-трансляций. Если вы вещаете потоковое видео на какой-то условный Twitch, то балансировка на уровне IP-подключений не даст никакой особенной пользы, так как видео-поток будет транслироваться внутри одного IP-подключения. В данном случае, если у провайдера WAN 3 начнутся проблемы со связью, например потери пакетов или снижение скорости, то вы не сможете моментально переключиться на другого провайдера. Трансляцию придётся останавливать и переподключаться заново.

    Настоящее суммирование каналов


    Реальное суммирование каналов даёт возможность пустить одно подключение к условному Twitch сразу через всех провайдеров таким образом, что, если любой из провайдеров сломается, подключение не оборвется. Это на удивление сложная задача, которая до сих пор не имеет оптимального решения. Многие даже не знают, что такое возможно!

    По предыдущим иллюстрациям мы помним, что условный сервер Twitch может принять от нас видеопоток только от одного source IP адреса, значит он должен быть у нас всегда постоянным, вне зависимости от того, какие провайдеры у нас отвалились, а какие работают. Чтобы этого добиться, нам потребуется суммирующий сервер, который будет терминировать все наши подключения и объединять их в одно.


    Суммирующий сервер агрегирует все каналы в один тоннель. Все подключения происходят с адреса суммирующего сервера

    В такой схеме используются все провайдеры, и отключение любого из них не вызовет обрыв связи с сервером Twitch. По сути, это особый VPN-тоннель, под капотом у которого сразу несколько интернет-каналов. Главная задача такой схемы — получить максимально качественный канал связи. Если на одном из провайдеров начались проблемы, потеря пакетов, увеличение задержек, то это не должно никак отразиться на качестве связи, так как нагрузка автоматически будет распределяться по другим, более качественным каналам, которые есть в распоряжении.

    Коммерческие решения


    Эта проблема давно беспокоит тех, кто ведёт прямые трансляции мероприятий и не имеет доступа к качественному интернету. Для таких задач существуют несколько коммерческих решений, например компания Teradek делает такие монструозные роутеры, в которые вставляются пачки USB модемов:


    Роутер для видеотрансляций с функцией суммирования каналов

    В таких устройствах, обычно, встроена возможность захвата видеосигнала по HDMI или SDI. Вместе с роутером продаётся подписка на сервис суммирования каналов, а также обработки видеопотока, перекодирования его и ретрансляции дальше. Цена таких устройств начинается от 2к$ с комплектом модемов, плюс отдельно подписка на сервис.

    Иногда это выглядит достаточно устрашающе:



    Настраиваем OpenMPTCPRouter


    Протокол MP-TCP (MultiPath TCP) придуман для возможности подключения сразу по нескольким каналам. Например, его поддерживает iOS и может одновременно подключать к удалённому серверу по WiFi и через сотовую сеть. Важно понимать, что это не два отдельных TCP-подключения, а именно одно подключение, установленное сразу по двум каналам. Чтобы это работало, удалённый сервер должен поддерживать MPTCP тоже.

    OpenMPTCPRouter — это открытый проект программного роутера, позволяющего по-настоящему суммировать каналы. Авторы заявляют, что проект находится в статусе альфа-версии, но им уже можно пользоваться. Он состоит из двух частей — суммирующего сервера, который размещается в интернете и роутера, к которому подключаются несколько интернет-провайдеров и сами клиентские устройства: компьютеры, телефоны. В качестве пользовательского роутера может выступать Raspberry Pi, некоторые WiFi-роутеры или обычный компьютер. Есть готовые сборки под различные платформы, что очень удобно.


    Принцип работы OpenMPTCPRouter

    Настройка суммирующего сервера


    Суммирующий сервер располагается в интернете и терминирует подключения со всех каналов клиентского роутера в одно. IP-адрес этого сервера будет внешним адресом при выходе в интернет через OpenMPTCPRouter.

    Для этой задачи будем использовать VPS-сервер на Debian 10.

    Требования к суммирующему серверу:

    • MPTCP не работает на виртуализации OpenVZ
    • Должна быть возможность установки собственного ядра Linux

    Сервер разворачивается выполнением одной команды. Скрипт установит ядро с поддержкой mptcp и все необходимые пакеты. Доступны установочные скрипты для Ubuntu и Debian.

    wget -O - http://www.openmptcprouter.com/server/debian10-x86_64.sh | sh
    

    Результат успешной установки сервера.



    Сохраняем пароли, они потребуются нам для настройки клиентского роутера, и перезагружаемся. Важно иметь в виду, что после установки SSH будет доступен на порту 65222. После перезагрузки нужно убедиться, что мы загрузились с новым ядром

    uname -a 
    Linux test-server.local 4.19.67-mptcp
    

    Видим рядом с номером версии надпись mptcp, значит ядро установилось корректно.

    Настройка клиентского роутера


    На сайте проекта доступны готовые сборки для некоторых платформ, например Raspberry Pi, Banana Pi, роутеры Lynksys и виртуальные машины.
    Эта часть openmptcprouter основана на OpenWRT, в качестве интерфейса используется LuCI, знакомый всем, кто когда-либо сталкивался с OpenWRT. Дистрибутив весит около 50Мб!



    В качестве тестового стенда я буду использовать Raspberry Pi и несколько USB-модемов с разными операторами: МТС и Мегафон. Как записать образ на SD-карту, полагаю, не нужно рассказывать.

    Изначально Ethernet-порт в Raspberry Pi настроен как lan со статическим IP-адресом 192.168.100.1. Чтобы не возиться с проводами на столе, я подключил Raspberry Pi к WiFi точке доступа и задал на WiFi-адаптере компьютера статический адрес 192.168.100.2. DHCP-сервер по умолчанию не включен, поэтому нужно использовать статические адреса.

    Теперь можно зайти в веб-интерфейс 192.168.100.1

    При первом входе система попросит задать пароль root, с этим же паролем будет доступен SSH.


    В настройках LAN можно задать нужную подсеть и включить DHCP-сервер.

    Я использую модемы, которые определяются как USB Ethernet интерфейсы с отдельным DHCP-сервером, поэтому это потребовало установки дополнительных пакетов. Процедура идентична настройке модемов в обычном OpenWRT, поэтому я не буду рассматривать её здесь.

    Далее нужно настроить WAN-интерфейсы. Изначально в системе создано два виртуальных интерфейса WAN1 и WAN2. Им нужно назначить физическое устройство, в моем случае это имена интерфейсов USB-модемов.

    Чтобы не запутаться в именах интерфейсов, я советую смотреть сообщения dmesg, подключившись по SSH.

    Так как мои модемы сами выступают роутерами, и сами имеют DHCP-сервер, мне пришлось изменить настройки их внутренних диапазонов сетей и отключить DHCP-сервер, потому что изначально оба модема выдают адреса из одной сети, а это вызывает конфликт.

    OpenMPTCPRouter требует, чтобы адреса WAN-интерфейсов были статическими, поэтому придумываем модемам подсети и настраиваем в меню system → openmptcprouter → interface settings. Здесь же нужно указать IP-адрес и ключ сервера, полученный на этапе установки суммирующего сервера.



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



    По умолчанию используется режим shadowsocks + mptcp. Это такой прокси, который заворачивает в себя все подключения. Изначально он настроен обрабатывать только TCP, но можно включить и UDP.



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



    В этом случае можно использовать другой режим работы, без использования MPTCP, подробнее об этом здесь.

    Заключение


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

    VDSina.ru
    Серверы в Москве и Амстердаме

    Комментарии 17

      0
      Кроме Teradek есть еще вот такие ребята www.streambox.com/veta
      Только по сайту непонятно умеет ли оно настоящее суммирование или нет.
        0
        Кстати, Teradek больше не делает версии для сторонних USB модемов, теперь самая простая модель поставляется со своими модемами которые прикручиваются на винт. Выглядит намного лучше и модемы не болтаются в usb портах, а сидят надежно.

        image
        0
        Есть ли такой пакет в репозитории самого OpenWRT?
        Просто у меня довольно древний Netgear, не хотелось бы его менять или ставить доп.костыли на малинках.
          0

          Там целая куча модификаций, в том числе и ядра. Просто накатить на openwrt не получится. Для экспериментов можно запускать на локальной виртуальной машине. Оно также поддерживает Multi-link VPN (MLVPN) и Glorytun UDP с поддержкой нескольких каналов. Их можно вроде настроить на голом openwrt, но я не пробовал.

          0
          По опыту использования mwan3, могу сказать что балансировать весь трафик через двух и более провайдеров действительно неудобно: постоянно ломаются сессии, куки привязанные к IP и так далее. Я разделил аплинки по dst подсетям, в итоге весь гугл и youtube, потоковый контент, игры у меня через одного провайдера, а остальное через другого. Так же удобно заматчить по src ip всякие телевизоры в квартире, чтобы они ходили через одного провайдера. В итоге получается что основной канал всегда свободен.
            0
            MPTCP позволяет комбинировать каналы в пределах одного TCP-соединения, что решает проблему.
            +3
            Проект OpenMPTCPRouter неплохо подходит для домашнего использования и совсем не походит для коммерческого.
            Смотрите:
            1. Нет централизованного управления сетью. Только ручное управление с «вебморды»
            2. Неплохо работает в соединиях «точка-точка» и очень плохо в реальных условиях где нужен L3 туннель. В нем снижение скорости примерно на 40% по сравнению с соединением «точка-точка». Реализация L3 туннелей имеет особую специфику для применения с сотовой сетью и любые существующие VPN и прочие тунельные сервисы плохо подходят для организации канала через сотовую сеть.
            3. Glorytun на самом деле не передает UDP трафик, а просто заворачивает его в TCP, со всеми вытекающими.
            4. Работает не стабильно и не имеет систем диагностики и управления каналами.
            5. Не будет работать на коммерческом промышленном оборудовании (собрано только под бытовые одноплатники)

            Список можно продолжать, но как я уже сказал, это не критично для домашнего использования и совершенно неприемлемо для коммерческого.

            Поэтому мы сделали Qedr Summa :)
            image

            image
            Стендовые испытания
            www.youtube.com/watch?v=3vPFHz7jFGM&list=PLqaXZek4avdRAGJucVLITHyAMlnu2gk48

            Работает как то так
            image
            4 оператора, 16 модемов, 930 Мбит/с исходящий канал
              0
              1) Что вы подразумеваете под централизованным управлением сетью?
              Вебморда — ни что иное как способ изменения конфигурационного файла…
              4) Так это же опенсоурс, для диагностики дают возможность внести свою лепту любому. А вот про нестабильность можно поподробнее? Просто давно уже вижу посты про mptcp, в основном о реализации поддержки на уровне ядра, а тут прям — можно потрогать руками…
              5) Причем тут одноплатники и промышленное оборудование… Какая разница куда устанавливать? И там и там Ubuntu, Debian. Одноплатник просто стоит дешего, есть у многих, желающие могут — развернуть и потестить. Нужно промышленное исполнение — берем промышленный контроллер, ставим Debian, разворачиваем стенд… В чем проблема?
                –2
                4 оператора, 16 модемов… на нагруженной вышке где-нибудь в пределах цивилизации это довольно бесполезно, кмк. Расходы на покупку-поддержку вашей пепяки и абонентская плата ОпСоСам по идее сопоставима в среднесрочной перспективе со стоимостью прокладки оптики. А там, куда оптику тянуть нецелесообразно — плохо ловит мобильная связь.
                  +2
                  Эх, когда же вы сделаете b2c устройство для простых смертных?
                  +2
                  MPTCP не работает на виртуализации OpenVZ
                  Должна быть возможность установки собственного ядра Linux
                  Всё можно заставить работать даже в самых ущербных контейнерах, было бы желание.
                  В случае с MPTCP можно использовать User-Mode Linux (UML) или Linux Kernel Library (LKL).
                  Вот порты:
                  multipath-tcp.org/pmwiki.php/Users/UML
                  github.com/motomuman/lkl-mptcp
                    0
                    не проще взять KVM который в отличае от OVZ гарантирует ресурсы?
                      +3
                      KVM не гарантирует никакие ресурсы, это распространённое заблуждение. Нет гарантий ни по диску (можно всегда использовать LVM Thin Provisioning), ни по памяти (можно использовать baloon и аналоги), ни по CPU (он выделяется динамически, в зависимости от настроенных приоритетов).
                    0
                    условный сервер Twitch может принять от нас видеопоток только от одного source IP адреса, значит он должен быть у нас всегда постоянным, вне зависимости от того, какие провайдеры у нас отвалились, а какие работают
                    Я правильно понимаю, что в данном случае у нас оверхед, потому что стабильность соединения висит на одном провайдере — от суммирующего сервера до Twitch?
                      0
                      Извините, может не по теме, возник вопрос, а можно между двумя компами несколько гигабитных интерфейсов объединить в один? 10 гигабит наверно по USB 3.0 не светит, но хотя бы пару гигабит…
                        0

                        lacp

                        0
                        А как вы решали проблему с тем, что у модемов Huawei один mac адрес на все устройства?
                        Например первоначальная настройка проходит нормально, но после перезагрузки RPi модемы могут слететь со своих eth интерфейсов т.к. они светят одним и тем же mac адресом и привязка интерфейса к мак адресу не срабатывает.

                        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                        Самое читаемое