Tun driver что это
Обычно, при создании VPN, используется подключение типа точка-точка к некоторому серверу, либо установка ethernet-туннеля с некоторым сервером, при котором туннелю назначается определённая подсеть. Сервер VPN при этом выполняет функции маршрутизации и фильтрования трафика для доступа к локальной сети через VPN.
Данная статья рассматривает другой подход к созданию виртуальной сети, при котором удалённые системы включаются в уже существующую локальную подсеть, а сервер VPN выполняет роль Ethernet-шлюза. При использовании такого подхода мы всё ещё имеем возможность фильтровать трафик на основании способа подключения (например, использовать для локальной сети и для удалённых пользователей разные фильтры), но исключается необходимость настройки маршрутизации, а удалённые машины включаются прямо в локальную сеть, видят ресурсы, даже способны использовать широковещательные посылки вообще без дополнительной настройки. Через такой VPN у них отображаются все компьютеры локальной сети Windows, все доступные XDMCP-серверы при XDMCP broadcast и т. д.
Структура сети и настройка сервера
Предположим, что имеется офис с локальной сетью, используется IP-подсеть 192.168.168.0/24. В эту локальную сеть мы включим домашних пользователей, то есть они будут иметь адрес из этой же самой подсети. Необходимо убедиться, что у них «дома» не встречается данная подсеть, и что никакие системы в локальной сети не имеют адресов из диапазона, который мы выделим для удалённых пользователей.
Поддержка моста в ядре
Для работы такой техники нам нужны некоторые ядерные драйвера. Это универсальный драйвер виртуальных сетевых интерфейсов tun, и драйвер ethernet-моста bridge. Можно включить их в ядро, или собрать модулями:
Если они будут собраны модулями, необходимо либо включить автоматическую загрузку модулей в ядре, либо загружать их самому перед установкой VPN-соединения.
Программное обеспечение
Для сервера потребуется OpenVPN и утилиты для обслуживания моста. В Gentoo они собираются следующим образом:
При использовании >=sys-apps/baselayout-1.12.6 этого достаточно, для более старых версий потребуются специальные утилиты для обслуживания tun/tap-устройств:
Настройка сети
Положим, eth2 — интерфейс, к которому подключена локальная сеть, с назначенным адресом 192.168.168.254. Его настройка выглядела примерно так:
Поскольку он будет участвовать в мосте, ему не нужно назначать адреса. Также, в мосте участвует вновь создаваемый виртуальный интерфейс tap0, которому тоже не назначается никакого адреса. Адрес, который использовался eth2, назначается теперь мосту br0:
Также нужно создать настроечные скрипты для указанных интерфейсов:
Достаточно автоматически загружать только интерфейс br0. depend_br0() автоматически поднимет все остальные необходимые ему для работы:
Создание ключей OpenVPN
Мы будем авторизовывать клиентов посредством RSA-ключей OpenSSL. Для упрощения процесса, для нас приготовили несколько init-скриптов:
Там есть файл vars, в который мы занесём общие значения:
Внизу этого файла мы заполняем наши переменные:
Загружаем переменные из этого файла и строим CA (Certificate Authority):
Ключ сервера
Для генерации ключа сервера с именем office, используем следующую команду:
На вопрос «Common Name» нужно ответить именем сервера (в нашем случае, office). На два вопроса в конце «Sign the certificate? [y/n]» и «1 out of 1 certificate requests certified, commit? [y/n]» отвечаем «y».
При необходимости, можно будет создать дополнительные ключи серверов. Например, это могут быть резервные серверы доступа для повышения надёжности системы. Они создаются той же командой, перед ней нужно выполнить source ./vars.
Параметры Диффи-Хеллмана
Здесь ничего дополнительно делать не придётся, но придётся подождать.
Этот файл нужен только на сервере.
Ключи клиентов
Каждому клиенту необходимо выдать свой ключ. Для клиента с именем client ключ создаётся командой
На вопрос о «Common Name» отвечаем именем клиента (в данном случае, client). На два вопроса в конце отвечаем согласием.
Сгенерированные ключи и сертификаты передаём клиентам через защищённый канал. При необходимости, можно создавать ещё ключи той же командой. Перед её запуском, необходимо загрузить окружение — выполнить source ./vars.
Настройка и запуск сервиса OpenVPN
Для запуска следует использовать следующую конфигурацию сервера (файл /etc/openvpn/openvpn.conf):
Ключ office.key должен иметь режим 600 (доступ только владельцу). Файлы office.crt и dh1024.pem имеют режим 644.
Настройка фильтрования
Поскольку мы используем мост, есть несколько особенностей организации фильтрования пакетов. Например, не все проходящие пакеты могут вообще оказаться IPv4. Для настройки работы моста в ядре существует несколько параметров:
- bridge-nf-call-arptables
Логическая переменная bridge-nf-call-arptables управляет передачей трафика ARP в цепочку FORWARD пакетного фильтра arptables. Установленное по умолчанию значение 1 разрешает передачу пакетов фильтрам, 0 – запрещает. - bridge-nf-call-iptables
Логическая переменная bridge-nf-call-iptables управляет передачей проходящего через мост трафика IPv4 в цепочки iptables. Используемое по умолчанию значение 1 разрешает передачу пакетов для фильтрации, 0 – запрещает. - bridge-nf-call-ip6tables
Действие аналогично предыдущему, только оно настраивает передачу трафика IPv6 для фильтрования в цепочки ip6tables. - bridge-nf-filter-vlan-tagged
Логическая переменная bridge-nf-filter-vlan-tagged определяет возможность передачи трафика IP/ARP с тегами VLAN программам фильтрации пакетов (arptables/iptables). Значение 1 (установлено по умолчанию) разрешает передачу пакетов с тегами VLAN программам фильтрации, 0 – запрещает.
Для фильтрования пакетов, проходящих через мост, используется соответствие physdev, которое различает, с какого и на какой порт моста следует пакет. Включаем его в ядре:
Кроме этого, конфигурация ядра должна разрешать передачу пакетов на фильтрацию iptables, т.е. bridge-nf-call-iptables=1 и bridge-nf-call-ip6tables=1 (если вы используете IPv6).
После можете использовать, например, такие правила для фильтрования:
Поподробнее про настройку фильтрации между портами поста можно почитать в статье Building bridges with Linux
Если вы не хотите делать никаких различий между пользователями LAN и пользователями bridged VPN, вы можете просто выключить эти параметры в ядре (они включены по умолчанию):
Клиенты
На клиенте необходимо создать конфигурационный файл OpenVPN следующего содержания:
Если сервер подключен через несколько провайдеров, можно повысить устойчивость сети к отказам. Для этого клиенту нужно прописать несколько опций remote, по одной на сервер, в порядке «сначала предпочтительные».
Имена файлов, указанные в параметрах ca, cert и key — это файлы, переданные через защищённый канал. Права доступа к файлу key должны быть установлены в 600.
Linux
Необходим universal tun/tap driver в ядре, либо модулем, но загруженный.
Gentoo
Соответственно, помещаем туда вышеприведённый конфиг, создаём симлинк и кладём скрипты в поддиректорию в /etc/openvpn/. В конфиге прописываем полный путь к ключу и сертификатам. Следите, чтобы имена файлов в конфиге не пересекались, во избежание неприятных эффектов!
Windows
Конфигурационный файл помещается в директорию «C:\Program Files\OpenVPN\config\» с именем вроде «office.ovpn», туда же помещаются остальные файлы — ключи и сертификаты. Если мы их помещаем в поддиректорию (например, хотим использовать несколько виртуальных сетей и все они предоставили файлы с одинаковым именем ca.crt), указываем полные пути к файлам.
Для запуска сетей можно либо запустить сервис OpenVPN (тогда будут запущены все конфигурации *.ovpn, найденные в config\), либо по отдельности — щёлкаем по файлу .ovpn правой кнопкой и выбираем «Запустить OpenVPN с этой конфигурацией».
Возможные проблемы
Проверить доступность сервера, если он запущен на TCP, можно обычным telnetом.
Windows
Нет свободного виртуального адаптера TAP
По логу OpenVPN видно, что клиент успешно присоединился к серверу, авторизовался, но не смог привязать виртуальную сеть к виртуальному адаптеру. Скорее всего, какие-то другие процессы уже задествовали все имеющиеся в системе адаптеры TAP-Win32. Это мог быть и сам OpenVPN, повисший и не отдавший адаптер.
Лечится перезагрузкой или выяснением, какие бы это могли быть процессы и принудительным их убиванием.
Ссылки
P.S. Некоторые источники почили. Ссылки я убирать не буду, но стоит иметь ввиду.
Принцип построения драйвера TUN / TAP виртуальной сетевой карты
Компьютерная система обычно состоит из одного (или группы) сетевых устройств, а именно eth0, eth1 и т. Д. Эти сетевые устройства связаны с физическими сетевыми адаптерами, которые отвечают за размещение пакетов данных по проводам (рисунок 1).
Рисунок 1. Физический сетевой адаптер.
Однако в мире виртуальной сети для восстановления, туннелирования и пересылки пакетов данных в системе требуется определенная степень внутренних каналов. Этот «внутренний конвейер» использует виртуальные сетевые устройства (например,-TUN,TAPс участиемVeth Pairs) Построен.
TUN / TAP
TUN / TAP обеспечивает прием и передачу пакетов данных для программ пользовательского пространства. Его можно рассматривать как простое двухточечное устройство или устройство Ethernet. Вместо приема пакетов данных с физических носителей оно принимает пакеты данных от программ пользовательского пространства вместо того, чтобы отправлять пакеты данных через физические носители, но записывает их в программы пользовательского пространства. . [1]
Другими словами, драйвер TUN / TAP создаст виртуальный сетевой интерфейс на хосте Linux. Функции этого интерфейса аналогичны любому другому интерфейсу, то есть вы можете назначить ему IP-адрес, анализировать трафик, направлять трафик на этот интерфейс и т. Д. Когда трафик отправляется на интерфейс, он будет отправлен в вашу программу пользовательского пространства, а не в реальную сеть.
TUN / TAP имеет 2 режима драйвера, да, как вы уже догадались - TUN и TAP.
- TUN (туннель)Устройство работает на уровне 3, что означает, что данные (пакеты), которые вы получите от файлового дескриптора, будут основаны на IP. Данные, записываемые обратно в устройство, также должны быть в форме IP-пакетов.
- TAP (Сеть TapОперация очень похожа на TUN, но она не может просто записывать пакеты данных уровня 3 в файловые дескрипторы или принимать пакеты данных уровня 3 из файловых дескрипторов, но может использовать необработанные пакеты данных Ethernet. Обычно вы увидите устройства с ответвлениями, используемые виртуализацией KVM / Qemu, где устройство TAP назначается виртуальному гостевому интерфейсу в процессе создания.
Рисунок 2. Виртуальное устройство TUN / TAP.
Пара VETH
Устройства Veth представляют собой пару подключенных виртуальных интерфейсов Ethernet [2], которые можно рассматривать как виртуальные перемычки. Окончательный результат будет показан на другом конце.
Это делает пару veth очень подходящей для соединения различных компонентов виртуальной сети (таких как мосты Linux, мосты OVS и контейнеры LXC).
Типичный вариант использования пар vestack - это OpenStack Neutron. В случае использования пары ve для соединения нескольких мостов Linux вместе, в настоящее время вы не можете сделать это с устройствами на базе Tap.
Рисунок 3. Виртуальное устройство Veth.
Наконец, мы проводим параллельное сравнение ранее описанных сетевых устройств (рисунок 4).
Рисунок 4. Физическое оборудование, сетевое оборудование TUN / TAP и Veth.
источник
Введение
Драйвер Tun / tap для виртуальной сетевой карты - это проект с открытым исходным кодом, который поддерживает множество UNIX-подобных платформ, на его основе OpenVPN и Vtun для реализации инкапсуляции туннельных пакетов. В этой статье будет представлено использование драйвера tun / tap и проанализированы идеи дизайна драйвера tun / tap виртуальной сетевой карты в среде Linux.
Используйте драйвер tun / tap
В версии ядра Linux 2.4 и новее драйвер tun / tap предварительно скомпилирован в ядро по умолчанию. Перед использованием убедитесь, что модуль tun / tap загружен и файл устройства создан:
Параметр c указывает, что это символьное устройство, а 10 и 200 - это старший номер устройства и младший номер устройства соответственно.
Таким образом, мы можем использовать драйвер в программе.
После вызова вышеуказанной функции вы можете использовать команду ifconfig для настройки виртуальной сетевой карты в командной строке оболочки.С помощью сгенерированного дескриптора символьного устройства используйте функции чтения и записи в программе для чтения или отправки данных на виртуальную сетевую карту.
Принцип работы драйвера Tun / Tap
Как драйвер виртуальной сетевой карты, прием и отправка данных драйвера Tun / tap не имеет прямого отношения к реальной сетевой карте, а пересылается через пользовательский режим. В Linux существует множество способов реализовать взаимодействие между состоянием ядра и данными состояния пользователя: вы можете создавать специальные сокеты с общими сокетами и использовать сокеты для взаимодействия с данными; создавать файлы через файловую систему proc для взаимодействия с данными; вы также можете Используя метод файла устройства, доступ к файлу устройства вызовет соответствующую процедуру драйвера устройства. Драйвер устройства сам по себе является интерфейсом между состоянием ядра и состоянием пользователя. Драйвер Tun / tap использует файл устройства для реализации взаимодействия данных между состоянием пользователя и состоянием ядра.
Структурно драйвер Tun / tap - это не просто драйвер сетевой карты, но он также реализует драйвер символьного устройства. Соедините пользовательский режим и основной режим с помощью символьных устройств. Ниже приводится схематическая диаграмма:
Ниже приведена определенная структура устройства tun / tap:
Структура struct net_device - это унифицированная структура сетевого устройства, предоставляемая ядром Linux, которая определяет унифицированный интерфейс доступа для системы.
Процедура обработки драйвера сетевой карты, реализованная в драйвере Tun / tap:
static int tun_net_open(struct net_device *dev);
static int tun_net_close(struct net_device *dev);
static int tun_net_xmit (struct sk_buff * skb, struct net_device * dev); // Подпрограмма отправки пакета данных
static void tun_net_mclist (struct net_device * dev); // Устанавливаем список адресных ссылок для многоточечной передачи
// Когда приложению необходимо знать некоторые статистические данные сетевого интерфейса, оно может вызвать эту функцию, например ifconfig, netstat и т. Д. Чтобы
static struct net_device_stats *tun_net_stats(struct net_device *dev);
int tun_net_init (struct net_device * dev); // Начальная процедура сетевого устройства
Часть символьного устройства:
В Linux символьные устройства и блочные устройства доступны в виде файлов, а интерфейсы для доступа к ним унифицированы. Все они используют функцию open () для открытия файла устройства или обычного файла и используют функции read () и write () для чтения и записи. Файлы и тд. Интерфейсы доступа символьных устройств, определенные драйвером Tun / tap, следующие:
Используйте функцию misc_register () в ядре, чтобы зарегистрировать драйвер как нестандартный драйвер символьного устройства и предоставить различные программные интерфейсы символьного устройства. Код взят из linux-2.4.20 \ linux-2.4.20 \ drivers \ net \ tun.c
Используйте функцию ioctl () для управления файловым дескриптором символьного устройства, вызовите tun_chr_ioctl в символьном устройстве, чтобы установить открытое устройство tun / tap, если флаг установлен в TUNSETIFF, вызовите функцию tun_set_iff (), эта функция завершит очень важный шаг Операция заключается в регистрации драйвера сетевой карты с помощью register_netdev (& tun-> dev). Ловушка каждой процедуры обработки драйвера сетевой карты инициализируется функцией tun_chr_open () во время операции открытия.
Рабочий процесс оборудования Tun / tap:
Драйвер виртуальной сетевой карты, предоставляемый устройством Tun / tap, не отличается от реального драйвера сетевой карты с точки зрения стека протоколов tcp / ip. С точки зрения драйвера, она отличается от реальной сетевой карты тем, что данные, полученные устройством tun / tap, поступают не из физической ссылки, а из области пользователя. Драйвер устройства Tun / tap использует файл символьного устройства для реализации данных из области пользователя. Доступа. При отправке данных устройство tun / tap не отправляется по физической ссылке, а отправляется в пользовательскую область через символьное устройство, а затем отправляется программой пользовательской области по другим каналам.
Процесс отправки:
Процесс получения данных:
Когда мы используем системный вызов write () для записи данных в файл символьного устройства устройства tun / tap, будет вызвана функция tun_chr_write. Она использует tun_get_user для получения данных из пользовательской области, которая сохраняет данные в skb, а затем вызывает ключевую функцию netif_rx (skb) отправляет skb в стек протоколов tcp / ip для обработки и завершает прием данных виртуальной сетевой карты.
резюме
В драйвере tun / tap удачно сочетаются символьный драйвер и драйвер сетевой карты. Эта статья посвящена анализу связи между двумя драйверами. Подробности обработки конкретного драйвера не указаны. См. Соответствующие документы.
- «Драйвер устройства Linux, второе издание», (США) Алессандо Рубини
- исходный код linux
основная концепция
A gateway to userspace。
TUN/TAP: The user-space application/VM can read or write an ethernet frame to the tap interface and it would reach the host kernel, where it would be handled like any other ethernet frame that reached the kernel via physical (e.g. eth0) ports. You can potentially add it to a software-bridge (e.g. linux-bridge)
использовать
Используется для шифрования, VPN, туннелирования, виртуальных машин и т. д. (шифрование, VPN, туннелирование, виртуальные машины). Чтобы
Назначение устройства tun / tap - пересылать некоторые пакеты данных в стеке протоколов прикладной программе пользовательского пространства, предоставляя программе пользовательского пространства возможность обрабатывать пакет данных. Таким образом, в приложении могут быть реализованы наиболее часто используемые функции сжатия, шифрования и других данных. Наиболее часто используемым сценарием для устройств tun / tap является VPN, включая туннель и IPSec прикладного уровня.
Применение tap / tun в libvirt
VPN
veth, tun, нажмите сравнение
Tun - это двухточечное устройство, а Tap - это обычное устройство карты Ethernet. Другими словами, устройству tun вообще не нужно иметь физический адрес. Пакет, который он получает и отправляет, не требует arp и не должен иметь заголовок уровня канала данных. Устройство ответвления имеет полный физический адрес и полный кадр Ethernet.
TAP (network tap) operates much like TUN however instead of only being able to write and receive layer 3 packets to/from the file descriptor it can do so with raw ethernet packets. You will typically see tap devices used by KVM/Qemu virtualization, where a TAP device is assigned to a virtual guests interface during creation.
Пример (из интернета)
пример программы
После получения пакета данных устройства tun распечатайте только количество полученных байтов пакета данных и больше ничего не делайте.
int tun_alloc(int flags)
struct ifreq ifr;
int fd, err;
char *clonedev = "/dev/net/tun";
if ((fd = open(clonedev, O_RDWR)) < 0) return fd;
>
printf("Open tun/tap device: %s for reading. \n", ifr.ifr_name);
int tun_fd, nread;
char buffer[1500];
/* Flags: IFF_TUN - TUN device (no Ethernet headers)
* IFF_TAP - TAP device
* IFF_NO_PI - Do not provide packet information
*/
tun_fd = tun_alloc(IFF_TUN | IFF_NO_PI);
if (tun_fd < 0) perror("Allocating interface");
exit(1);
>
while (1) nread = read(tun_fd, buffer, sizeof(buffer));
if (nread < 0) perror("Reading from interface");
close(tun_fd);
exit(1);
>
printf("Read %d bytes from tun/tap device\n", nread);
>
return 0;
>
Справочные материалы
kernel doc tuntap
virtual networking devices in linux
Linux Networking Explained
Tun/Tap interface tutorial
TUN, TAP and Veth - Virtual Networking Devices Explained
Связь между сетевой картой виртуальной машины и устройством ответвления на мосту Linux
настройка виртуального сетевого устройства Linux
Драйверы
В этом посте рассказывается о адаптерах TAP-Windows , о том, что они собой представляют, зачем они нужны для VPN и где можно скачать драйверы TAP. Мы также покажем вам, как установить, обновить или удалить драйвер TAP.
Если вы откроете Настройки в Windows 10, вы увидите программу под названием TAP-Windows.
Пользователи Windows 10/8/7/Vista увидят его на панели управления .
Если вы откроете Диспетчер устройств и развернете Адаптеры, вы также увидите его там.
Читать . Где скачать драйверы для Windows 10.
Что такое адаптеры TAP-Windows
TAP-Windows обеспечивает функциональность виртуального устройства TAP в ОС Windows. Он устанавливается в папку C: \ Program Files \ TAP-Windows и требуется для работы программного обеспечения VPN.
Устройства TAP – это устройства ядра виртуальной сети, полностью поддерживаемые программным обеспечением и не поддерживаемые аппаратными сетевыми адаптерами. Драйверы TAP используются для работы устройств TAP и имеют низкоуровневую поддержку ядра для туннелирования Ethernet.
Вам не нужно устанавливать TAP-окна отдельно, так как ваши установщики VPN включают их и устанавливают автоматически вместе с программным обеспечением VPN.
Драйвер TAP-Windows бывает двух типов:
- NDIS 6 (TAP-windows6, версия 9.21.x) для Windows 10/8/7/Vista.
- Драйвер NDIS 5 (TAP-windows, версия 9.9.x) для Windows XP.
Иногда вы можете столкнуться с проблемами , вызванными этим драйвером. Давайте посмотрим на некоторые из них.
Адаптеры TAP-Windows в этой системе в настоящее время используются
Вы увидите, что одно из локальных подключений будет иметь имя TAP-Windows Adapter . Щелкните правой кнопкой мыши по нему и выберите Отключить . Через несколько секунд снова щелкните его правой кнопкой мыши и выберите Включить . Теперь попробуйте подключиться снова и посмотреть, работает ли он.
Если у вас возникают другие проблемы с запуском вашего программного обеспечения VPN, я предлагаю вам открыть панель управления и оттуда либо восстановить , либо удалить и переустановить программное обеспечение VPN и посмотреть. Во время ремонта/установки будут установлены драйверы TAP.
Если вы хотите удалить, отключить или обновить TAP-Windows, из меню WinX Windows 10, откройте Диспетчер устройств и разверните Адаптеры, вы увидите Адаптер TAP-Windows v9.
Щелкните правой кнопкой мыши на нем, и вам предложат варианты обновить, отключить или удалить драйвер.
В этой системе нет адаптеров TAP-Windows
Запустите его установщик. После завершения установки драйвера перезагрузите компьютер и проверьте.
Если ваше Интернет-соединение перестает работать, вы можете удалить этот адаптер и посмотреть, поможет ли это вам. Если это не так, возможно, вам нужно удалить и переустановить последнюю версию этого драйвера заново .
Виртуальное устройство TUN / TAP ядра Linux отличается от других устройств ядра: его отправка и получение пакетов данных завершаются в стеке сетевых протоколов. Отправленные пакеты данных не покидают стек протоколов и не входят в физическую сеть. Вы получите пакеты данных, которые входят в стек протоколов, из физической сети.
Узел пользовательского пространства / dev / net / tun используется для чтения и записи устройств TUN / TAP.Когда устройство TUN / TAP в ядре отправляет пакет данных, оно отправляет пакет данных в дескриптор файла / dev / net / tun, связанный с ним. Сокет, пространство пользователя может читать данные с узла устройства. Когда программа пользовательского пространства записывает данные в дескриптор файла / dev / net / tun, драйвер TUN / TAP вызывает функцию приема пакетов ядра (например, netif_rx) для отправки принятого пакета в стек сетевого протокола, как если бы пакет был То же самое получено от физической сети.
Используя устройства TUN / TAP, можно реализовать различные туннели, как показано на следующей диаграмме:
Программа обработки туннеля слева на рисунке считывает пакеты данных, отправленные сетевым приложением, из дескриптора файла / dev / net / tun и после обработки, например, шифрования, отправляет их на удаленный конец через сокет (сеть 19.1.1.0). После получения пакета данных через сокет справа программа обработки туннеля на рисунке обрабатывается, например, дешифруется, а затем записывается в дескриптор файла / dev / net / tun, и программа сетевого приложения получает исходный пакет данных от ядра. Когда правое веб-приложение отвечает на пакет данных, оно возвращается к левому приложению по тому же пути.
Создайте устройство TUN / TAP с помощью IP-команд.
Различие между устройством TUN и устройством TAP состоит в том, что устройство TUN обрабатывает пакеты данных IP. Устройство TAP требует пакеты данных Ethernet. Первое работает в сети уровня 3, а второе - в сети уровня 2.
Функция tun_setup инициализирует относящиеся к пользователю атрибуты (владельца / группы) в частной структуре устройства TUN / TAP и устанавливает размер очереди отправки равным TUN_READQ_SIZE (500). Эта функция вызывается при создании устройства.
Давайте посмотрим на вторую часть создания устройства с символами разного типа. Наиболее важной частью является структура файловой операции tun_fops узла устройства.
tun_fops определяет чтение и запись файлов устройств с разными символами и функций обработки системных вызовов ioctl.
Сначала программа прикладного уровня открывает узел устройства / dev / net / tun, который обрабатывается функцией open (tun_chr_open) члена структуры tun_fops, ранее связанного с этим узлом в ядре. Создайте сокет протокола Tun (tun_proto) в ядре. Вы можете видеть, что на самом деле размещена большая структура типа tun_file (первым членом является struct sock), а затем этот сокет и открытый дескриптор файла tun Сделать взаимные связи. tun_socket_ops - это набор рабочих функций сокета, в настоящее время существует только два sendmsg и recvmsg. Эти две функции соответствуют операциям записи и чтения узла устройства соответственно.
Затем программа прикладного уровня использует параметр команды TUNSETIFF системного вызова ioctl для управления дескриптором файла узла устройства tun, полученного на предыдущем шаге, для создания сетевого устройства TUN / TAP. Функция tun_chr_ioctl ядра обрабатывает вызов ioctl. Создание сетевого устройства выполняется функцией tun_set_iff Реализация. После завершения создания член dev в tun_struct указывает на вновь созданную структуру устройства (net_device).
Прикладная программа использует флаг IFF_TUN / IFF_TAP для различения типа созданного устройства. Она хранится в элементе flags структуры tun_struct в ядре. Эта структура tun_struct выделяется при выделении структуры net_device. Функция tun_net_init специально обрабатывает различия между устройствами TUN / TAP.
Из кода инициализации TUN / TAP видно, что устройство TUN представляет собой устройство «точка-точка» с длиной сетевого заголовка 2 уровня 0 и без ARP, а устройство TAP является виртуальным устройством Ethernet со стандартным Ethernet. Функция ether_setup устанавливается и генерируется случайный аппаратный MAC-адрес. Первый набор функций работы устройства использует tun_netdev_ops, а второе устройство TAP использует tap_netdev_ops.
До сих пор ядро tun_struct, представляющее устройство TUN / TAP, и само устройство (net_device) были в основном инициализированы. Затем вам нужно связать tun_struct с открытым дескриптором устройства TUN / TAP. То есть указатель структуры tun_struct назначается члену tun файла tun_file, см. Функцию tun_attach.
Из процесса создания TUN / TAP может быть известно, что узел устройства / dev / net / tun является входом операции, и новое сетевое устройство может быть создано с использованием его файлового дескриптора.
Операция записи завершается функцией tun_chr_write_iter (в конечном итоге реализуемой функцией tun_get_user). Выделите skb, скопируйте пакет данных, вызовите tun_rx_batched (внутренний вызов netif_receive_skb (skb)) для получения данных в стек протоколов ядра.
Если функция tun_get_user запускается с помощью sendmsg, а количество страниц в элементе структуры msghdr struct iovec * msg_iov не превышает значение, определенное макросом MAX_SKB_FRAGS, функция tun_get_user может получить нулевую копию пакета данных, что реализуется функцией zerocopy_sg_fromiter:
Если пользователь устанавливает параметр IFF_NAPI при создании ioctl, драйвер TUN / TAP зарегистрирует функцию обработки опроса NAPI tun_napi_poll. В настоящее время функции tun_get_user нужно только добавить skb в очередь sk_write_queue носка, связанного с дескриптором файла, и вызвать napi_schedule Функция poll получает пакет данных.
Операция чтения завершается функцией tun_chr_read_iter (наконец, реализуемой tun_do_read). Данные, полученные TUN / TAP, хранятся в tx_array (struct skb_array) члена структуры tun_file. Tx_array - это структура кольца. Операция чтения файла TUN / TAP используется в качестве потребителя кольца. Производителем является сетевое устройство TUN / TAP. Данные отправляются, и стек протоколов ядра направляет пакет данных на устройство TUN / TAP.
Кроме того, в ядре есть выделенный драйвер tap (drivers / net / tap.c) для использования с macvtap и ipvtap, аналогичный драйверу TUN / TAP (drivers / net / tun.c).
В нынешних облачных эпохи это виртуальная машина и контейнер повсюду. Управление сетью за ними неотделима с виртуальных сетевых устройств, поэтому я понимаю, что устройства виртуальных сетей полезны для нас, лучше понять сетевую структуру облучения. Из этой статьи будет представлен устройство виртуального сетевого устройства под Linux.
Разница между виртуальным оборудованием и физическим оборудованием
существоватьПроцесс получения сетевого пакета Linuxс участиемПроцесс доставки пакета данныхВ этих двух статьях вводится пакеты данных, и существует управление сетевым устройством в ядре Linux, которое отвечает за взаимодействие данных между драйвером сети и стеком протокола. Привод не должен понимать детали стека протокола, и стек протокола не должен понимать детали драйвера устройства.
Для сетевого устройства, как и труба (труба), есть оба конца, и данные, полученные от любого конца, будут отправлены с другого конца.
Например, физическая сетевая карта ETH0, которая является стеком протокола ядра (косвенная связь через модуль управления сетевым устройством ядра) и внешнюю физическую сеть, данные, полученные от физической сети, будут пересылать стек протокола ядра, а также приложение Данные из стека протокола будут отправлены физической сетью.
Так что насчет виртуального сетевого устройства? Во-первых, он также возвращает управление подсистемой сетевого устройства управления ядром. Для модуля управления сетевыми устройствами Linux INNUX, виртуальное оборудование и физические устройства не различаются, они являются сетевыми устройствами, они могут настроить IP, из сетевых устройств, будет давать Стек протокола, данные стека протокола, также отправят его к сетевому устройству. Как только я отправлю его, куда идти, это устройство, управляемое устройством, она не связана с ядром Linux, так Я сказал виртуальное сетевое оборудование. Один конец также является стеком протокола, а другой конец зависит от осуществления вождения виртуального сетевого устройства.
Какой другой конец тун / кран?
Сначала посмотрите на картину и говорите:
Существует два приложения A и B в вышеупомянутой рисунке, все в пользовательском слое, в то время как другие розетки, стек протокола emork и сетевые устройства (eth0 и tun0) находятся в слое ядра, на самом деле сокет является частью стека протокола , Цель здесь состоит в том, чтобы увидеть более интуитивно понятно.
TUN0 - это виртуальное устройство Tun / Tap, которое может видеть разницу в нем и физическом устройстве ETH0, хотя и конец стека протокола, но другой конец отличается, другой конец ETH0 является физической сетью, эта физика Сеть может быть переключателем, а другой конец TUN0 представляет собой программу пользовательского слоя, а стек протокола отправляется в TUN0, который будет прочитан этим приложением, и приложение может писать данные непосредственно к TUN0.
Здесь предполагается, что IP, сконфигурированный ETH0, составляет 10,32,0,11, в то время как TUN0 настраивает IP IP 192.168.3.11.
Вот типичный сценарий приложения устройства TUN / TAP / TAP, который отправляется в сеть 192.168.3.0/24 через туннель программы B, с использованием 10,32,0.11 до 10.33.0.1 от удаленной сети, а затем 10.33.0.1 вперед Соответствующее устройство, тем самым реализующее VPN.
Давайте посмотрим на процесс пакетов:
Приложение A является обычной программой, которая отправляет пакет через сокет A, предполагая, что IP-адрес назначения этого пакета 192.168.3.1
Гукет бросает этот пакет в стек протокола
Стек протокола основан на IP-адресе назначения пакета.
После того, как Tun0 получил пакет, было обнаружено, что другой конец был открыт процессом B, поэтому пакет был брошен в процесс B.
Процесс B После получения пакета, выполните некоторую обработку, связанную с бизнесом, затем построить новый пакет, встроить оригинальный пакет в новый пакет, и, наконец, пересылать пакет через сокет B, на этот раз новый исходный адрес пакета становится Адрес ETH0 и IP-адрес назначения превращает дополнительный адрес, такой как 10,33.0.1.
Разъем B Положите пакет в стек протокола
Стек протокола основан на локальной маршрутизации. Установлено, что этот пакет должен быть отправлен через eth0, поэтому его будет дано в eth0.
ETH0 посылает пакет через физическую сеть.
Здесь здесь не обсуждается связь с процессом B слоя пользователя. Для ядра Linux есть много способов обмениваться данными для космического пространства ядра и процесса пространства пользователей.
Как видно из вышеуказанного процесса, в каких сетевых устройствах выбираются из пакетов, которые контролируются таблицей маршрутизации, поэтому, если мы хотим, чтобы некоторые сетевые трафик выполнить процесс пересылки приложения B, необходимо настроить таблицу маршрутизации, чтобы позволить Эта часть данных принимает Tun0.,
Что такое использование оборудования Tun / Tap?
Различия между Tun и Tap
Программы пользовательских слоев могут только прочитать и записывать IP-пакеты через устройства TUN, при прочтении и записи пакетов со ссылкой на пакеты с помощью устройств Tap Taps, аналогично различию в обычной розетке и сырой розетке, формат пакетов обработки отличается.
Пример
Образец программы
Здесь написана программа. После получения пакета данных устройства TUN, только сколько байтов пакета данных были напечатаны, а другой не делают ничего, как программировать, пожалуйста, обратитесь к ссылке ссылки позже.
Демонстрация
Вывод
Обычно мы используем оборудование Tun / Tap, есть не так много возможностей, но из-за его простой структуры, возьмите его, чтобы понять, что оборудование для виртуального сетевого устройства неплохое, давайте следуем более сложным виртуальным сетевым оборудованием под Linux, такими как мосты. Отказ
Читайте также: