Linux предоставляет широкие возможности виртуализации сети — на них строится работа виртуальных машин (ВМ), контейнеров и облачных сред. В этом руководстве разберем распространенные типы виртуальных сетевых интерфейсов: чем они отличаются и как их создать. Сосредоточимся на практике, без глубокого разбора кода. Статья рассчитана на читателей с базовыми знаниями сетей. Отдельно разберем интерфейсы, которые часто путают между собой.

Чтобы увидеть все доступные интерфейсы, выполните команду ip link из пакета iproute2. Все команды в статье выполняются от root.

Навигация по тексту:

О туннельных интерфейсах читайте в статье «An introduction to Linux virtual interfaces: Tunnels».

Bridge

Мост в Linux работает как сетевой коммутатор и пересылает пакеты между интерфейсами. Обычно его используют для пересылки пакетов на маршрутизаторах и шлюзах или между ВМ и сетевыми пространствами имен (network namespaces) на хосте. Мост поддерживает протокол STP (Spanning Tree Protocol), фильтрацию VLAN и multicast snooping.

Мост Linux (br0) соединяет виртуальные компоненты с физической сетью — ВМ через tap-интерфейсы, пространство имен через veth-интерфейсы
Мост Linux (br0) соединяет виртуальные компоненты с физической сетью — ВМ через tap-интерфейсы, пространство имен через veth-интерфейсы

Когда использовать мост

Используйте мост, когда нужно соединить несколько виртуальных интерфейсов (например, ВМ или контейнеров) друг с другом или с физической сетью так, как будто они подключены к одному физическому коммутатору.

Как создать мост в Linux

Для создания моста используйте команду ip link:

sudo ip link add br0 type bridge
sudo ip link set br0 up

Чтобы добавить порт в мост:

sudo ip link set eth0 master br0

Spanning Tree Protocol (STP)

Протокол STP создает логическую топологию Ethernet-сети без петель, предотвращая закольцовывание мостов и широковещательные штормы. Мост Linux поддерживает протоколы RSTP (Rapid Spanning Tree Protocol) и MSTP (Multiple Spanning Tree Protocol). Чтобы включить STP на мосту, выполните:

bash

ip link set br0 type bridge stp_state 1

Поддержка multicast

Драйвер моста Linux поддерживает многоадресную рассылку: он обрабатывает сообщения протоколов IGMP (Internet Group Management Protocol) и MLD (Multicast Listener Discovery), чтобы эффективно пересылать пакеты. Поддерживаются IGMPv2/IGMPv3 и MLDv1/MLDv2. Чтобы включить multicast snooping и отправку запросов IGMP/MLD:

ip link set br0 mcast_snooping 1
ip link set br0 mcast_querier 1

Фильтрация VLAN

Мост Linux добавляет теги VLAN для каждого порта — так же, как аппаратный коммутатор. Следующие команды включают фильтрацию VLAN и назначают портам VLAN ID 2:

ip link set br0 type bridge vlan_filtering 1
ip link set eth1 master br0
bridge vlan add dev eth1 vid 2 pvid untagged

Параметр pvid добавляет теги VLAN 2 нетегированным кадрам на входе (входящий трафик). Параметр untagged снимает теги VLAN 2 на выходе (исходящий трафик).

Дополнительные материалы

Подробнее о параметрах STP и multicast — в ip link help bridge и man-странице ip-link. Об использовании VLAN — в bridge help и man bridge.

Мост Linux также поддерживает изменение записей в таблице пересылки (FDB) и базе многоадресных групп (MDB). Среди других возможностей — MAC Authentication Bypass (MAB), IEEE 802.11 Proxy ARP и switchdev. Подробности — в man-странице bridge и документации ядра по мостам.

Bonded-интерфейс

Драйвер bonding в Linux объединяет несколько сетевых интерфейсов в один логический. Поведение агрегированного интерфейса зависит от выбранного режима: как правило, это горячий резерв (hot standby) или балансировка нагрузки.

