Как объединить несколько интернет-соединений в одно?

23

На моем ПК установлено 4 сетевых карты, 2 проводные сетевые карты Gigabit Ethernet, а также 2 беспроводные сетевые карты. (Один Broadcom с проприетарными драйверами и Ralink с открытым программным обеспечением, который работает намного лучше, чем Broadcom.)

Мой мобильный телефон может использовать беспроводное соединение с моим ПК, но у меня также есть проводное подключение к Интернету. Поэтому у меня есть несколько подключений к Интернету для доступа в Интернет. Как я могу объединить 2 или более соединений вместе и сбалансировать их, чтобы получить единый опыт работы в Интернете, который представляет собой сумму всех подключенных к нему подключений к Интернету.

Например, если у меня есть модем с подключением к Интернету со скоростью 1024 кБ / с, а другой - с 512 кБ / с, и один небольшой, предлагающий 128 кБ / с, после балансировки нагрузки и объединения всех подключений (соединения или объединения), я могу загрузить на скорость 1664 кБ / с, используя все 3 интернет-соединения, например, как одно.

Этот вопрос всегда интересовал меня.

Луис Альварадо
источник
5
Кажется, это выходит за рамки Ask Ubuntu :) Это довольно сложный сетевой материал. ИМО это редко стоит, к тому времени, когда вы принимаете во внимание потерянные пакеты из-за неактивности канала (даже временно), переупорядочения пакетов из-за того, что некоторые ссылки медленнее других, и тому подобное. Я не знаю решения «черного ящика», которое могло бы сделать это, могло бы быть интересным проектом.
Цезий
9
Вопрос в том, можно ли это сделать в Ubuntu, и если да, то как.
Луис Альварадо
Я создал ответ в двух интернет-соединениях на одном посте ПК . Связывание документов для связывания в Ubuntu.
Лусио
@Lucio Я могу пометить вопрос как дубликат, или вы можете переместить свой ответ сюда, и я могу пометить его как принятый. Вам также нужно быть готовым к выходу 13.04, поскольку он включит в Network Manager опции связывания (прямо сейчас только проводные связывающие ведомые).
Луис Альварадо

Ответы:

11

Я делаю что-то подобное на работе, используя Ubuntu 11.04. Мы используем инструмент настройки брандмауэра Shorewall, который, помимо того, что отлично справляется со своей работой, предоставляет несколько элементарных инструментов маршрутизации для нескольких интернет-провайдеров, которые могут соответствовать вашим потребностям. Вы можете найти некоторые документы об этом здесь: http://www.shorewall.net/MultiISP.html

Однако все сводится к тому, что вы не можете использовать несколько интернет-провайдеров для одного соединения ... все не так просто. Лучшее, что вы можете сделать, это попытаться направить новые соединения равномерно между различными поставщиками.

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

trognanders
источник
Хорошая ссылка. Очень хороший учебник.
Луис Альварадо
Пусть Смотри также это: debuntu.org/2006/02/23/...
Postadelmaga
8

