
Я думаю о внедрении решения по балансировке нагрузки для личного использования.
Я хочу максимально увеличить пропускную способность данных через мобильные интернет-соединения. Позвольте мне прояснить:
У меня есть тарифный план на моем мобильном телефоне, и у моей семьи тоже есть соответствующие тарифные планы на их телефонах. Если я смогу подключить до 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 для встроенной балансировки нагрузки, вы можете взглянуть.