Интерфейс bond0 объединяет физические интерфейсы eth0 и eth1 в одно логическое подключение к коммутатору
Интерфейс bond0 объединяет физические интерфейсы eth0 и eth1 в одно логическое подключение к коммутатору

Когда использовать bonded-интерфейс

Используйте агрегированный интерфейс, когда нужно увеличить скорость канала или обеспечить отказоустойчивость сервера.

Как создать bonded-интерфейс

ip link add bond1 type bond miimon 100 mode active-backup
ip link set eth0 master bond1
ip link set eth1 master bond1

Эти команды создают агрегированный интерфейс bond1 в режиме active-backup. Другие режимы описаны в документации ядра.

Драйвер net_failover — еще один вариант отказоустойчивого основного сетевого устройства для виртуализации. Он управляет основным устройством (например, pass-through или устройством виртуальной функции, VF) и резервным паравиртуальным интерфейсом.

Драйвер net_failover внутри ВМ управляет основным VF-устройством (eth1) и резервным паравиртуальным интерфейсом (eth0)
Драйвер net_failover внутри ВМ управляет основным VF-устройством (eth1) и резервным паравиртуальным интерфейсом (eth0)

VLAN

Виртуальная локальная сеть (VLAN) разделяет широковещательные домены с помощью тегирования сетевых пакетов. С VLAN администраторы группируют хосты в рамках одного коммутатора или между разными коммутаторами. Ниже показан стандартный заголовок VLAN.

Тег 802.1Q вставляется в Ethernet-кадр и содержит идентификатор VLAN и информацию о приоритете
Тег 802.1Q вставляется в Ethernet-кадр и содержит идентификатор VLAN и информацию о приоритете

Когда использовать VLAN

Используйте VLAN, чтобы разделить подсети между ВМ, пространствами имен или хостами.

Как создать VLAN

ip link add link eth0 name eth0.2 type vlan id 2
ip link add link eth0 name eth0.3 type vlan id 3

Команды добавляют VLAN 2 с именем eth0.2 и VLAN 3 с именем eth0.3.

Физический интерфейс eth0 на сервере разделен на виртуальные интерфейсы eth0.2 и eth0.3 для разных VLAN ID
Физический интерфейс eth0 на сервере разделен на виртуальные интерфейсы eth0.2 и eth0.3 для разных VLAN ID

Примечание. При настройке VLAN убедитесь, что коммутатор, к которому подключен хост, умеет работать с тегами VLAN. Например, переведите порт коммутатора в режим trunk.

VXLAN

VXLAN (Virtual eXtensible Local Area Network) — туннельный протокол, снимающий ограничение в 4 096 идентификаторов VLAN из стандарта IEEE 802.1Q. Протокол описан в IETF RFC 7348.

VXLAN использует 24-битный идентификатор сегмента — VNI (VXLAN network identifier). Это дает до 16 777 216 виртуальных сетей — в 4 096 раз больше, чем у стандартного VLAN.

VXLAN инкапсулирует кадры второго уровня (L2) с заголовком VXLAN в пакет UDP-IP, как показано ниже.

VXLAN инкапсулирует Ethernet-кадры L2 в пакет UDP-IP, добавляя 24-битный VNI, который значительно расширяет число доступных виртуальных сетей
VXLAN инкапсулирует Ethernet-кадры L2 в пакет UDP-IP, добавляя 24-битный VNI, который значительно расширяет число доступных виртуальных сетей

Когда использовать VXLAN

Используйте VXLAN, когда нужно выйти за пределы 4 096 VLAN или построить оверлейную сеть второго уровня поверх инфраструктуры третьего уровня — например, в крупных облачных средах. VXLAN обычно применяют в дата-центрах на виртуализированных хостах, распределенных по нескольким стойкам.

В дата-центре VXLAN создает виртуальную сеть L2, туннелируя трафик между виртуальными интерфейсами (vx0) через физическую сеть
В дата-центре VXLAN создает виртуальную сеть L2, туннелируя трафик между виртуальными интерфейсами (vx0) через физическую сеть

Как создать VXLAN

ip link add vx0 type vxlan id 100 local 1.1.1.1 remote 2.2.2.2 dev eth0 dstport 4789

Дополнительно изучите документацию ядра по VXLAN или вводную статью о VXLAN.

MACVLAN

С VLAN можно создать несколько интерфейсов поверх одного и фильтровать пакеты по тегу VLAN. С MACVLAN — несколько интерфейсов с разными адресами второго уровня (то есть MAC-адресами Ethernet) поверх одного физического.

До появления MACVLAN, чтобы подключить ВМ или пространство имен к физической сети, приходилось создавать устройства TAP или VETH и присоединять их к мосту вместе с физическим интерфейсом.

Классическая схема — мост (br0) соединяет несколько пространств имен с физическим сетевым интерфейсом
Классическая схема — мост (br0) соединяет несколько пространств имен с физическим сетевым интерфейсом

С MACVLAN физический интерфейс привязывается к пространствам имен напрямую, без моста.

MACVLAN упрощает сетевой стек — виртуальные интерфейсы привязываются напрямую к физическому eth0 без моста
MACVLAN упрощает сетевой стек — виртуальные интерфейсы привязываются напрямую к физическому eth0 без моста

У MACVLAN пять режимов.

  • Private. Режим запрещает обмен трафиком между экземплярами MACVLAN на одном физическом интерфейсе — даже если внешний коммутатор поддерживает режим hairpin.

    В режиме private обмен между локальными виртуальными интерфейсами запрещен, даже если они используют одно физическое устройство eth0
    В режиме private обмен между локальными виртуальными интерфейсами запрещен, даже если они используют одно физическое устройство eth0
  • VEPA. Данные от одного экземпляра MACVLAN к другому на том же физическом интерфейсе передаются через физический интерфейс. Для связи требуется, чтобы подключенный коммутатор поддерживал режим hairpin, либо чтобы пакеты пересылал TCP/IP-маршрутизатор.

В режиме VEPA (Virtual Ethernet Port Aggregator) трафик между экземплярами MACVLAN на одном интерфейсе должен отражаться внешним коммутатором
В режиме VEPA (Virtual Ethernet Port Aggregator) трафик между экземплярами MACVLAN на одном интерфейсе должен отражаться внешним коммутатором
  • Bridge. Все конечные точки соединены друг с другом напрямую через простой мост поверх физического интерфейса.

    В режиме bridge виртуальные интерфейсы на одном физическом устройстве обмениваются трафиком напрямую, не покидая хост
    В режиме bridge виртуальные интерфейсы на одном физическом устройстве обмениваются трафиком напрямую, не покидая хост
  • Passthru. Режим подключает одну ВМ напрямую к физическому интерфейсу.

    В режиме passthru один виртуальный интерфейс привязывается напрямую к физическому eth0, что дает производительность, близкую к нативной
    В режиме passthru один виртуальный интерфейс привязывается напрямую к физическому eth0, что дает производительность, близкую к нативной
  • Source. Режим фильтрует трафик по списку разрешенных MAC-адресов источника и создает ассоциации VLAN на основе MAC. Подробности — в сообщении коммита.

Выбирайте режим под задачу. Самый распространенный — bridge.

Когда использовать MACVLAN

Используйте MACVLAN, когда контейнерам нужно прямое подключение к физической сети.

Как создать MACVLAN

ip link add macvlan1 link eth0 type macvlan mode bridge
ip netns add net1
ip link set macvlan1 netns net1

Команды создают устройство MACVLAN в режиме bridge и назначают его сетевому пространству имен.

IPVLAN

IPVLAN похож на MACVLAN, но его конечные точки используют один общий MAC-адрес.

MACVLAN назначает каждому виртуальному интерфейсу уникальный MAC-адрес, а в IPVLAN конечные точки делят MAC-адрес с родительским физическим интерфейсом
MACVLAN назначает каждому виртуальному интерфейсу уникальный MAC-адрес, а в IPVLAN конечные точки делят MAC-адрес с родительским физическим интерфейсом

IPVLAN поддерживает режимы L2 и L3. В режиме L2 IPVLAN ведет себя как MACVLAN в режиме bridge: родительский интерфейс выглядит как мост или коммутатор.