Вы можете сделать это, используя пакет, ifenslaveкоторый присоединяет и отсоединяет подчиненные сетевые интерфейсы к соединяющему устройству.

  1. Установка:

    sudo apt-get install ifenslave
    
  2. Загрузить модуль ядра

    sudo modprobe bondingle
    
  3. Настройте свои интерфейсы:

    sudo vi /etc/network/interfaces
    

    Пример конфигурации, чтобы объединить eth0 и eth1 в качестве подчиненных для вашего интерфейса соединения:

    #eth0 is manually configured, and slave to the "bond0" bonded NIC
    auto eth0
    iface eth0 inet manual
    bond-master bond0
    
    #eth1 ditto, thus creating a 2-link bond.
    auto eth1
    iface eth1 inet manual
    bond-master bond0
    
    # bond0 is the bonded NIC and can be used like any other normal NIC.
    # bond0 is configured using static network information.
    auto bond0
    iface bond0 inet static
    address 192.168.1.10
    gateway 192.168.1.1
    netmask 255.255.255.0
    # bond0 uses standard IEEE 802.3ad LACP bonding protocol 
    bond-mode 802.3ad
    bond-miimon 100
    bond-lacp-rate 1
    bond-slaves none
    
  4. Перезагрузите сеть:

    sudo restart networking
    
  5. Подведение вверх / вниз ограниченного интерфейса:

    ifup bond0
    ifdown bond0
    

    В качестве примера мы используем несколько режимов склеивания:

    bond-mode active-backup
    

    Описание режима активного резервного копирования :

    Политика активного резервного копирования: только один ведомый в соединении активен. Другой ведомый становится активным, если и только если активный ведомый отказывает. MAC-адрес связи виден снаружи только на одном порту (сетевой адаптер), чтобы не перепутать коммутатор. Этот режим обеспечивает отказоустойчивость. Основная опция влияет на поведение этого режима.

    Источник и дополнительная информация в сообществе Ubuntu помогают вики .

Связывание означает объединение нескольких сетевых интерфейсов (NIC) в один канал, обеспечивая высокую доступность, балансировку нагрузки, максимальную пропускную способность или их комбинацию. Источник

pl1nk
источник
+1 потому что это одна из причин моего вопроса. Будет по-прежнему ждать способа создания виртуального главного подключения к сети, которое является суммой всех подчиненных (реальных) подключений. Что-то вроде склеивания в последней версии ядра.
Луис Альварадо
2
-1 - соединение работает в локальных сетях, так как оно работает на уровне 2. Вопрос о балансировке нагрузки двух независимых глобальных .
gertvdijk
@gertvdijk Я не согласен, проверьте мой обновленный ответ, чтобы узнать, что связывание также балансирует нагрузку.
pl1nk
1
@ pl1nk Это балансировка нагрузки уровня 2 для двух сетевых карт в одной сети L2. Это не то же самое, что балансировка нагрузки нескольких интернет-провайдеров!
gertvdijk
3
@ pl1nk Мой последний комментарий. Вопрос, конечно, касается нескольких независимых широкополосных соединений. Хотя они могут быть одним провайдером, это не меняет неспособность справиться с этим на уровне 2.
gertvdijk
6

Это немного старый вопрос, но если вы все еще хотите знать ..

Есть 2 типичных сценария, о которых gertvdijk и pl1nk спорили в одном из ответов:

У вас есть компьютер с 2 общедоступными IP-адресами (2 разных интернет-провайдера), и вы подключаетесь к другому хосту (например, к серверу в центре обработки данных с толстой линией, которая превышает суммарную пропускную способность обоих подключений ISP вашего компьютера). Таким образом, вы устанавливаете соединение с хостом через 2 соединения, а затем хост (сервер) обслуживает ваш трафик через свое собственное интернет-соединение. В этом сценарии вы можете получить почти 100% объединенной пропускной способности в обоих направлениях для одного соединения.

Это частный случай объединения / объединения / объединения, когда несколько интерфейсов уровня 2 (одной сети) объединены. Этого можно достичь, установив соединения VPN уровня 2 (отвод) на каждом интерфейсе интернет-провайдера от компьютера к хосту и связав их вместе (режим циклического перебора), чтобы иметь один интерфейс. Ограничивающим фактором в этом сценарии является то, насколько различаются задержки (ping) при каждом подключении ISP к хосту. Чем они похожее и стабильнее, тем лучше. Мы используем его в одной из наших установок, он работает хорошо. Если вы хотите узнать подробности о том, как это реализовать, просто дайте мне знать.

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

