Объединение интерфейсов

Зачастую в большой локальной сети необходимо для сервера увеличить пропускную способность и повысить отказоустойчивость. Это полезно так же для кластеров, ведь канал передачи данных зависит от количества сетевых интерфейсов умноженных на ширину их канала. Таким образом можно получить 0.1 и 100 Gbit/s канал (в зависимости от технологий связи и ширины каждого канала).

Суть идеи состоит в том, что все сетевые объединяются в “ствол” и на выходе видно только один интерфейс - bond, с одной конфигурацией и ip.

Вот пример:
У нас 3 сетевых карты. Каждой присвоен свой ip через dhcp:
/etc/conf.d/net

#Следующие три строки обязательны, иначе bond может не запуститься
modules_eth0=( "!plug" )
modules_eth1=( "!plug" )
modules_eth2=( "dhcp" )
#Можно и статичные ip присвоить, но не будем сейчас усложнять задачу
config_eth0=( "dhcp" )
config_eth1=( "dhcp" )
config_eth2=( "dhcp" )

Но каждый из этих интерфейсов обменивается данными только если идёт запрос на конкретный ip, в крайнем случае используется самый первый.

Для начала, необходимо проверить/установить пакет ifenslave

#emerge -av ifenslave

После установки (если она требовалась) нужно добавить модуль в ядро и создать дополнительный интерфейс в /etc/init.d/, который назовём bond0:

#modprobe bonding
//Ошибок возникнуть не должно, в противном случае попробуйте переустановить ifenslave
#ln /etc/init.d/net.{lo,bond0}
//Раньше ссылку делали на eth0, но позже стали менять на lo, так как это всё же правильнее.

Теперь осталось только лишь настроить сам интерфейс и указать зависимости:
/etc/conf.d/net

#Старую конфигурацию не трогаем, так там всё правильно, добавляем новые строки.
#Вписываем интерфейсы, которые надо собрать
slaves_bond0="eth0 eth1 eth2"
#Настраиваем bond0, допустим через dhcp, но вы можете всё прописать сами
config_bond0=( "dhcp" )
#и указываем зависимости, т.к. им надо ещё запуститься! :)
depend_bond0() {
need net.eth0 net.eth1 net.eth2
}

По умолчанию, bond0 будет иметь такой же MAC, как и у eth0.
Собственно осталось только заставить всё это работать.

//Не знаю кому как, а мне удобнее добавлять его в level "boot"
#rc-update add net.bond0 boot
#rc-update del net.eth0 default
#rc-update del net.eth1 default
#rc-update del net.eth2 default
#/etc/init.d/net.bond0 start

Если всё заработало без ошибок, значит всё настроено правильно и при условии, что у наших карт была пропускная способность в 1 Gbit/s, то мы получили канал в 3 Gbit/s.
В случае отказа одного из интерфейсов это скажется пожалуй только на скорости передачи, но сеть будет по прежнему работать.

P.S.: Если найдёте ошибки, пишите - подправлю. :slight_smile:

А можно ли это заюзать для интернета, объеденив 2 и более провайдеров?

А можно ли это заюзать для интернета, объеденив 2 и более провайдеров?

Всё упирается в тот факт, что у этого интерфейса будет один ip… Этот вариант скорее подходит, если Вы сами провайдер. :slight_smile:

Впрочем есть вариант: не настраивать ip для интерфейса (" config_bond0=( “null” ) ") и попробовать указать несколько шлюзов. Может сработать! :slight_smile: Но к сожалению не факт…

Все равно пара “запрос-ответ” будет идти от одного прова, по одному из каналов, т.е. увеличиться только количество возможных одновременных соединений, а распаралелить, например загрузку, таким образом не получиться, если конечно не использовать загрузку с разных источников, например с помощью aria2 или ему подбных качалок.

Все равно пара “запрос-ответ” будет идти от одного прова, по одному из каналов, т.е. увеличиться только количество возможных одновременных соединений, а распаралелить, например загрузку, таким образом не получиться, если конечно не использовать загрузку с разных источников, например с помощью aria2 или ему подбных качалок.

Ничего подобного!!! При объединении интерфейсов нагрузка идёт сразу на оба канала одновременно! Все программы использующие интернет будут использовать один интерфейс bond0, а траффик будет делиться между интерфейсами поровну.

А можно ли это заюзать для интернета, объеденив 2 и более провайдеров?

Оказывается можно и очень даже легко! Для этого достаточно интерфейсу присвоить сразу несколько ip, которые Вам предоставляют провайдеры и сразу несколько шлюзов. Таким образом нужный провайдер будет видеть “нужный” ему ip и пропускать Вас через “нужный” шлюз. Проверил! :slight_smile:

А как быть, если один провайдер предоставляет статический адрес, а второй - динамический? Или же оба предоставляют динамически…

Решил попробовать увеличить пропускную способность таким образом, вроде все взлетело,

bond0: flags=5187<UP,BROADCAST,RUNNING,MASTER,MULTICAST>  mtu 1500
        inet 192.168.1.2  netmask 255.255.255.0  broadcast 192.168.1.255
        inet6 fe80::5246:5dff:fe90:2890  prefixlen 64  scopeid 0x20<link>
        ether 50:46:5d:90:28:90  txqueuelen 1000  (Ethernet)
        RX packets 526  bytes 63606 (62.1 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 395  bytes 41371 (40.4 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 7

eth0: flags=6211<UP,BROADCAST,RUNNING,SLAVE,MULTICAST>  mtu 1500
        ether 50:46:5d:90:28:90  txqueuelen 1000  (Ethernet)
        RX packets 246  bytes 36511 (35.6 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 165  bytes 14458 (14.1 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 7
        device interrupt 16

eth1: flags=6211<UP,BROADCAST,RUNNING,SLAVE,MULTICAST>  mtu 1500
        ether 50:46:5d:90:28:90  txqueuelen 1000  (Ethernet)
        RX packets 141  bytes 14752 (14.4 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 126  bytes 14367 (14.0 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        device interrupt 19

eth2: flags=6211<UP,BROADCAST,RUNNING,SLAVE,MULTICAST>  mtu 1500
        ether 50:46:5d:90:28:90  txqueuelen 1000  (Ethernet)
        RX packets 160  bytes 21128 (20.6 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 126  bytes 14837 (14.4 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        device interrupt 18

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1  (Local Loopback)
        RX packets 620  bytes 59457 (58.0 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 620  bytes 59457 (58.0 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

но почему помимо интерфейса bond0 видны остальные eth0, eth1,eth2 ???

ведь должен быть только bond0 или я ошибаюсь

Владимир Кариков писал(а):

ведь должен быть только bond0 или я ошибаюсь

Ошибаетесь (раз уж спросили). Это нормально, что остальные интерфейсы видны.

Сергей Клюйков писал(а):

Это нормально, что остальные интерфейсы видны.
Уууф !!! Хвала Всевышнему !! получилось :-)))