Виртуальный интерфейс linux
Виртуальный сетевой интерфейс в linux. TAP vs TUN
Читатели, не нуждающиеся в теоретическом изложении концепции виртуальных сетевый интерфейсов Linux, могут сразу перейти к настройке по ссылкам:
Создавать сетевые интерфейсы в linux нам позволяют различные модули ядра. Но там, где для реальных железных сетевых карт эти модули ядра, или как их еще называют — драйверы, обеспечивают прием данных от стека TCP/IP и их формирование уже в виде электрического сигнала на сетевой карте, драйверы виртуальных сетевых интерфейсов (loopback) могут лишь, приняв эти данные, отдать их какому-нибудь приложению для дальнейшей обработки. Такая функциональность может быть востребована, если на вашем сервере установлены программы, использующие стек TCP/IP для обмена данными и, понятно, не нуждающиеся в выводе этих данных в реальную сеть. Пример: веб-сайт на drupal связывается с базой данных, установленной на этом же сервере:
Другим распростаренным примером использования виртуальных сетевых интерфейсов (loopback) в linux может быть их использование для целей построения виртуальных частных сетей — VPN. Вы наверняка слышали о таких технологиях как OpenVPN, GRE, WireGuard и т.д. Каждый из этих демонов создает виртуальный сетевой интерфейс который служит для прозрачной маршрутизации данных между узлами, находящимися на удалении друг от друга и не имеющих возможности прямого взаимодействия. Рассмотрим общую сетевую топологию на примере OpenVPN:
От используемого драйвера зависит тип интерфейса, его скорость, допустимый размер MTU и т. д. Совсем даже не обязательно, что загружать драйвер в ядро вам придется самостоятельно. Скорее всего, создавая интерфейс нужного типа, система сама подберет и загрузит требуемый драйвер. Вам лишь останется сконфигурировать уже работающий loopback интерфейс. В данной статье мы рассмотрим 3 возможных на конец 2016 года типа виртуальных интерфейсов в linux: tun, tap и dummy. Отличие интерфейсов tun и tap заключается в том, что tap старается больше походить на реальный сетевой интерфейс, а именно он позволяет себе принимать и отправлять ARP запросы, обладает MAC адресом и может являться одним из интерфейсов сетевого моста, так как он обладает полной поддержкой ethernet — протокола канального уровня (уровень 2). Интерфейс tun этой поддержки лишен, поэтому он может принимать и отправлять только IP пакеты и никак не ethernet кадры. Он не обладает MAC-адресом и не может быть добавлен в бридж. Зато он более легкий и быстрый за счет отсутствия дополнительной инкапсуляции и прекрасно подходит для тестирования сетевого стека или построения виртуальных частных сетей (VPN). Виртуальный интерфейс типа dummy очень похож на tap, разница лишь в том, что он реализуется другим модулем ядра.
Создаем виртуальный интерфейс в linux вручную
Создавать и удалять интерфейсы, назначать IP и MAC адреса, изменять MTU и многое другое нам помогает утилита ip. Пользоваться ip удобно и легко, но помните, что произведенные изменения будут потеряны после перезагрузки компьютера. Используйте ip в целях тестирования.
Создаем интерфейс типа tun
ip tuntap add dev tun0 mode tun
ip address add 192.168.99.1/30 dev tun0
ip address show tun0
2: tun0:
mtu 1500 qdisc noop state DOWN group default qlen 500
link/none
inet 192.168.99.1/30 scope global tun0
valid_lft forever preferred_lft forever
Как видим у нас теперь есть виртуальный интерфейс с именем «tun0», у него есть IP-адрес, и ни слова о MAC-адресе — всё, как мы и рассчитывали. Его уже можно пинговать, и на нем уже можно запускать слушающие сервисы. Но что будет, если мы попытаемся добавить этот интерфейс в бридж?
ip link set dev tun0 master br0
RTNETLINK answers: Invalid argument
Команда ip логичным образом выдала ошибку — нет никакого смысла добавлять в бридж интерфейс, не обладающий поддержкой ethernet.
Создаем интерфейс типа tap
ip tuntap add dev tap0 mode tap
ip address add 192.168.99.5/30 dev tap0
ip address show tap0
3: tap0:
mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether d6:1c:67:cd:6f:80 brd ff:ff:ff:ff:ff:ff
inet 192.168.99.5/30 scope global tap0
valid_lft forever preferred_lft forever
У нас теперь появился новый виртуальный интерфейс с именем «tap0», у него есть как IP-адрес, так и MAC-адреса. Его также можно пинговать, и на нем также можно запускать слушающие сервисы. Команда, добавляющая интерфейс в бридж уже не выдаст ошибку, потому что это интерфейс, обладающий поддержкой ethernet:
ip link set dev tap0 master br0
Создаем интерфейс типа dummy
ip link add dev dum0 type dummy
ip address add 192.168.99.9/30 dev dum0
ip address show dum0
4: dum0:
mtu 1500 qdisc noop master br0 state DOWN group default qlen 1000
link/ether 1a:37:3b:0f:da:be brd ff:ff:ff:ff:ff:ff
inet 192.168.99.9/30 scope global dum0
valid_lft forever preferred_lft forever
Вы наверняка заметили, что команда для добавления интерфейса изменилась. Ничего необычного. Так написана утилита «ip». Ну и конечно, виртуальный интерфейс типа dummy можно легко добавить в бридж:
ip link set dev dum0 master br0
Создаем виртуальный интерфейс в linux с помощью systemd-networkd
В systemd-networkd за создание интерфейсов отвечают одни конфигурационные файлы, имеющие суффикс «.netdev», а за их настройку другие, имеющие суффикс «.network». Соответственно нам понадобиться в /etc/systemd/network создать по паре конфигурационных файлов для каждого из исследуемых типов интерфейсов
Создаем интерфейс типа tun
Создадим соответственно файлы tun0.netdev с содержимым:
[NetDev]
Name=tun0
Kind=tun
Создаем интерфейс типа tap
Создадим соответственно файлы tap0.netdev с содержимым:
[NetDev]
Name=tap0
Kind=tap
Создаем интерфейс типа dummy
Создадим соответственно файлы dum0.netdev с содержимым:
[NetDev]
Name=dum0
Kind=dummy
Стоит отметить, что если вы планируете маршрутизировать траффик через виртуальные интерфейсы ( а, используя их для цели создания виртуальных частных сетей (VPN), вы точно этого хотите), то в конфигурационный файл в секии «Network» следует добавить диррективу «IPForward=yes».
Часть 33. Виртуальный сетевой интерфейс
Серия контента:
Этот контент является частью # из серии # статей: Разработка модулей ядра Linux
Этот контент является частью серии: Разработка модулей ядра Linux
Следите за выходом новых статей этой серии.
Хотя в предыдущих статьях были созданы несколько сетевых интерфейсов, однако они по-настоящему не взаимодействовали с физическим уровнем передачи данных, так как для создания подобного интерфейса необходимо иметь доступ к реальному коммуникационному оборудованию. Но в данной статье мы попробуем создать интерфейс, который будет перехватывать сетевой трафик другого интерфейса, реально существующего в системе, и обрабатывать эту информацию.
Виртуальный сетевой интерфейс
Исходный код данного примера можно найти в файле virt.c в архиве network.tgz в разделе «Материалы для скачивания», поэтому часть кода будет опущена для облегчения восприятия.
Листинг 1. Виртуальный сетевой интерфейс.
Перехват входящего трафика родительского интерфейса осуществляется установкой обработчика входящих пакетов в вызове netdev_rx_handler_unregister() , который стал доступен в API ядра, начиная с версии 2.6.36.
Рассмотрим пример работы с созданным интерфейсом, для начала проверив, что выбранный нами сетевой интерфейс действительно существует и функционирует:
После этого можно установить созданный виртуальный интерфейс и настроить его на подсеть, отличную от p7p1 :
Проще всего создать «противоположный» конец такой подсети на другом LAN-хосте, указав новый IP как alias для сетевого интерфейса этого хоста, как показано ниже.
В представленном примере используется сетевой интерфейс гипервизора виртуальных машин VirtualBox, но конфигурация интерфейса любого физического устройства выполняется аналогичным образом. Теперь из вновь созданного виртуального интерфейса мы можем проверить прозрачность сети посылкой ICMP-пакетов.
Примечание: В листинге 1 был представлен упрощённый вариант модуля, который полностью перехватывает трафик родительского интерфейса, замещая его. Но в разделе «Материалы для скачивания» в архиве network.tgz можно найти файл virt-full.с, в котором IP-адрес получателя обрабатывается корректно.
Анализ поведения интерфейса
Виртуальный сетевой интерфейс — это мощный инструмент для разработки и отладки сетевых модулей, заслуживающий отдельного рассмотрения. Процессы, происходящие в сетевом интерфейсе, сложно увидеть «в открытую» (по сравнению с интерфейсами /dev или /proc). Поэтому важной характеристикой интерфейса становится накопленная статистика о происходящих в нём процессах. Для накопления статистики работы сетевого интерфейса существует специальная структура (определенная в файле ). Из-за большого объема ниже показано только начало этой структуры:
Поля этой структуры должны заполняться в коде модуля статистическими данными проходящих пакетов (например, при передаче пакета должно инкрементироваться значение tx_packets ).
В пространстве пользователя эту структуру можно получить с помощью функции ndo_get_stats в таблице операций struct net_device_ops (эти поля были показаны в листинге 1). Модуль должен реализовать аналогичную функцию и поместить её в struct net_device_ops . Это необходимо, чтобы получить статистику сетевого интерфейса при вызове ifconfig или через интерфейс файловой системы /proc, как это реализовано для всех других сетевых интерфейсов:
Существует несколько вариантов размещения структуры net_device_stats , которая должна возвращаться пользователю:
- если модуль обслуживает единственный сетевой интерфейс, то структура может размещаться на глобальном уровне кода модуля.
- часто эта структура размещается как составная часть структуры приватных данных (которая рассматривалась в предыдущей статье), которую разработчик связывает с сетевым интерфейсом.
- можно использовать структуру, реализованную непосредственно в определении интерфейса — внутри структуры struct net_device .
Все три варианта использования можно найти в файлах virt.c, virt1.c и virt2.c в архиве network.tgz.
Заключение
После того, как мы научились «встраивать» наши сетевые интерфейсы в существующие потоки сетевого ввода/вывода, нам остаётся изучить, как непосредственно происходит обработка полученной или отправляемой информации, т.е. освоить принципы работы с сетевыми и транспортными протоколами в рамках модулей ядра.
Именно вопросы взаимодействия с сетевыми и транспортными протоколами будут рассматриваться в следующей статье данного цикла.
Настройка VLAN интерфейсов в Linux
VLAN – это аббревиатура, означающая Virtual Local Area Network (виртаульная локальная сеть). На одном физическом порту может совместно существовать несколько VLAN-сетей, которые настраиваются программными средствами Linux, а не конфигурацией физических интерфейсов (но настройка самих интерфейсов тоже требуется). С помощью VLAN можно разделить сетевые ресурсы для использования различных сервисов.
Преимущества VLAN следующие:
- Производительность
- Простота управления
- Безопасность
- Магистральные cоединения (trunk)
- Возможность разделения внутри локальной сети из соображений безопасности
- Отсутствие необходимости настройки аппаратных средств при физическом переносе сервера в другое место.
Требования к сетевому оборудованию
Чтобы использовать VLAN, вам потребуется:
- Коммутатор с поддержкой стандарта IEEE 802.1q в сети Ethernet.
- Сетевая карта, которая работает с Linux и поддерживает стандарт 802.1q .
Возможные проблемы
Наиболее распространенные при настройке VLAN в Linux проблемы следующие:
- Не все сетевые драйверы поддерживают VLAN. Может потребоваться обновление драйвера.
- Возможны проблемы с MTU. Работа VLAN основана на присвоении каждому кадру тега длиной 4 байта, то есть заголовок фактически расширяется с 14 до 18 байт. Тег VLAN содержит идентификатор (VLAN ID) и приоритет.
- Лучше не использовать VLAN ID, равный 1, так как он может быть зарезервирован для административных целей.
Подготовка для настройки VLAN интерфейсов
Сначала убедитесь, что драйвер (модуль) ядра Linux под названием 8021 загружен:
Если он не загружен, загрузите его командой modprobe:
Настройка VLAN в CentOS/RHEL/Fedora Linux
Допустим, нам нужно создать VLAN интерфейс с тегом 100 который будет работать на физическом интерфейсе eth0. Для этого создадим файл /etc/sysconfig/network-scripts/ifcfg-eth0.100 . Узнать название сетевых интерфейсов в системе можно с помощью команды ifconfig.
Создаем новый файл например с помощью редактора vim
Добавьте в него следующий код
Жирным шрифтом выделены строки которые относятся к настройкам VLAN. Остальные настройки аналогичны настройкам на физическом интерфейсе.
Если вам нужна еще одна виртуальная сеть, то создайте новый файл сетевых настроек с нужным тегом VLAN. Что бы изменения вступили в силу, перезапустите сетевую службу
Теперь можно проверить созданные интерфейсы командой ifconfig. Мы должны увидеть наш VLAN интерфейс
Конфигурация VLAN в Debian и Ubuntu
Откройте файл /etc/network/interfaces любым текстовым редактором, например nano
Добавьте в файл следующие строки:
auto eth0.100 — «поднимать» интерфейс при запуске сетевой службы
iface eth0.100 — название интерфейса
vlan-raw-device— указывает на каком физическом интерфейсе создавать VLAN.
Сохраните и закройте файл. После чего перезапустите сеть.
Важно! Если у вас используется Ubuntu версии 17.10 и выше, то необходимо установить пакет ifupdown или настраивать VLAN интерфейсы через netplan
Использование команды vconfig
Также существует команда vconfig. Она позволяет вам создавать и удалять устройства VLAN в ядре с поддержкой VLAN. Устройства VLAN – это виртуальные Ethernet-устройства, которые представляют виртуальные локальные сети в физической. Это еще один метод настройки VLAN. Чтобы добавить VLAN с ID 5 для интерфейса eth0 выполните следующую команду:
Команда vconfig add создает на интерфейсе eth0 VLAN-устройство, в результате чего появляется интерфейс eth0.5. Теперь с помощью ifconfig настроим ip адрес
Для получения подробной информации об интерфейсе выполните:
Учтите, что после перезагрузки системы этот интерфейс будет удален.
Для удаления интерфейса вручную выполните следующие действия:
Создание устройства VLAN командой ip
Для интерфейса eth0 и VLAN ID 10 выполните следующие команды:
Устройство нужно активировать и присвоить ему IP-адрес:
Весь трафик пойдет через интерфейс eth0 с тегом VLAN 10. Его смогут принять только устройства, которым сообщено о VLAN, остальные будут отклонять трафик.
Следующие команды позволяют удалить VLAN ID:
Этот интерфейс также будет удален после перезагрузки системы
Заключение
Настроить VLAN относительно несложно, но в конфигурации и используемых командах есть огромное количество различных тонкостей, которые при необходимости можно выяснить, обратившись к man-страницам соответствующих команд.
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
Виртуальные сетевые устройства в Linux: Linux Bridge
High level описание некоторых виртуальных сетевых устройств доступных в ядре Linux.
Linux Bridge
Уровень: L2
Команды:
- brctl addbr|delbr — создание и удаление;
- brctl addif|delif
—добавление интерфейса; - brctl showmacs
отобразить таблицу коммутации; - brctl show -список устройств.
Описание:
Как и физический мост, linux bridge позволяет объединить два или более ethernet сегментов в одну L2 сеть, образуя тем самым широковещательный домен, в котором каждое из устройств указанием MAC адреса (пр. broadcast адрес FF:FF:FF:FF:FF:FF) сможет обмениваться фреймами с другими устройствами из этой же сети.
Кроме того, linux bridge имеет таблицу коммутации, которая строится в ходе его работы и поддержку STP протокола для предотвращения образования петель, поэтому корректнее все таки сравнивать с физическим коммутатором, а не мостом.
Для начала работы, достаточно создать bridge используя набор утилит из пакета bridge-utils, и подключить в качестве портов необходимые физические или виртуальные интерфейсы хоста, объединив тем самым их в один сегмент.
Этот шаг отсоединит интерфейсы от сетевого стека ядра Linux и подключит их в качестве L2 интерфейсов (портов) моста, сбросив при этом их ip адреса.
Любой входящий фрейм, например, пришедший с физической сетевой карты, интерфейс которой был установлен как порт, будет попадать на обработку сначала мосту, а затем на основании таблицы коммутации доставлен им через необходимый порт дальше по стеку.
Использование на практике:
Одно из частых применений — объединение виртуальных машин или контейнеров (пр. docker0 ) в один L2 сегмент, предоставляя тем самым им возможность обмена данными, а также подключения их, например, к внешней сети, благодаря объединению с физическим интерфейсом хоста в одну сеть.
Комбинируя Linux Bridge и VLAN можно создать несколько изолированных друг от друга широковещательных доменов, получив тем самым простой tenant networking для виртуальных машин/контейнеров. Это удобной способ на канальном уровне разделить сети виртуальных машин, например в целях безопасности.
Схема соединения может выглядеть следующим образом (упрощена):
Здесь виртуальные машины VM под номерами 1,2,4 образуют один L2 сегмент, трафик которого изолирован от трафика виртуальных машин 3 и 5 благодаря использованию VLAN интерфейсов с разными VID.
Достигнуть этого можно несколькими путями. Один из них выглядит следующим образом:
- Создать два sub-интерфейса физического интерфейса eth0 с разными VID eth0.1 и eth0.2 :
2. Создать два моста br1 и br2 , каждый из которых будет объединять в L2 сегмент виртуальные машины принадлежащие одному tenant’у: RED или BLUE
3. Добавить интерфейсы виртуальных машин vm_eth0 и sub-интерфейсы eth0 к соответствующему мосту в зависимости от принадлежности к tenant’у:
Таким образом, для host1 схема соединения будет выглядеть следующим образом:
Настройка VLAN интерфейсов в Linux
VLAN – это аббревиатура, означающая Virtual Local Area Network (виртаульная локальная сеть). На одном физическом порту может совместно существовать несколько VLAN-сетей, которые настраиваются программными средствами Linux, а не конфигурацией физических интерфейсов (но настройка самих интерфейсов тоже требуется). С помощью VLAN можно разделить сетевые ресурсы для использования различных сервисов.
Преимущества VLAN следующие:
- Производительность
- Простота управления
- Безопасность
- Магистральные cоединения (trunk)
- Возможность разделения внутри локальной сети из соображений безопасности
- Отсутствие необходимости настройки аппаратных средств при физическом переносе сервера в другое место.
Требования к сетевому оборудованию
Чтобы использовать VLAN, вам потребуется:
- Коммутатор с поддержкой стандарта IEEE 802.1q в сети Ethernet.
- Сетевая карта, которая работает с Linux и поддерживает стандарт 802.1q .
Возможные проблемы
Наиболее распространенные при настройке VLAN в Linux проблемы следующие:
- Не все сетевые драйверы поддерживают VLAN. Может потребоваться обновление драйвера.
- Возможны проблемы с MTU. Работа VLAN основана на присвоении каждому кадру тега длиной 4 байта, то есть заголовок фактически расширяется с 14 до 18 байт. Тег VLAN содержит идентификатор (VLAN ID) и приоритет.
- Лучше не использовать VLAN ID, равный 1, так как он может быть зарезервирован для административных целей.
Подготовка для настройки VLAN интерфейсов
Сначала убедитесь, что драйвер (модуль) ядра Linux под названием 8021 загружен:
Если он не загружен, загрузите его командой modprobe:
Настройка VLAN в CentOS/RHEL/Fedora Linux
Допустим, нам нужно создать VLAN интерфейс с тегом 100 который будет работать на физическом интерфейсе eth0. Для этого создадим файл /etc/sysconfig/network-scripts/ifcfg-eth0.100 . Узнать название сетевых интерфейсов в системе можно с помощью команды ifconfig.
Создаем новый файл например с помощью редактора vim
Добавьте в него следующий код
Жирным шрифтом выделены строки которые относятся к настройкам VLAN. Остальные настройки аналогичны настройкам на физическом интерфейсе.
Если вам нужна еще одна виртуальная сеть, то создайте новый файл сетевых настроек с нужным тегом VLAN. Что бы изменения вступили в силу, перезапустите сетевую службу
Теперь можно проверить созданные интерфейсы командой ifconfig. Мы должны увидеть наш VLAN интерфейс
Конфигурация VLAN в Debian и Ubuntu
Откройте файл /etc/network/interfaces любым текстовым редактором, например nano
Добавьте в файл следующие строки:
auto eth0.100 — «поднимать» интерфейс при запуске сетевой службы
iface eth0.100 — название интерфейса
vlan-raw-device— указывает на каком физическом интерфейсе создавать VLAN.
Сохраните и закройте файл. После чего перезапустите сеть.
Важно! Если у вас используется Ubuntu версии 17.10 и выше, то необходимо установить пакет ifupdown или настраивать VLAN интерфейсы через netplan
Использование команды vconfig
Также существует команда vconfig. Она позволяет вам создавать и удалять устройства VLAN в ядре с поддержкой VLAN. Устройства VLAN – это виртуальные Ethernet-устройства, которые представляют виртуальные локальные сети в физической. Это еще один метод настройки VLAN. Чтобы добавить VLAN с ID 5 для интерфейса eth0 выполните следующую команду:
Команда vconfig add создает на интерфейсе eth0 VLAN-устройство, в результате чего появляется интерфейс eth0.5. Теперь с помощью ifconfig настроим ip адрес
Для получения подробной информации об интерфейсе выполните:
Учтите, что после перезагрузки системы этот интерфейс будет удален.
Для удаления интерфейса вручную выполните следующие действия:
Создание устройства VLAN командой ip
Для интерфейса eth0 и VLAN ID 10 выполните следующие команды:
Устройство нужно активировать и присвоить ему IP-адрес:
Весь трафик пойдет через интерфейс eth0 с тегом VLAN 10. Его смогут принять только устройства, которым сообщено о VLAN, остальные будут отклонять трафик.
Следующие команды позволяют удалить VLAN ID:
Этот интерфейс также будет удален после перезагрузки системы
Заключение
Настроить VLAN относительно несложно, но в конфигурации и используемых командах есть огромное количество различных тонкостей, которые при необходимости можно выяснить, обратившись к man-страницам соответствующих команд.
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.