Вы не достигнете такого высокого суммарного использования полосы пропускания для одного компьютера, как в первом сценарии, но для небольшого офиса это может быть хорошим решением. Чтобы немного его расширить, вы можете реализовать собственные решения для конкретных протоколов. Например, вы можете иметь своего рода прокси на шлюзе (который может быть одним и тем же компьютером) для загрузки http и запрашивать разные части огромного файла, устанавливая разные сеансы TCP через разные интерфейсы ISP. В этом случае результирующая скорость загрузки будет около 100% от объединенной полосы пропускания. Это как разгрузка на шлюз, что делают ReGet, GetRight и подобные загрузчики. Google 'HTTP 206 Частичное содержимое'. Я не знаю никаких готовых решений с открытым исходным кодом для этого сценария, но есть аппаратные устройства, которые делают именно это: google '

Anatoli
источник
Вот Это Да! Первая часть вашего ответа именно то, что я ищу. У меня есть сервер в облаке с Ubuntu и очень быстрое соединение. И единственное подключение к Интернету, которое я могу иметь здесь, это 300kbps с ограниченным 3G. Можете ли вы дать больше информации о том, как выполнить первую часть вашего ответа, чтобы я мог купить много 3G-ключей и планирует улучшить скорость моего соединения?
Хуафу
2
echo "bonding" >> /etc/modules echo -e "alias bond* bonding\noptions bonding max_bonds=10 mode=2 xmit_hash_policy=layer3+4 arp_interval=100 arp_ip_target=10.0.0.1" > /etc/modprobe.d/bonding.conf
Анатолий
1
И поработите все ответвления iface для этой связи: echo "+tapX " >> /sys/class/net/bond0/bonding/slaves проверьте ее состояние с помощью: cat /proc/net/bonding/bond0 На этом этапе весь интернет-трафик должен проходить через bond0 к серверу в центре обработки данных. Там вы должны установить маршрутизацию: echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf sysctl -p /etc/sysctl.conf iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE (eth0 должен быть интернетом iface)
Анатолий
1
Эта конфигурация соединения (mode = 2 xmit_hash_policy = layer3 + 4) заставит каждое новое соединение проходить через различные базовые виртуальные каналы VPN на основе хеш-кода (рассчитанного по IP-адресам и портам, участвующим в соединении) модом iface. Больше информации: kernel.org/doc/Documentation/networking/bonding.txt . Это на самом деле больше похоже на второе решение из моего ответа, потому что вам нужны очень похожие (с очень низким джиттером и одинаковой пропускной способностью) базовые соединения для циклического соединения для правильной работы (в противном случае вы получаете много переупорядочения пакетов), и вы говорите что ваши подключения 3G.
Анатолий
1
@Huafu, чтобы иметь первое решение, вам просто нужно изменить параметры соединения вместо mode=2 xmit_hash_policy=layer3+4указания y mode=0(см. Ссылку @ kernel.org), но сначала проверьте, насколько похожи ссылки через 3G. Если время их пинга отличается более чем на 2-3 мс, или дрожание превышает 1 мс, у вас будет много переупорядочений пакетов, что эффективно снизит скорость агрегированного канала. Вам нужно проверить статистику агрегированных ссылок с помощью netstat -s(ищите повторные передачи) и iperf -s/ iperf -c <server_ip> -d. Сначала проверьте производительность каждой ссылки, затем мы можем продолжить с решением
Анатолий
0

я столкнулся с подобной проблемой .. и меня очень заинтересовал подход к решению по первому сценарию г-на. GTH и Анатолий, я очень прошу вас выложить основные конфигурации и скрипты, если это возможно, чтобы протестировать конфигурацию, описанную в первом сценарии.

Теперь я настроил соединения VPN через различных провайдеров ISP, используя комбинированные интерфейсы Tun / Tap (это не связывание, что объясняется в ответе № 8) с помощью этой утилиты:

Net-ISP-Баланс Линкольн Д. Штейн

Распределите нагрузку на ваше интернет-соединение между двумя или более интернет-провайдерами для повышения пропускной способности и надежности.

Домашняя страница проекта: https://lstein.github.io/Net-ISP-Balance/