В режиме L2 родительский интерфейс (eth0) работает как мост, обеспечивая прямой обмен между конечными точками
В режиме L2 родительский интерфейс (eth0) работает как мост, обеспечивая прямой обмен между конечными точками

В режиме L3 родительский интерфейс работает как маршрутизатор: пакеты маршрутизируются между конечными точками, что дает лучшую масштабируемость.

В режиме L3 родительский интерфейс (eth0) выступает маршрутизатором и пересылает пакеты между виртуальными конечными точками и внешней сетью
В режиме L3 родительский интерфейс (eth0) выступает маршрутизатором и пересылает пакеты между виртуальными конечными точками и внешней сетью

Когда использовать IPVLAN

В документации ядра сказано, что MACVLAN и IPVLAN во многом похожи, и выбор устройства определяет конкретный сценарий. Выбирайте IPVLAN, если верно хотя бы одно из условий:

  • Внешний коммутатор или маршрутизатор, к которому подключен Linux-хост, разрешает только один MAC-адрес на порт.

  • Число виртуальных устройств на основном интерфейсе превышает лимит MAC-адресов сетевой карты, она переходит в неразборчивый режим (promiscuous mode), и падение производительности критично.

  • Вторичное устройство находится в недоверенном пространстве имен, где настройками L2 могут злоупотребить.

Как создать IPVLAN

ip netns add ns0
ip link add name ipvl0 link eth0 type ipvlan mode l2
ip link set dev ipvl0 netns ns0

Команды создают устройство IPVLAN с именем ipvl0 в режиме L2 и назначают его пространству имен ns0.

MACVTAP/IPVTAP

Драйверы MACVTAP и IPVTAP упрощают виртуализированную мостовую сеть. При создании экземпляра ядро генерирует символьное устройство /dev/tapX, которое используется как устройство TUN/TAP для KVM или QEMU.

MACVTAP и IPVTAP заменяют отдельные драйверы TUN, TAP и bridge одним модулем.

Модули MACVTAP и IPVTAP упрощают сеть при виртуализации — один драйвер соединяет виртуальные интерфейсы с физическим
Модули MACVTAP и IPVTAP упрощают сеть при виртуализации — один драйвер соединяет виртуальные интерфейсы с физическим

Когда использовать MACVTAP

Обычно MACVLAN/IPVLAN применяют, чтобы и гость, и хост были видны напрямую на коммутаторе, к которому подключен хост. Разница между MACVTAP и IPVTAP — та же, что между MACVLAN и IPVLAN.

Как создать MACVTAP

ip link add link eth0 name macvtap0 type macvtap

MACsec

MACsec (Media Access Control Security) — стандарт IEEE для защиты проводных Ethernet-сетей. Как и IPsec, MACsec — спецификация второго уровня, которая защищает IP-трафик, а также трафик ARP (Address Resolution Protocol), neighbor discovery и DHCP (Dynamic Host Configuration Protocol). Заголовки MACsec выглядят так:

MACsec обеспечивает безопасность на уровне L2, добавляя в Ethernet-кадр тег SecTag и контрольное значение целостности (ICV) и шифруя полезную нагрузку
MACsec обеспечивает безопасность на уровне L2, добавляя в Ethernet-кадр тег SecTag и контрольное значение целостности (ICV) и шифруя полезную нагрузку

Когда использовать MACsec

Основной сценарий MACsec — защита всех сообщений в стандартной локальной сети, включая ARP, NS и DHCP.

MACsec создает логический интерфейс macsec0 поверх физического eth0 и защищает все сообщения L2 между серверами
MACsec создает логический интерфейс macsec0 поверх физического eth0 и защищает все сообщения L2 между серверами

Как настроить MACsec

ip link add macsec0 link eth1 type macsec

Примечание. Команда только добавляет устройство macsec0 на интерфейсе eth1. Детальная настройка описана в разделе Configuration example вводной статьи о MACsec Сабрины Дуброка (Sabrina Dubroca).

VETH

Устройство VETH (virtual Ethernet) — локальный Ethernet-туннель. Устройства создаются парами.

Пакеты, отправленные с одного устройства пары, сразу принимаются на втором. Когда одно из устройств выключено, состояние канала всей пары — down.

Устройства VETH создаются парами и образуют локальный туннель между пространствами имен или соединяют пространство имен с мостом
Устройства VETH создаются парами и образуют локальный туннель между пространствами имен или соединяют пространство имен с мостом

Как создать VETH

bash

ip netns add net1
ip netns add net2
ip link add veth1 netns net1 type veth peer name veth2 netns net2

Команды создают два пространства имен, net1 и net2, и пару устройств VETH: veth1 назначается пространству net1, veth2 — net2. Пространства соединены этой парой. Назначьте им IP-адреса — и между пространствами появится связность, которую легко проверить через ping.

Netkit

Netkit — минималистичное сетевое устройство, программируемое через BPF. Оно выполняет BPF-программы во время передачи, что дает более раннюю обработку пакетов. Это особенно полезно для сетей контейнеров и подов: выполнение BPF смещается ближе к источнику, что улучшает обработку исходящего трафика.

Когда использовать Netkit

Используйте Netkit, когда нужна BPF-программируемая сеть для контейнеров с более эффективной обработкой исходящего трафика.

Как создать Netkit

Как и VETH, устройство Netkit реализовано парой (primary и peer). Основное устройство (в пространстве имен хоста) управляет BPF-программами для себя и для парного. Парное устройство (контейнер/под) не привязывает и не отвязывает BPF-программы. Политику по умолчанию — при отсутствии BPF-программы — задают как pass или drop.

По умолчанию новые устройства работают в режиме forwarding:

ip link add type netkit
ip -d a

Вывод:

[...]
7: nk0@nk1:  mtu 1500 qdisc noop state DOWN group default qlen 1000
  link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff promiscuity 0 allmulti 0 minmtu 68 maxmtu 65535
  netkit mode l3 type peer policy forward numtxqueues 1 numrxqueues 1 [...]
8: nk1@nk0:  mtu 1500 qdisc noop state DOWN group default qlen 1000
  link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff promiscuity 0 allmulti 0 minmtu 68 maxmtu 65535
  netkit mode l3 type primary policy forward numtxqueues 1 numrxqueues 1 [...]

Пример использования с netns:

ip netns add blue
ip link add nk0 type netkit peer nk1 netns blue
ip link set up nk0
ip addr add 10.0.0.1/24 dev nk0
ip -n blue link set up nk1
ip -n blue addr add 10.0.0.2/24 dev nk1
ping -c1 10.0.0.2

Вывод:

PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
64 bytes from 10.0.0.2: icmp_seq=1 ttl=64 time=0.021 ms

Поддерживается и режим L2. Например:

ip link add foo type netkit mode l2 forward peer blackhole bar
ip -d a

Вывод:

[...]
13: bar@foo:  mtu 1500 qdisc noop state DOWN group default qlen 1000
   link/ether 5e:5b:81:17:02:27 brd ff:ff:ff:ff:ff:ff promiscuity 0 allmulti 0 minmtu 68 maxmtu 65535
   netkit mode l2 type peer policy blackhole numtxqueues 1 numrxqueues 1 [...]
14: foo@bar:  mtu 1500 qdisc noop state DOWN group default qlen 1000
   link/ether de:01:a5:88:9e:99 brd ff:ff:ff:ff:ff:ff promiscuity 0 allmulti 0 minmtu 68 maxmtu 65535
   netkit mode l2 type primary policy forward numtxqueues 1 numrxqueues 1 [...]

VCAN

По аналогии с loopback-устройствами драйвер VCAN (virtual CAN) предоставляет виртуальный локальный интерфейс CAN (Controller Area Network) для отправки и приема сообщений. Сегодня CAN применяется в основном в автомобильной отрасли.

Подробнее о протоколе — в документации ядра по CAN.

Когда использовать VCAN

Используйте VCAN, когда нужно протестировать реализацию протокола CAN на локальном хосте.

