Содержание статьи
Решение из учебника
Задача «обеспечить стабильную связь где‑то за городом» с началом дачного сезона актуальна как никогда. Представим, что у нас есть только несколько симок и инженерная смекалка.
Сразу напрашивается решение — подключить несколько модемов с разными симками и балансировать подключения по ним. Наружу торчит один интерфейс, на котором принимаются пакеты, а затем они отправляются в сеть через выбранный модем в зависимости от принадлежности к конкретному соединению (чтобы пакеты одного соединения не уходили через разные модемы). Балансировать соединения по модемам можно по round robin, по наименьшему числу соединений или даже просто случайно — большого значения это не имеет.
В целом такое решение возможно, и оно даже будет как‑то работать. Но полностью использовать всю пропускную способность при таком подключении выйдет разве что по протоколу BitTorrent (который сам по себе заблокирован у многих мобильных операторов), который держит одновременно много соединений и гарантированно хоть по одному соединению попадет на каждый из модемов.
Нормальные TCP-соединения при нестабильном приеме сигнала от разных операторов будут напоминать известную игру про револьвер с неполным барабаном, где никогда заранее не знаешь, уйдет пакет или выпавший соединению модем лежит. В результате если один модем работает нормально, а другой тупит — часть соединений будет летать, а другая, менее удачливая часть грузить в час по чайной ложке. Ну и при обрыве связи некоторые соединения порвутся, а другие — нет.
Проблему с обрывом части соединений обычно пытаются лечить установкой туннеля и пропусканием всего трафика через него. Тогда туннель, когда связь прервется, будет переустанавливать соединение через другой модем, а идущий внутри трафик ничего не заметит. С этим возникает другая проблема: максимальная скорость такого комбинированного канала будет чуть меньше скорости того модема, на который он выпал прямо сейчас, а второй модем будет вообще проигнорирован.
Для простейшей балансировки соединений на самых популярных роутерах даже не нужно ничего изобретать: почти все они из коробки поддерживают функции вроде Dual WAN или load balancing.
Dual WAN и ее разновидности (WAN failover в D-Link, Allow failback в Asus, Link backup в TP-Link и прочие) — самый примитивный и дубовый вариант: он отслеживает доступность интернета через главный канал и переключается на резервный при ошибке основного. Ни о каком одновременном использовании тут речи не идет, а пока основной линк хоть сколько‑нибудь работоспособен — резервный не будет использоваться, даже если он работает идеально, в отличие от основного. Как понятно из названия функции, это нужно как аварийное решение на случай внезапной аварии основного оператора, а не для постоянной ловли лучшего качества связи.
Load balancing пытается раскидывать соединения по нескольким аплинкам сразу, но более‑менее жизнеспособно оно только на MikroTik (настройка которого для рядового юзера сильно за границами зоны комфорта), а на остальных потребительских железках ее использовать не стоит даже пытаться из‑за откровенно плохой работы. Хотя на бумаге звучит почти хорошо.
Load balancing на MikroTik
Если ты все же решишь сделать балансировку соединений на MikroTik, нужно использовать PCC (per connection classifier). Это такая хеш‑функция, которая гарантирует попадание всех пакетов из одного потока по одному и тому же маршруту. Для настройки задай роутеру адреса в подсетях каждого используемого оператора, создай маршруты к 0. с разным distance, включи Check и задай правила файрвола для таблицы mangle:
Rule 1 - Mark Connection provider 1:
Chain: prerouting
In. Interface: <LAN>
Connection Mark: no-mark
New Conn. Mark: ISP1-Conn
Per Connection Classifier: both-addresses:2/0
Passthrough: Yes
Rule 2 - Mark Connection provider 2:
Chain: prerouting
In. Interface: <LAN>
Connection Mark: no-mark
New Conn. Mark: ISP2-Conn
Per Connection Classifier: both-addresses:2/1
Passthrough: Yes
Rule 3 - Mark Routing provider 1:
Chain: prerouting
Connection Mark: ISP1-Conn
New Routing Mark: via-ISP1
Passthrough: No
Rule 4 - Mark Routing provider 2:
Chain: prerouting
Connection Mark: ISP2-Conn
New Routing Mark: via-ISP2
Passthrough: No
Пример выше — для балансировки 50/50. Чтобы разделить в другом соотношении, надо добавить несколько правил. Для этого пропиши классификаторы вроде both-addresses: и both-addresses: на ISP1 и both-addresses: на ISP2, чтобы два из трех соединений выбирались на первого провайдера, а один из трех — на второго.

После этого надо создать несколько таблиц маршрутизации (по одной на каждого оператора), в каждой из которых создать маршрут к 0. через соответствующий шлюз (например, 0. в таблице via-ISP2).
Естественно, для защиты от разрыва долгоживущих TCP-соединений таким методом придется обернуть весь трафик в туннель, чтобы при переподключении туннеля соединения внутри не обрывались. Но настройка таких туннелей уж точно выходит за рамки этой статьи, тем более что сейчас такие решения известны как никогда широко.
Всё везде и сразу
Описанное выше решение справится с проблемой обрыва случайных соединений, но не поможет действительно просуммировать линки. При нестабильной работе сети (например, при движении в машине), да и в остальных случаях тоже, лучше бы по‑настоящему суммировать полную пропускную способность соединения.
Для этого существует протокол Multipath TCP, который пускает пакеты одного TCP-соединения разными маршрутами в сети. Поскольку поддерживается он очень мало где, будет нужен промежуточный сервер, который собирает из таких разномаршрутных пакетов классический TCP-поток и отправляет к точке назначения.
Продолжение доступно только участникам
Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».
Присоединяйся к сообществу «Xakep.ru»!
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