Этот пакет позволяет балансировать нагрузку на домашнее или малое подключение к Интернету через двух или более интернет-провайдеров. Вы можете использовать его с одним хостом, подключенным к двум Интернет-провайдерам, или на компьютере с маршрутизатором / брандмауэром для балансировки нагрузки всей вашей локальной сети. Сетевой трафик балансируется между обоими соединениями с провайдером для увеличения емкости загрузки и выгрузки, и в случае сбоя одного провайдера другие интернет-провайдеры переходят автоматически.

Пропускная способность распределяется на уровне соединения. Это означает, что вы не увидите агрегированную полосу пропускания в каком-либо конкретном тесте загрузки или скорости, но вы увидите преимущества, когда одновременно происходит несколько передач данных, например, когда несколько человек в вашей семье транслируют фильмы. Кроме того, протоколы передачи файлов с несколькими подключениями, такие как BitTorrent, увидят преимущества балансировки нагрузки.

Это утилита на основе Perl для управления маршрутизацией и iptables в Linux, идеально подходящая для наших целей, фактически сначала создает таблицу маршрутизации для всех провайдеров, а затем равномерно распределяет весь трафик локальной сети между провайдерами, чтобы понять, как работает утилита, предложить рассмотреть небольшой пример (тестовая конфигурация) для 3 isp + 1 lan

 #cat /etc/network/balance.conf
 ##service    device   role     ping-ip           
 CABLE3       enp0s3   isp      10.0.2.2
 CABLE8       enp0s8   isp      10.0.3.2
 CABLE9       enp0s9   isp      10.0.4.2
 LAN          enp0s10  lan                        

 #cat /etc/network/interfaces
auto enp0s3
allow-hotplug enp0s3
iface enp0s3 inet dhcp

auto enp0s8
allow-hotplug enp0s8
iface enp0s8 inet dhcp

auto enp0s9
allow-hotplug enp0s9
iface enp0s9 inet dhcp

auto enp0s10
allow-hotplug enp0s10
iface enp0s10 inet static
    address 192.168.1.1/24

#Now work Net-ISP-Balance utility:

## Including rules from /etc/network/balance/pre-run/pre-run-script.pl ##
## Finished /etc/network/balance/pre-run/pre-run-script.pl ##
echo 0 > /proc/sys/net/ipv4/ip_forward
ip route flush all
ip rule flush
ip rule add from all lookup main pref 32766
ip rule add from all lookup default pref 32767
ip route flush table  2
ip route flush table  1
ip route flush table  3
ip route add  10.0.2.0/24 dev enp0s3 src 10.0.2.15
ip route add  10.0.3.0/24 dev enp0s8 src 10.0.3.15
ip route add  10.0.4.0/24 dev enp0s9 src 10.0.4.15
ip route add  0.0.0.0/0 dev enp0s10 src 
ip route add default scope global nexthop via 10.0.4.2 dev enp0s9 weight 1 nexthop via 10.0.3.2 dev enp0s8 weight 1 nexthop via 10.0.2.2 dev enp0s3 weight 1
ip route add table 2 default dev enp0s3 via 10.0.2.2
ip route add table 2 10.0.2.0/24 dev enp0s3 src 10.0.2.15
ip route add table 2 10.0.3.0/24 dev enp0s8 src 10.0.3.15
ip route add table 2 10.0.4.0/24 dev enp0s9 src 10.0.4.15
ip route add table 2 0.0.0.0/0 dev enp0s10 src 
ip rule add from 10.0.2.15 table 2
ip rule add fwmark 2 table 2
ip route add table 1 default dev enp0s8 via 10.0.3.2
ip route add table 1 10.0.2.0/24 dev enp0s3 src 10.0.2.15
ip route add table 1 10.0.3.0/24 dev enp0s8 src 10.0.3.15
ip route add table 1 10.0.4.0/24 dev enp0s9 src 10.0.4.15
ip route add table 1 0.0.0.0/0 dev enp0s10 src 
ip rule add from 10.0.3.15 table 1
ip rule add fwmark 1 table 1
ip route add table 3 default dev enp0s9 via 10.0.4.2
ip route add table 3 10.0.2.0/24 dev enp0s3 src 10.0.2.15
ip route add table 3 10.0.3.0/24 dev enp0s8 src 10.0.3.15
ip route add table 3 10.0.4.0/24 dev enp0s9 src 10.0.4.15
ip route add table 3 0.0.0.0/0 dev enp0s10 src 
ip rule add from 10.0.4.15 table 3
ip rule add fwmark 3 table 3
## Including rules from /etc/network/balance/routes/01.local_routes ##
# enter any routing commands you might want to go in
# for example:
# ip route add 192.168.100.1 dev eth0 src 198.162.1.14