Как создать VCAN

ip link add dev vcan1 type vcan

VXCAN

Подобно драйверу VETH, VXCAN (туннель виртуального CAN) создает локальный туннель CAN-трафика между двумя устройствами VCAN. При создании экземпляра VXCAN генерируется пара устройств: пакет, принятый одним устройством, появляется на парном. VXCAN подходит для обмена между пространствами имен.

Когда использовать VXCAN

Используйте VXCAN, когда нужно передавать CAN-сообщения между пространствами имен.

Как создать VXCAN

ip netns add net1
ip netns add net2
ip link add vxcan1 netns net1 type vxcan peer name vxcan2 netns net2

Примечание. Red Hat Enterprise Linux сейчас не поддерживает VXCAN.

IPOIB

Устройство IPOIB реализует протокол IP-over-InfiniBand: оно передает IP-пакеты через InfiniBand (IB), превращая IB-устройство в высокоскоростную сетевую карту.

Драйвер IPOIB работает в двух режимах: datagram и connected. В режиме datagram используется ненадежный датаграммный транспорт IB (UD). В режиме connected — надежный транспорт с установлением соединения (RC), который опирается на надежность IB-транспорта и поддерживает MTU до 64 КБ — вплоть до максимального размера IP-пакета.

Подробности — в документации ядра по IPOIB.

Когда использовать IPOIB

Используйте IPOIB, когда у вас есть IB-устройство и нужно обмениваться данными с удаленным хостом по IP.

Как создать IPOIB

ip link add ib0 name ipoib0 type ipoib pkey IB_PKEY mode connected

NLMON

NLMON — устройство для мониторинга Netlink.

Когда использовать NLMON

Используйте NLMON, когда нужно отслеживать Netlink-сообщения в системе.

Как создать NLMON

ip link add nlmon0 type nlmon
ip link set nlmon0 up
tcpdump -i nlmon0 -w nlmsg.pcap

Команды создают устройство nlmon0 и включают его. Для захвата Netlink-сообщений используйте сниффер, например tcpdump. Свежие версии Wireshark декодируют Netlink-сообщения.

Netconsole

netconsole — модуль ядра, который перехватывает сообщения журнала ядра (dmesg) и передает их по сети.

Когда использовать netconsole

Используйте netconsole для отладки падений и зависаний ядра, а также проблем на ранних этапах загрузки — особенно когда локальное журналирование (на диск или в последовательную консоль) недоступно или отказало.

Как настроить netconsole

netconsole включается загрузкой модуля с параметрами или добавлением их в командную строку ядра. Чтобы создать конфигурацию во время работы системы:

modprobe netconsole netconsole=@192.168.1.100/eth0,@192.168.1.200/6666

Здесь @192.168.1.100/eth0 — IP-адрес и интерфейс источника, @192.168.1.200/6666 — IP-адрес и UDP-порт назначения.

Настройка netconsole на лету

Чтобы изменить настройки без перезагрузки модуля, используйте путь /sys/module/netconsole/parameters/.

Проверить текущие настройки:

