Реализация балансировки нагрузки на любом дистрибутиве Linux

Реализация балансировки нагрузки на любом дистрибутиве Linux

Я думаю о внедрении решения по балансировке нагрузки для личного использования.

Я хочу максимально увеличить пропускную способность данных через мобильные интернет-соединения. Позвольте мне прояснить:

У меня есть тарифный план на моем мобильном телефоне, и у моей семьи тоже есть соответствующие тарифные планы на их телефонах. Если я смогу подключить до 4 телефонов к одному (настольному) ПК (предпочтительно через USB), то я получу (теоретически) более быстрое подключение к Интернету, чем любой из 4 телефонов (если я подключу их к ПК).

Затем этот настольный компьютер будет выполнять функции маршрутизатора для интрасети.

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

Я видел, что инструмент для этой работы есть ipvs(верно?), но не видел, как это сделать.

С точки зрения дистрибутивов, эту работу можно выполнить в любом дистрибутиве, но я знаю, что подключение телефона Android к Ubuntu работает по принципу plug and play. Так что если я смогу сделать это в Ubuntu, это, вероятно, будет быстрее, чем компилировать все из strach.

Есть ли относительное как? Возможно, есть дистрибутив, который балансирует нагрузку и определяет USB-подключения к Интернету на лету?

решение1

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

Исходная iptablesнастройка — это

  • Создайте таблицу маршрутизации для каждого соединения.

    ip rule add fwmark 10 table PHONE0 prio 33000
    ip rule add fwmark 11 table PHONE1 prio 33000
    ip rule add fwmark 12 table PHONE2 prio 33000
    ip rule add fwmark 13 table PHONE3 prio 33000
    
  • Добавьте шлюз по умолчанию для каждого соединения в каждую таблицу (IP-адрес шлюза будет отличаться в зависимости от провайдера/настройки каждого телефона)

    ip route add default via 192.168.1.2 table PHONE0 
    ip route add default via 192.168.9.1 table PHONE1 
    ip route add default via 192.168.13.2 table PHONE2 
    ip route add default via 192.168.7.9 table PHONE3 
    
  • Случайным образом пометить любые неотмеченные потоки, которые будут направлять поток через определенное соединение. OUTPUTиспользуется для локальных процессов. Используйте PREROUTING, если вы перенаправляете трафик для других клиентов)

    iptables -t mangle -A OUTPUT -j CONNMARK --restore-mark
    iptables -t mangle -A OUTPUT -m mark ! --mark 0 -j ACCEPT
    iptables -t mangle -A OUTPUT -j MARK --set-mark 10
    iptables -t mangle -A OUTPUT -m statistic --mode random --probability 0.25 -j MARK --set-mark 11
    iptables -t mangle -A OUTPUT -m statistic --mode random --probability 0.25 -j MARK --set-mark 12
    iptables -t mangle -A OUTPUT -m statistic --mode random --probability 0.25 -j MARK --set-mark 13
    iptables -t mangle -A OUTPUT -j CONNMARK --save-mark
    
  • NAT для каждого из подключений (интерфейс должен быть таким, как ваше телефонное соединение отображается в системе)

    iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
    iptables -t nat -A POSTROUTING -o ppp1 -j MASQUERADE
    iptables -t nat -A POSTROUTING -o ppp2 -j MASQUERADE
    iptables -t nat -A POSTROUTING -o ppp3 -j MASQUERADE
    

Обратите внимание, что одно TCP или UDP соединение не увидит ускорения, поскольку оно все еще будет проходить по одному каналу. Вам придется использовать несколько одновременных подключений (не менее 4), чтобы использовать дополнительную пропускную способность. Большинство браузеров делают это скрытно при запросе нескольких объектов. Некоторые менеджеры загрузок позволяют использовать несколько подключений для одного файла.

Как предлагает garethTheRed, ispunityдобавляет немного "клея" поверх этой iptablesнастройки для циклического перебора списка соединений, проверки того, что шлюз отвечает, повторной балансировки, если что-то не так и т. д. Его управление "липкими сеансами" выглядит как дополнительная настройка на порт поверх его базовой балансировки нагрузки "round robin" соединений. Другое решение -Чистый баланс ISP, скрипт и библиотека Perl, которые автоматизируют настройку iptables и таблиц маршрутизации, отслеживают состояние интернет-провайдера, предупреждают о проблемах и перенастраивают маршрутизацию в случае, если один или несколько интернет-провайдеров становятся недоступными.

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

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

решение2

Это может быть возможно - ispunityэто проект, который балансирует нагрузку вашего интернет-соединения. Он написан на Ruby. Они запустили его на Raspberry Pi., поэтому он должен работать на любом разумном дистрибутиве.

Единственное различие между их и вашим сценарием заключается в том, что они использовали Ethernet, тогда как вы предлагаете использовать 3G. Я полагаю, что большая часть вашего успеха (или неудачи) зависит от того, как ваши 4 мобильных телефона представляют свой Интернет на USB.

Поскольку Rasberry Pi обычно работает под управлением одной из версий Debian, то, возможно, стоит начать с нее или Ubuntu.

решение3

диспетчер-прокси
Используя dispatch-proxy, можно объединить множество сетей Wi-Fi/Ethernet/3G/4G-подключений и получить к ним доступ как к одному большому, высокоскоростному, сбалансированному по нагрузке соединению. Обратите внимание, что для использования более высокой скорости соединения пользователь должен использовать потоковый менеджер загрузок, который откроет несколько подключений к dispatch-proxy, и он будет эффективно извлекать их с помощью нескольких интерфейсов, что приведет к объединенным, более быстрым скоростям загрузки.
инструкция по установкедля Mac, также работает для Linux.

единство интернет-провайдера
ISPUnity — это многопользовательская балансировка нагрузки и отказоустойчивость на основе программного обеспечения RubyGem с открытым исходным кодом.

Для мобильного интернета я рекомендую dispatch-proxyне настраивать никаких параметров, как в ISP Unity. этотссылка комментарий о пропатченном ядре Linux для встроенной балансировки нагрузки, вы можете взглянуть.

Связанный контент