## Finished /etc/network/balance/routes/01.local_routes ##
## Including rules from /etc/network/balance/routes/02.local_routes.pl ##
## Finished /etc/network/balance/routes/02.local_routes.pl ##
iptables -F
iptables -t nat    -F
iptables -t mangle -F
iptables -X
iptables -P INPUT    DROP
iptables -P OUTPUT   DROP
iptables -P FORWARD  DROP

iptables -N DROPGEN
iptables -A DROPGEN -j LOG -m limit --limit 1/minute --log-level 4 --log-prefix "GENERAL: "
iptables -A DROPGEN -j DROP

iptables -N DROPINVAL
iptables -A DROPINVAL -j LOG -m limit --limit 1/minute --log-level 4 --log-prefix "INVALID: "
iptables -A DROPINVAL -j DROP

iptables -N DROPPERM
iptables -A DROPPERM -j LOG -m limit --limit 1/minute --log-level 4 --log-prefix "ACCESS-DENIED: "
iptables -A DROPPERM -j DROP

iptables -N DROPSPOOF
iptables -A DROPSPOOF -j LOG -m limit --limit 1/minute --log-level 4 --log-prefix "DROP-SPOOF: "
iptables -A DROPSPOOF -j DROP

iptables -N DROPFLOOD
iptables -A DROPFLOOD -m limit --limit 1/minute  -j LOG --log-level 4 --log-prefix "DROP-FLOOD: "
iptables -A DROPFLOOD -j DROP