cat /sys/module/netconsole/parameters/*

Сменить IP удаленного получателя:

echo 192.168.1.200 > /sys/module/netconsole/parameters/remote_ip

Сменить удаленный порт:

echo 6666 > /sys/module/netconsole/parameters/remote_port

Dummy-интерфейс

Dummy-интерфейс полностью виртуален, как и loopback. Он дает возможность маршрутизировать пакеты без их фактической передачи.

Когда использовать dummy-интерфейс

Изначально dummy-интерфейс применяли, чтобы неактивный адрес SLIP (Serial Line Internet Protocol) выглядел для локальных программ как настоящий. Сегодня его используют в основном для тестирования и отладки.

Как создать dummy-интерфейс

ip link add dummy1 type dummy
ip addr add 1.1.1.1/24 dev dummy1
ip link set dummy1 up

Blackhole

Blackhole-интерфейс — виртуальное сетевое устройство, которое молча отбрасывает пакеты. Это /dev/null для сетевого трафика: любой пакет, отправленный на него, отбрасывается без ответа и без сообщения об ошибке.

Когда использовать blackhole-интерфейс

Используйте blackhole для безопасности, изоляции маршрутизации и управления производительностью. Он особенно полезен для остановки DoS-атак — трафик с вредоносных диапазонов IP просто отбрасывается — и для изоляции внутреннего трафика при сложных конфигурациях маршрутизации.

Как создать blackhole-маршрут

Добавьте blackhole-маршрут командой ip route, чтобы отбрасывать весь трафик к определенной сети:

ip route add blackhole 192.168.1.0/24

Blackhole в маршрутизации на основе политик

Blackhole применяют и в маршрутизации на основе политик (PBR), чтобы отбрасывать трафик от определенного источника:

ip rule add from 10.0.0.0/8 table 100
ip route add blackhole default table 100

Так весь трафик, исходящий из 10.0.0.0/8, будет отброшен.

IFB

Драйвер IFB (intermediate functional block) собирает трафик из нескольких источников, чтобы шейпить его, а не отбрасывать.

Когда использовать IFB

Используйте IFB, когда нужно ставить в очередь и шейпить входящий трафик.

Как создать IFB

ip link add ifb0 type ifb
ip link set ifb0 up
tc qdisc add dev ifb0 root sfq
tc qdisc add dev eth0 handle ffff: ingress
tc filter add dev eth0 parent ffff: u32 match u32 0 0 action mirred egress redirect dev ifb0

Команды создают устройство ifb0 и заменяют корневой планировщик qdisc на SFQ (Stochastic Fairness Queueing) — бесклассовый планировщик очередей. Затем на eth0 добавляется ingress-планировщик, и весь входящий трафик перенаправляется на ifb0.

Другие сценарии использования IFB qdisc — в вики Linux Foundation по IFB.

Примечание. Устройства IFB уже редко применяются. Вместо них используйте tc qdisc clsact — стандарт для классификации и фильтрации пакетов.

netdevsim

netdevsim — симулируемое сетевое устройство для тестирования различных сетевых API.

Когда использовать netdevsim

Используйте netdevsim для тестирования сетевых функций без физического оборудования. В основном его применяют для проверки аппаратного офлоада, BPF-программ tc и XDP, а также SR-IOV (Single Root I/O Virtualization).

Как создать netdevsim

Чтобы создать устройство netdevsim, загрузите модуль и передайте конфигурацию (идентификатор, число портов и очередей) через echo на шину. Пример создает устройство netdevsim0 с двумя портами и четырьмя очередями на порт:

modprobe netdevsim
echo "0 2 4" > /sys/bus/netdevsim/new_device

Проверить созданные порты и их аппаратные настройки можно через ip link и ethtool:

ls /sys/bus/netdevsim/devices/netdevsim0/net/

Вывод:

eni0np1 eni0np2

Тестирование аппаратного офлоада

Устройство netdevsim поддерживает несколько видов аппаратного офлоада: TSO (TCP Segmentation Offload), GSO (Generic Segmentation Offload) и IPsec ESP. Проверить возможности можно через ethtool:

ethtool -k eni0np1 | grep esp

Также включите офлоад tc (Traffic Control) или загрузите BPF-программы XDP (eXpress Data Path), чтобы проверить логику офлоада:

ethtool -K eni0np1 hw-tc-offload on
ip link set dev eni0np1 xdpoffload obj prog.o

Тестирование SR-IOV и devlink

Для тестирования SR-IOV добавьте симулируемому устройству виртуальные функции (VF) и назначьте им MAC-адреса:

echo 2 > /sys/bus/netdevsim/devices/netdevsim0/sriov_numvfs
ip link set eni0np1 vf 0 mac 00:11:22:33:44:55

Утилита devlink покажет информацию об устройстве и ресурсах, например заполненность таблицы FIB (Forwarding Information Base):

devlink dev info netdevsim/netdevsim0
devlink resource show netdevsim/netdevsim0

Примечание. По умолчанию netdevsim не входит в сборку Red Hat Enterprise Linux.

Комментарии (0)