Site Tools


software:freebsd:lagg_on_netgraph

ng_lagg - if_lagg on netgraph

По неизвестной причине использование if_lagg и двух сетевых адаптеров igb на FreeBSD 10.1 amd64 приводило к большой нагрузке на CPU, потере пакетов и потере связи при приёме мультикаста с битрейтом свыше 100 мегабит.
Реализация объединения сетевых адаптеров средствами netgraph не подвержена подобной проблеме.
Результат совместим с if_vlan и по сути мало чем отличается от других интерфейсов в системе.
Cкрипт: ng_lagg.sh
rc.d скрипт: ng_lagg

Использование

Создание LAGG интерфейса и добавление сетевых адаптеров

ng_lagg.sh start auto em0 em1 igb0

Создаст интерфейс ngeth0 (ngethX - если X-1 существует), добавит в него адаптеры em0,em1 и igb0.
Также будет сгенерирован и установлен случайный мак адрес.

ng_lagg.sh start xxxLAGG em0 em1 igb0

Создаст интерфейс с именем xxxLAGG, остальное как в примере выше.
Имя интерфейса произвольное.

ВАЖНО!
  1. Имя интерфейса не должно содержать: “.” и “:”. Это ограничение netgraph, подробнее: man 4 netgraph
  2. Максимальное количество интерфейсов в LAGG - 64. Это ограничение обусловлено константой NG_ONE2MANY_MAX_LINKS в файле /usr/src/sys/netgraph/ng_one2many.h. Если вам требуется больше, то измените значение константы и пересоберите ng_one2many.
  3. В LAGG на базе netgraph можно добавлять только сетевые интерфейсы к которые работают с нодой ng_ether. Список доступных интерфейсов можно увидеть так:
ngctl list | grep ether

Если ничего нет, то убедитесь что нода ng_ether загружена, или загрузите:

kldload ng_ether

Удаление LAGG интерфейса

ng_lagg.sh stop ngeth0

или

ng_lagg.sh stop xxxLAGG

в зависимости от названия интерфейса.

Добавление интерфейса в существующий LAGG

ng_lagg.sh if_add xxxLAGG igb1

Удаление интерфейса из LAGG

ng_lagg.sh if_del em0
ВАЖНО!

Проверки на принадлежность интерфейса к какому либо lagg на базе netgrapf не производится.
Код просто отключает lower хук интерфейса не производя никаких проверок.

rc.d скрипт

Для того чтобы интерфейс создавался при загрузке автоматически нужно:

  1. сохранить rc.d скрипт ng_lagg в /usr/local/etc/rc.d/
  2. сохранить скрипт ng_lagg.sh в /usr/local/sbin/
  3. разрешить выполнение обоих скриптов (chmod +x)
  4. добавить в /etc/rc.conf или /etc/rc.conf.local разрешение на его запуск и настройки:
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"

Замечания

  1. Можно создавать сколько угодно интерфейсов, в каждом из них должен быть хотя бы один сетевой адаптер
  2. Нельзя давать имена интерфейсам “auto”, так можно создать не более одного интерфейса, но по команде stop такой интерфейс не будет уничтожен.

Этапы создания lagg на простом примере

  1. Загружаем модуль ng_ether, остальные модули загрузятся автоматически при исполнении команды mkpeer.
  2. Инициализируем/включаем сетевые интерфейсы.
  3. Включаем неразборчивый режим на сетевых интерфейсах: нужно для правильной работы.
  4. Отключаем автоматической выставление mac адреса в исходящих пакетах на данных сетевых адаптерах.
  5. Создаём и подключаем ноду one2many к хуку lower на интерфейсе igb0 хуком many0.
  6. Даём имя созданной ноде: lagg0.
  7. Подключаем ноду lagg0 к хуку lower на интерфейсе igb1 хуком many1.
  8. Создаём и подключаем ноду vlan к хуку one ноды lagg0. На этот хук будут поступать пакеты с хуков manyX и наоборот.
  9. Даём имя созданной ноде: lagg0_vlan.
  10. Создаём и подключаем ноду eiface к хуку vlan21 ноды lagg0_vlan. Теперь сетевой Интерфейс создан, но нужно настроить его и ноду lagg0_vlan чтобы им можно было пользоваться.
  11. Переименовываем созданный сетевой интерфейс ngeth0 в ngvlan21 (будет отображаться в выводе ifconfig).
  12. Настраиваем mac и ip адреса на интерфейсе ngvlan21.
  13. Добавляем фильтр в ноду lagg0_vlan, чтобы пакеты из vlan 21 пересылались через хук vlan21 на интерфейс ngvlan21.

Замечания

  • Настройка one2many отсутствует потому что после создания нода работает в режиме NG_ONE2MANY_XMIT_ROUNDROBIN для исходящего трафика, других приемлемых для lagg режимов у ноды нет.
  • ng_one2many можно заменить на ng_bpf, и с помощью ассемблера BPF реализовать распределение исходящих пакетов по L2/L3/L4 адресам. Пример использования ng_bpf: Замена igmpproxy на netgraph

Скрипт - для двух сетевых интерфейсов

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" }'

Литература

software/freebsd/lagg_on_netgraph.txt · Last modified: 2022/02/05 04:36 by root