
Linux предоставляет широкие возможности виртуализации сети — на них строится работа виртуальных машин (ВМ), контейнеров и облачных сред. В этом руководстве разберем распространенные типы виртуальных сетевых интерфейсов: чем они отличаются и как их создать. Сосредоточимся на практике, без глубокого разбора кода. Статья рассчитана на читателей с базовыми знаниями сетей. Отдельно разберем интерфейсы, которые часто путают между собой.
Чтобы увидеть все доступные интерфейсы, выполните команду
ip linkиз пакета iproute2. Все команды в статье выполняются от root.
Навигация по тексту:
О туннельных интерфейсах читайте в статье «An introduction to Linux virtual interfaces: Tunnels».
Bridge
Мост в Linux работает как сетевой коммутатор и пересылает пакеты между интерфейсами. Обычно его используют для пересылки пакетов на маршрутизаторах и шлюзах или между ВМ и сетевыми пространствами имен (network namespaces) на хосте. Мост поддерживает протокол STP (Spanning Tree Protocol), фильтрацию VLAN и multicast snooping.
Когда использовать мост
Используйте мост, когда нужно соединить несколько виртуальных интерфейсов (например, ВМ или контейнеров) друг с другом или с физической сетью так, как будто они подключены к одному физическому коммутатору.
Как создать мост в Linux
Для создания моста используйте команду ip link:
sudo ip link add br0 type bridgesudo 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 1ip link set br0 mcast_querier 1
Фильтрация VLAN
Мост Linux добавляет теги VLAN для каждого порта — так же, как аппаратный коммутатор. Следующие команды включают фильтрацию VLAN и назначают портам VLAN ID 2:
ip link set br0 type bridge vlan_filtering 1ip link set eth1 master br0bridge 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) или балансировка нагрузки.
Когда использовать bonded-интерфейс
Используйте агрегированный интерфейс, когда нужно увеличить скорость канала или обеспечить отказоустойчивость сервера.
Как создать bonded-интерфейс
ip link add bond1 type bond miimon 100 mode active-backupip link set eth0 master bond1ip link set eth1 master bond1
Эти команды создают агрегированный интерфейс bond1 в режиме active-backup. Другие режимы описаны в документации ядра.
Драйвер net_failover — еще один вариант отказоустойчивого основного сетевого устройства для виртуализации. Он управляет основным устройством (например, pass-through или устройством виртуальной функции, VF) и резервным паравиртуальным интерфейсом.
VLAN
Виртуальная локальная сеть (VLAN) разделяет широковещательные домены с помощью тегирования сетевых пакетов. С VLAN администраторы группируют хосты в рамках одного коммутатора или между разными коммутаторами. Ниже показан стандартный заголовок VLAN.
Когда использовать VLAN
Используйте VLAN, чтобы разделить подсети между ВМ, пространствами имен или хостами.
Как создать VLAN
ip link add link eth0 name eth0.2 type vlan id 2ip link add link eth0 name eth0.3 type vlan id 3
Команды добавляют VLAN 2 с именем eth0.2 и VLAN 3 с именем eth0.3.
Примечание. При настройке 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
Используйте VXLAN, когда нужно выйти за пределы 4 096 VLAN или построить оверлейную сеть второго уровня поверх инфраструктуры третьего уровня — например, в крупных облачных средах. VXLAN обычно применяют в дата-центрах на виртуализированных хостах, распределенных по нескольким стойкам.
Как создать 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 и присоединять их к мосту вместе с физическим интерфейсом.
С MACVLAN физический интерфейс привязывается к пространствам имен напрямую, без моста.
У MACVLAN пять режимов.
-
Private. Режим запрещает обмен трафиком между экземплярами MACVLAN на одном физическом интерфейсе — даже если внешний коммутатор поддерживает режим hairpin.
В режиме private обмен между локальными виртуальными интерфейсами запрещен, даже если они используют одно физическое устройство eth0 -
VEPA. Данные от одного экземпляра MACVLAN к другому на том же физическом интерфейсе передаются через физический интерфейс. Для связи требуется, чтобы подключенный коммутатор поддерживал режим hairpin, либо чтобы пакеты пересылал TCP/IP-маршрутизатор.
-
Bridge. Все конечные точки соединены друг с другом напрямую через простой мост поверх физического интерфейса.
В режиме bridge виртуальные интерфейсы на одном физическом устройстве обмениваются трафиком напрямую, не покидая хост -
Passthru. Режим подключает одну ВМ напрямую к физическому интерфейсу.
В режиме passthru один виртуальный интерфейс привязывается напрямую к физическому eth0, что дает производительность, близкую к нативной -
Source. Режим фильтрует трафик по списку разрешенных MAC-адресов источника и создает ассоциации VLAN на основе MAC. Подробности — в сообщении коммита.
Выбирайте режим под задачу. Самый распространенный — bridge.
Когда использовать MACVLAN
Используйте MACVLAN, когда контейнерам нужно прямое подключение к физической сети.
Как создать MACVLAN
ip link add macvlan1 link eth0 type macvlan mode bridgeip netns add net1ip link set macvlan1 netns net1
Команды создают устройство MACVLAN в режиме bridge и назначают его сетевому пространству имен.
IPVLAN
IPVLAN похож на MACVLAN, но его конечные точки используют один общий MAC-адрес.
IPVLAN поддерживает режимы L2 и L3. В режиме L2 IPVLAN ведет себя как MACVLAN в режиме bridge: родительский интерфейс выглядит как мост или коммутатор.
В режиме L3 родительский интерфейс работает как маршрутизатор: пакеты маршрутизируются между конечными точками, что дает лучшую масштабируемость.
Когда использовать IPVLAN
В документации ядра сказано, что MACVLAN и IPVLAN во многом похожи, и выбор устройства определяет конкретный сценарий. Выбирайте IPVLAN, если верно хотя бы одно из условий:
-
Внешний коммутатор или маршрутизатор, к которому подключен Linux-хост, разрешает только один MAC-адрес на порт.
-
Число виртуальных устройств на основном интерфейсе превышает лимит MAC-адресов сетевой карты, она переходит в неразборчивый режим (promiscuous mode), и падение производительности критично.
-
Вторичное устройство находится в недоверенном пространстве имен, где настройками L2 могут злоупотребить.
Как создать IPVLAN
ip netns add ns0ip link add name ipvl0 link eth0 type ipvlan mode l2ip 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
Обычно 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
Основной сценарий MACsec — защита всех сообщений в стандартной локальной сети, включая ARP, NS и DHCP.
Как настроить MACsec
ip link add macsec0 link eth1 type macsec
Примечание. Команда только добавляет устройство macsec0 на интерфейсе eth1. Детальная настройка описана в разделе Configuration example вводной статьи о MACsec Сабрины Дуброка (Sabrina Dubroca).
VETH
Устройство VETH (virtual Ethernet) — локальный Ethernet-туннель. Устройства создаются парами.
Пакеты, отправленные с одного устройства пары, сразу принимаются на втором. Когда одно из устройств выключено, состояние канала всей пары — down.
Как создать VETH
bash
ip netns add net1ip netns add net2ip 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 netkitip -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 blueip link add nk0 type netkit peer nk1 netns blueip link set up nk0ip addr add 10.0.0.1/24 dev nk0ip -n blue link set up nk1ip -n blue addr add 10.0.0.2/24 dev nk1ping -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 barip -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 net1ip netns add net2ip 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 nlmonip link set nlmon0 uptcpdump -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 dummyip addr add 1.1.1.1/24 dev dummy1ip 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 100ip route add blackhole default table 100
Так весь трафик, исходящий из 10.0.0.0/8, будет отброшен.
IFB
Драйвер IFB (intermediate functional block) собирает трафик из нескольких источников, чтобы шейпить его, а не отбрасывать.
Когда использовать IFB
Используйте IFB, когда нужно ставить в очередь и шейпить входящий трафик.
Как создать IFB
ip link add ifb0 type ifbip link set ifb0 uptc qdisc add dev ifb0 root sfqtc qdisc add dev eth0 handle ffff: ingresstc 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 netdevsimecho "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 onip link set dev eni0np1 xdpoffload obj prog.o
Тестирование SR-IOV и devlink
Для тестирования SR-IOV добавьте симулируемому устройству виртуальные функции (VF) и назначьте им MAC-адреса:
echo 2 > /sys/bus/netdevsim/devices/netdevsim0/sriov_numvfsip link set eni0np1 vf 0 mac 00:11:22:33:44:55
Утилита devlink покажет информацию об устройстве и ресурсах, например заполненность таблицы FIB (Forwarding Information Base):
devlink dev info netdevsim/netdevsim0devlink resource show netdevsim/netdevsim0
Примечание. По умолчанию netdevsim не входит в сборку Red Hat Enterprise Linux.
ссылка на оригинал статьи https://habr.com/ru/articles/1066398/