iptables -N DEBUG
iptables -A DEBUG  -j LOG --log-level 3 --log-prefix "DEBUG: "
iptables -t mangle -N MARK-CABLE3
iptables -t mangle -A MARK-CABLE3 -j MARK     --set-mark 2
iptables -t mangle -A MARK-CABLE3 -j CONNMARK --save-mark
iptables -t mangle -N MARK-CABLE8
iptables -t mangle -A MARK-CABLE8 -j MARK     --set-mark 1
iptables -t mangle -A MARK-CABLE8 -j CONNMARK --save-mark
iptables -t mangle -N MARK-CABLE9
iptables -t mangle -A MARK-CABLE9 -j MARK     --set-mark 3
iptables -t mangle -A MARK-CABLE9 -j CONNMARK --save-mark
iptables -t mangle -A PREROUTING -i enp0s10 -m conntrack --ctstate NEW -m statistic --mode random --probability 1 -j MARK-CABLE9
iptables -t mangle -A PREROUTING -i enp0s10 -m conntrack --ctstate NEW -m statistic --mode random --probability 0.5 -j MARK-CABLE8
iptables -t mangle -A PREROUTING -i enp0s10 -m conntrack --ctstate NEW -m statistic --mode random --probability 0.333333333333333 -j MARK-CABLE3
iptables -t mangle -A PREROUTING -i enp0s10 -m conntrack --ctstate ESTABLISHED,RELATED -j CONNMARK --restore-mark
iptables -t mangle -A PREROUTING -i enp0s3 -m conntrack --ctstate NEW -j MARK-CABLE3
iptables -t mangle -A PREROUTING -i enp0s3 -m conntrack --ctstate ESTABLISHED,RELATED -j CONNMARK --restore-mark
iptables -t mangle -A PREROUTING -i enp0s8 -m conntrack --ctstate NEW -j MARK-CABLE8
iptables -t mangle -A PREROUTING -i enp0s8 -m conntrack --ctstate ESTABLISHED,RELATED -j CONNMARK --restore-mark
iptables -t mangle -A PREROUTING -i enp0s9 -m conntrack --ctstate NEW -j MARK-CABLE9
iptables -t mangle -A PREROUTING -i enp0s9 -m conntrack --ctstate ESTABLISHED,RELATED -j CONNMARK --restore-mark
iptables -A INPUT  -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A INPUT -d 127.0.0.0/8 -j DROPPERM
iptables -A INPUT   -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT   -p tcp --tcp-flags SYN,ACK ACK -j ACCEPT
iptables -A FORWARD -p tcp --tcp-flags SYN,ACK ACK -j ACCEPT
iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -j DROPFLOOD
iptables -A INPUT   -i enp0s10 -s 0.0.0.0/0 -j ACCEPT
iptables -A OUTPUT  -o enp0s10 -d 0.0.0.0/0  -j ACCEPT
iptables -A OUTPUT  -o enp0s10 -d 255.255.255.255/32  -j ACCEPT
iptables -A OUTPUT  -p udp -s 0.0.0.0/0 -j ACCEPT
iptables -A FORWARD  -i enp0s10 -o enp0s3 -s 0.0.0.0/0 ! -d 0.0.0.0/0 -j ACCEPT
iptables -A OUTPUT   -o enp0s3                 ! -d 0.0.0.0/0 -j ACCEPT
iptables -A FORWARD  -i enp0s10 -o enp0s8 -s 0.0.0.0/0 ! -d 0.0.0.0/0 -j ACCEPT
iptables -A OUTPUT   -o enp0s8                 ! -d 0.0.0.0/0 -j ACCEPT
iptables -A FORWARD  -i enp0s10 -o enp0s9 -s 0.0.0.0/0 ! -d 0.0.0.0/0 -j ACCEPT
iptables -A OUTPUT   -o enp0s9                 ! -d 0.0.0.0/0 -j ACCEPT
iptables -A OUTPUT  -j DROPSPOOF
iptables -t nat -A POSTROUTING -o enp0s3 -j MASQUERADE
iptables -t nat -A POSTROUTING -o enp0s8 -j MASQUERADE
iptables -t nat -A POSTROUTING -o enp0s9 -j MASQUERADE
## Including rules from /etc/network/balance/firewall/01.accept ##
## This file contains iptables statements that add additional firewall rules

# allow incoming domain packets -- needed for DNS resolution
iptables -A INPUT   -p udp --source-port domain -j ACCEPT
# allow incoming NTP packets -- needed for net time protocol
iptables -A INPUT   -p udp --source-port ntp -j ACCEPT
## Finished /etc/network/balance/firewall/01.accept ##
## Including rules from /etc/network/balance/firewall/01.accept.pl ##
iptables -A INPUT -p tcp -s 0.0.0.0/0 --syn --dport ssh -j ACCEPT
## Finished /etc/network/balance/firewall/01.accept.pl ##
## Including rules from /etc/network/balance/firewall/02.forward.pl ##
iptables -A FORWARD -p udp --source-port domain -d 0.0.0.0/0 -j ACCEPT
iptables -A FORWARD -p udp --source-port ntp    -d 0.0.0.0/0 -j ACCEPT
## Finished /etc/network/balance/firewall/02.forward.pl ##
echo 1 > /proc/sys/net/ipv4/ip_forward
## Including rules from /etc/network/balance/post-run/post-run-script.pl ##
## Finished /etc/network/balance/post-run/post-run-script.pl ##
Itz
источник
Пожалуйста, рассмотрите возможность удаления этого ответа и добавления комментария, запрашивающего дополнительные пояснения к соответствующему ответу. Это не ответ. Спасибо.
Раффа