Site Tools


software:freebsd:lagg_on_netgraph

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
Last revisionBoth sides next revision
software:freebsd:lagg_on_netgraph [2022/02/04 18:33]
– removed - external edit (Unknown date) 127.0.0.1
software:freebsd:lagg_on_netgraph [2022/02/05 04:35]
root
Line 1: Line 1:
 +====== ng_lagg - if_lagg on netgraph ======
 +По неизвестной причине использование **if_lagg** и двух сетевых адаптеров igb на FreeBSD 10.1 amd64 приводило к большой нагрузке на CPU, потере пакетов и потере связи при приёме мультикаста с битрейтом свыше 100 мегабит.\\
 +Реализация объединения сетевых адаптеров средствами netgraph не подвержена подобной проблеме.\\
 +Результат совместим с **if_vlan** и по сути мало чем отличается от других интерфейсов в системе.\\
 +**Cкрипт**: [[http://netlab.linkpc.net/download/software/FreeBSD/ng_lagg/ng_lagg.sh|ng_lagg.sh]]\\
 +**rc.d скрипт**: [[http://netlab.linkpc.net/download/software/FreeBSD/ng_lagg/ng_lagg|ng_lagg]]\\
  
 +
 +===== Использование =====
 +==== Создание LAGG интерфейса и добавление сетевых адаптеров ====
 +<code>ng_lagg.sh start auto em0 em1 igb0</code>
 +Создаст интерфейс **ngeth0** (**ngethX** - если X-1 существует), добавит в него адаптеры em0,em1 и igb0.\\
 +Также будет сгенерирован и установлен случайный мак адрес.\\
 +
 +<code>ng_lagg.sh start xxxLAGG em0 em1 igb0</code>
 +Создаст интерфейс с именем **xxxLAGG**, остальное как в примере выше.\\
 +Имя интерфейса произвольное.\\
 +
 +== ВАЖНО! ==
 +  - Имя интерфейса не должно содержать: "." и ":". Это ограничение netgraph, подробнее: [[https://www.freebsd.org/cgi/man.cgi?query=netgraph&sektion=4&apropos=0&manpath=FreeBSD+10.1-stable|man 4 netgraph]]
 +  - Максимальное количество интерфейсов в LAGG - 64. Это ограничение обусловлено константой **NG_ONE2MANY_MAX_LINKS** в файле /usr/src/sys/netgraph/ng_one2many.h. Если вам требуется больше, то измените значение константы и пересоберите **ng_one2many**.
 +  - В LAGG на базе netgraph можно добавлять только сетевые интерфейсы к которые работают с нодой **ng_ether**. Список доступных интерфейсов можно увидеть так:
 +<code>ngctl list | grep ether</code>
 +Если ничего нет, то убедитесь что нода **ng_ether** загружена, или загрузите:
 +<code>kldload ng_ether</code>
 +
 +
 +==== Удаление LAGG интерфейса ====
 +<code>ng_lagg.sh stop ngeth0</code>
 +или
 +<code>ng_lagg.sh stop xxxLAGG</code>
 +в зависимости от названия интерфейса.
 +
 +
 +==== Добавление интерфейса в существующий LAGG ====
 +<code>ng_lagg.sh if_add xxxLAGG igb1</code>
 +
 +
 +==== Удаление интерфейса из LAGG ====
 +<code>ng_lagg.sh if_del em0</code>
 +
 +== ВАЖНО! ==
 +Проверки на принадлежность интерфейса к какому либо lagg на базе netgrapf не производится.\\
 +Код просто отключает lower хук интерфейса не производя никаких проверок.\\
 +
 +
 +==== rc.d скрипт ====
 +Для того чтобы интерфейс создавался при загрузке автоматически нужно:
 +  - сохранить rc.d скрипт [[http://netlab.linkpc.net/download/software/FreeBSD/ng_lagg/ng_lagg|ng_lagg]] в /usr/local/etc/rc.d/
 +  - сохранить скрипт [[http://netlab.linkpc.net/download/software/FreeBSD/ng_lagg/ng_lagg.sh|ng_lagg.sh]] в /usr/local/sbin/
 +  - разрешить выполнение обоих скриптов (chmod +x)
 +  - добавить в /etc/rc.conf или /etc/rc.conf.local разрешение на его запуск и настройки:
 +<code>ng_lagg_enable="YES"
 +ng_lagg_interfaces="lagg0 xyzlagg"
 +ng_lagg_lagg0="em0 em1"
 +ng_lagg_xyzlagg="xl0 igb1"
 +ifconfig_lagg0="inet 192.168.11.77 netmask 255.255.255.0"
 +ifconfig_xyzlagg="inet 192.168.22.77 netmask 255.255.255.0"
 +
 +vlans_lagg0="vlan1234"
 +create_args_vlan1234="vlan 1234"
 +ifconfig_vlan1234="inet 192.168.0.77 netmask 255.255.255.0"
 +</code>
 +
 +
 +=== Замечания ===
 +  - Можно создавать сколько угодно интерфейсов, в каждом из них должен быть хотя бы один сетевой адаптер
 +  - Нельзя давать имена интерфейсам "auto", так можно создать не более одного интерфейса, но по команде **stop** такой интерфейс не будет уничтожен.
 +
 +
 +===== Этапы создания lagg на простом примере =====
 +  - Загружаем модуль **ng_ether**, остальные модули загрузятся автоматически при исполнении команды **mkpeer**.
 +  - Инициализируем/включаем сетевые интерфейсы.
 +  - Включаем неразборчивый режим на сетевых интерфейсах: нужно для правильной работы.
 +  - Отключаем автоматической выставление mac адреса в исходящих пакетах на данных сетевых адаптерах.
 +  - Создаём и подключаем ноду **one2many** к хуку **lower** на интерфейсе **igb0** хуком many0.
 +  - Даём имя созданной ноде: **lagg0**.
 +  - Подключаем ноду **lagg0** к хуку **lower** на интерфейсе **igb1** хуком **many1**.
 +  - Создаём и подключаем ноду **vlan** к хуку **one** ноды **lagg0**. На этот хук будут поступать пакеты с хуков **manyX** и наоборот.
 +  - Даём имя созданной ноде: **lagg0_vlan**.
 +  - Создаём и подключаем ноду **eiface** к хуку **vlan21** ноды **lagg0_vlan**. Теперь сетевой Интерфейс создан, но нужно настроить его и ноду **lagg0_vlan** чтобы им можно было пользоваться.
 +  - Переименовываем созданный сетевой интерфейс **ngeth0** в **ngvlan21** (будет отображаться в выводе **ifconfig**).
 +  - Настраиваем mac и ip адреса на интерфейсе **ngvlan21**.
 +  - Добавляем фильтр в ноду **lagg0_vlan**, чтобы пакеты из vlan 21 пересылались через хук **vlan21** на интерфейс **ngvlan21**.
 +
 +
 +==== Замечания ====
 +  * Настройка **one2many** отсутствует потому что после создания нода работает в режиме NG_ONE2MANY_XMIT_ROUNDROBIN для исходящего трафика, других приемлемых для **lagg** режимов у ноды нет.
 +  * **ng_one2many** можно заменить на **ng_bpf**, и с помощью ассемблера BPF реализовать распределение исходящих пакетов по L2/L3/L4 адресам. Пример использования **ng_bpf**: [[software:freebsd:igmpproxy_on_netgraph|Замена igmpproxy на netgraph]]
 +
 +
 +==== Скрипт - для двух сетевых интерфейсов ====
 +<code>kldload ng_ether
 +
 +ifconfig igb0 up
 +ifconfig igb1 up
 +
 +ngctl msg igb0: setpromisc 1
 +ngctl msg igb1: setpromisc 1
 +ngctl msg igb0: setautosrc 0
 +ngctl msg igb1: setautosrc 0
 +
 +
 +ngctl mkpeer igb0: one2many lower many0
 +ngctl name igb0:lower lagg0
 +ngctl connect igb1: lagg0: lower many1
 +
 +ngctl mkpeer lagg0: vlan one downstream
 +ngctl name lagg0:one lagg0_vlan
 +
 +
 +
 +ngctl mkpeer lagg0_vlan: eiface vlan21 ether
 +ngctl name lagg0_vlan:vlan21 ngvlan21
 +ifconfig ngeth0 name ngvlan21
 +ifconfig ngvlan21 link 00:1a:4d:55:9a:44
 +ifconfig ngvlan21 inet 192.168.0.20 netmask 255.255.255.0
 +ngctl msg lagg0_vlan: addfilter '{ vid=21 hook="vlan21" }'</code>
 +
 +
 +===== Литература =====
 +[[https://www.freebsd.org/cgi/man.cgi?query=netgraph&sektion=4&apropos=0&manpath=FreeBSD+10.1-stable|man 4 netgraph]]\\
 +[[https://www.freebsd.org/cgi/man.cgi?query=ng_one2many&apropos=0&sektion=4&manpath=FreeBSD+10.1-stable&arch=default&format=html|man ng_one2many]]\\
 +[[https://www.freebsd.org/cgi/man.cgi?query=ng_vlan&sektion=4&apropos=0&manpath=FreeBSD+10.1-stable|man ng_vlan]]\\
 +[[https://www.freebsd.org/cgi/man.cgi?query=ng_eiface&sektion=4&apropos=0&manpath=FreeBSD+10.1-stable|man ng_eiface]]\\
 +[[https://www.freebsd.org/cgi/man.cgi?query=ng_ether&sektion=4&apropos=0&manpath=FreeBSD+10.1-stable|man ng_ether]]\\
 +
 +
 +
 +{{tag>software howto freebsd net netgraph vlan lagg}}
software/freebsd/lagg_on_netgraph.txt · Last modified: 2022/02/05 04:36 by root