Что такое tun интерфейс
Для чего нужен сетевой интерфейс tun?
Я заметил при запуске ifconfig, что есть сетевой интерфейс с именем tun0 и он имеет адрес ipv4. Небольшое исследование показывает, что это туннельное устройство, но я не знаю, как оно используется, что его использует и почему у него есть IP-адрес.
У меня действительно включен iptables, и, кажется, есть какая-то связь между iptables и tun, если это помогает.
Это для программного обеспечения для туннелирования. См. Статью в Википедии под названием: TUN / TAP для более подробной информации.
выдержка из страницы руководства по FreeBSD
Интерфейс tun представляет собой программный петлевой механизм, который можно свободно описать как аналог сетевого интерфейса pty (4), то есть tun делает для сетевых интерфейсов то же, что драйвер pty (4) для терминалов.
Эта socat страница документации показывает, как их можно использовать.
выдержка из документа «Сокат»
Некоторые операционные системы позволяют создавать виртуальные сетевые интерфейсы, которые подключаются не к проводной сети, а к процессу, имитирующему сеть. Часто эти устройства называются TUN или TAP.
Ссылки
Это имеет разные практические последствия. Например, при проектировании брандмауэра, если вы хотите создать внутреннюю сеть с NAT и немаршрутизируемые адреса, вы должны использовать интерфейсы TUN для создания моста фильтрации. Если у вас есть набор общедоступных IP-адресов, которые вы можете назначить внутренним хостам, но при этом все же хотите защищать весь трафик брандмауэром, вы должны использовать интерфейсы TAP для эмуляции моста Ethernet, по которому фильтруются пакеты данных. Это, между прочим, является основой того, что называют «прозрачным межсетевым экраном».
Виртуальный сетевой интерфейс в linux. TAP vs TUN
Читатели, не нуждающиеся в теоретическом изложении концепции виртуальных сетевый интерфейсов Linux, могут сразу перейти к настройке по ссылкам:
Создаем виртуальный интерфейс в 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
ip link set dev tun0 master br0
RTNETLINK answers: Invalid argument
Создаем интерфейс типа 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».
разница tun / tap, это интерфейсы, которые обрабатывают протоколы или ОС?
Введение в Open vSwitch (OVS)
Мне сложно понять разницу между интерфейсом tap и tun. Я знаю, что это часто задаваемый вопрос, и прошу прощения за это. Я задал те же вопросы о stackoverflow, и кто-то сказал мне попробовать этот форум, поэтому я надеюсь, что я нахожусь в хорошем месте. Более того, меня интересуют только сети, но я не студент или профессионал в области сетевых технологий, поэтому простите меня, если мои вопросы слишком просты для вас.
Я читал, что Tap работает на уровне 2, а tun работает на уровне 3. Я также читал, что Tap используется для соединения, а tun используется для маршрутизации. Я уже слышал такие вещи, как «МАРШРУТИЗАТОРЫ работают на уровне 3» или «МОСТЫ работают на уровне 2»: это имеет смысл для меня, потому что маршрутизаторы управляют протоколами уровня 3, а мосты управляют протоколами уровня 2? но, поскольку tap и tun являются «интерфейсами», это означает, что предложение типа «ИНТЕРФЕЙСЫ работают на уровне 3» имеет смысл, но я не понимаю, что это такое: я имею в виду, что интерфейсы не управляют протоколами (это делает ОС, но не интерфейс), поэтому это звучит как tun interface == tap interface:
Если я создаю два интерфейса крана (с tunctl) с двумя IP-адресами, которые находятся в разных сетях (192.168.2.1/24 и 192.168.3.1/24), то я связываю их с двумя виртуальными машинами kvm (интерфейс одного крана соответствует одной виртуальной машине) и если я включу маршрутизацию на хосте, две мои виртуальные машины смогут обмениваться данными.
Таким образом, интерфейсы Tap также могут использоваться для маршрутизации: в чем разница с tun? может тап это тоже интерфейс tun?
Более того, мне кто-то сказал:
Итак, я изучаю IP-соединение точка-точка и соединение Ethernet, и у меня есть другие вопросы:
Вы можете помочь мне прояснить это?
В существенный разница между TUN и TAP это уровень OSI, на котором они функционируют (это не включая программирование, необходимое для каждого типа устройства):
OpenVPN предоставляет эту информацию.
В системе может быть несколько различных типов сетевых адаптеров.
Интерфейс TAP представляет собой виртуальный адаптер Ethernet. Пакеты, проходящие через виртуальный адаптер, будут в форме кадров Ethernet с MAC-адресами источника и назначения (хотя я думаю, что они могут опустить последовательность проверки кадров, не уверен в этом). Как и в случае с настоящим адаптером Ethernet, ядро будет использовать ARP / ND для преобразования «IP-адреса следующего перехода» в MAC-адрес и будет выполнять фильтрацию MAC-адресов для входящих пакетов. Как и в случае с настоящим адаптером Ethernet, ответвительный интерфейс может (при желании) быть включен как часть моста Ethernet.
Интерфейс TUN представляет собой виртуальный «сырой» адаптер. Пакеты, проходящие через виртуальный адаптер, являются необработанными пакетами из протокола уровня 3 с дополнительным заголовком, указывающим тип пакета и флаги. Ядро не будет пытаться преобразовать IP-адрес следующего перехода в любую форму адреса нижнего уровня.
Должен ли я использовать tap или tun для openvpn?
Каковы различия между использованием dev tap и dev tun для openvpn? Я знаю, что разные режимы не могут взаимодействовать. В чем технические отличия, кроме просто слой 2 против 3 операции. Существуют ли разные характеристики производительности или разные уровни накладных расходов. Какой режим лучше. Какие функции доступны исключительно в каждом режиме.
Я выбрал «tap» при настройке VPN для друга, который владел небольшим бизнесом, потому что его офис использует множество компьютеров под управлением Windows, коммерческих принтеров и файлового сервера Samba. Некоторые из них используют чистый TCP / IP, некоторые, кажется, используют только NetBIOS (и, следовательно, нуждаются в широковещательных пакетах Ethernet), а некоторые я даже не уверен.
Но, выбрав «tap», я говорю VPN, чтобы удаленные машины чувствовали себя точно так же, как они находятся в локальной сети, с широковещательными Ethernet-пакетами и необработанными Ethernet-протоколами, доступными для связи с принтерами и файловыми серверами, а также для питания дисплея сетевого соседства. Это прекрасно работает, и я никогда не получаю сообщений о вещах, которые не работают вне офиса!
OpenVPN FAQ и HOWTO Ethernet Bridging являются отличными ресурсами по этой теме.
Если вы планируете подключать мобильные устройства (iOS или Android) с использованием OpenVPN, то вам следует использовать TUN, так как в настоящее время TAP не поддерживается на них OpenVPN :
Я начал использовать tun, но переключился на tap, так как мне не нравилось использование подсети / 30 для каждого ПК (мне нужно поддерживать Windows). Я нашел это расточительным и запутанным.
Затем я обнаружил параметр «топология подсети» на сервере. Работает с RC 2.1 (не 2.0), но дает мне все преимущества tun (без мостов, производительности, маршрутизации и т. Д.) С удобством одного (последовательного) IP-адреса на (windows) машину.
Потому что мне трудно найти простой совет:
Вам нужно использовать TAP, если вы хотите подключиться к реальной удаленной сети (принтеры, удаленные рабочие столы и т. Д.)
У меня был тот же вопрос несколько лет назад, и я попытался объяснить его в прямом выражении (которого я лично не нашел в других ресурсах) в своем блоге: Учебник по OpenVPN.
Надеюсь, это поможет кому-то
Преимущества:
TUN обычно ограничивает VPN-доступ к одному компьютеру (IP-адресу) и, следовательно, (предположительно), повышает безопасность благодаря ограниченному подключению к удаленной сети. Соединение TUN создаст меньшую нагрузку на VPN-туннель и, в свою очередь, на удаленную сеть, потому что только трафик на / с одного IP-адреса будет проходить через VPN на другую сторону. IP-маршруты к другим станциям в подсети не включены, поэтому трафик не передается через VPN-туннель, и за пределами сервера OpenVPN невозможна или практически отсутствует связь.
Необходимо определить такие ограничения, как «потребность в доступе» и «требования безопасности», а также ограничения, такие как пропускная способность сети и ограничения оборудования, прежде чем можно будет решить, подходит ли TUN или TAP для ваших нужд.
Настройка TAP практически не требует дополнительной работы от человека, который его настраивает.
Конечно, если вы знаете, как настроить TUN, но не понимаете, что делаете, и просто следуете учебнику по туннелю, вы будете бороться за настройку TAP, но не потому, что это сложнее, а потому, что вы не знаете, что вы делаете. делает. Что легко может привести к сетевым конфликтам в среде TAP, а затем это выглядит сложнее.
Дело в том, что если вам не нужен учебник, потому что вы знаете, что делаете, настройка tap занимает столько же времени, сколько и настройка tun.
с помощью tap есть много решений о подсетях, я обнаружил, что проще всего использовать подсеть класса B. site1 (Network1) с использованием 172.22.1.0/16 site2 (network2) с использованием 172.22.2.0/16 site3 с использованием 172.22.3.0/16 и т. д.
Вы используете кран, и все клиенты вместе, как в огромной корпоративной сети.
Если, однако, у каждого сайта есть свой собственный DHCP, и он должен иметь, вы должны убедиться, что вы используете ebtables или iptables или dnsmasq, чтобы заблокировать распространение dhcp, чтобы выйти из строя. Однако ebtables снизит производительность. использование dnsmasq dhcp-host = 20: a9: 9b: 22: 33: 44, игнорирование, например, будет огромной задачей для установки на всех серверах dhcp. однако, на современном оборудовании влияние ebtables не так велико. только 1 или 2%
издержки крана, примерно 32 к Туну, тоже не такая большая проблема (может быть в незашифрованных сетях), но в зашифрованных сетях обычно AES вызывает замедление.
Например, на моем wrt3200acm в незашифрованном виде я получаю 360 Мбит / с. При использовании шифрования она снижается до 54-100 Мбит / с в зависимости от того, какой тип шифрования я выберу), но openvpn не выполняет шифрование на 1500 и 2-е шифрование на 32 служебных данных. Вместо этого он выполняет однократное шифрование на 1500 + 32 издержек.
Таким образом, влияние здесь минимально.
На старом оборудовании вы можете заметить большее влияние, но на современном оборудовании оно действительно сведено к минимуму.
Шифрование между двумя виртуальными машинами с поддержкой AES позволяет мне увеличить скорость передачи TAP до 120-150 Мбит / с.
Некоторые сообщают, что выделенные маршрутизаторы с поддержкой аппаратного шифрования AES достигают 400 Мбит / с! В 3 раза быстрее, чем может сделать i5-3570k (что в моей тестовой системе не может быть выше 150 Мбит / с при 100% использования 1 ядра). Мой другой конец: E3-1231 v3, тогда было примерно 7% загрузки ЦП, около Использовалось 25% ядра openvpn. Так что E3, скорее всего, может увеличить соединение в 3-4 раза.
так что у вас будет что-то между 360 Мбит / с и 600 Мбит / с при соединении между процессором E3-1231 v3, выполняющим шифр AES265, аутентификацию SHA256 и ta.key, сертификаты tls-шифр. Я также использовал самый высокий TLS-DHE-RSA-WITH-AES- 256-SHA256
Чтобы указать на это, с tap: wrt3200acm получает до 70-80 Мбит / с с шифрованием. i5-3570k добирается до 120-150 с шифрованием. E3-1231 v3 получает не менее 360 Мбит / с с шифрованием (это интерполируется из моих выводов в случаях 1 и 2, потому что у меня не было 2 E3-1231 v3 для тестирования.)
Это мои выводы, основанные на копировании окон в окна между двумя клиентами в 2 разных подсетях, подключенных с помощью openvpn TAP
Русские Блоги
Tun / Tap интерфейс учебник- [Перевод: учебник Tun / Tap интерфейс]
оглавление
Предисловие: обратите внимание, что приведенный здесь код предназначен только для демонстрации. Если вы хотите быть серьезным, вы должны сделать его более надежным и интегрировать с другим кодом. Более того, это описание ни в коем случае не является четкой ссылкой на этот вопрос, а является результатом моих экспериментов. Пожалуйста, сообщайте о любых ошибках или ошибках, которые вы найдете в коде или этой статье. Спасибо.
Ссылка на исходный архив, описанный в статье:simpletun。
Обновление 18/07/2010: благодарственноеЭта статьяТеперь я уже знаю, что последняя версия iproute2 может (наконец-то) создавать устройства tun / tap, хотя до сих пор нет полной документации. Больше нет необходимости устанавливать tunctl (утилиты UML) или OpenVPN для создания устройства tun. Ниже приводится iproute2-2.6.34:
Tun/tap interfacesЭто функция, предоставляемая Linux (и, возможно, другими UNIX-подобными операционными системами), которая может выполнятьuserspace networking, То есть, разрешить программе пространства пользователя просматривать исходный сетевой трафик (на уровне Ethernet или IP) и выполнять любые подобные операции. В этом документе делается попытка объяснить, как работает интерфейс tun / tap в Linux, и приведен пример кода, демонстрирующий их использование.
Принцип работы
Tun / Tap интерфейсыsoftware-only interfaces, Что означает, что они существуют только в ядре, и в отличие от обычных сетевых интерфейсов, у них нет физических аппаратных компонентов (поэтому к ним не подключаются физические «провода»). Когда ядро решает отправить данные по этому интерфейсу (вместо того, чтобы отправлять их в программу пользовательского пространства на интерфейсе), настройка tun / tap аналогична обычному сетевому интерфейсу (конкретные процедуры см. Ниже). Когда программа подключается к интерфейсу tun / tap, она получает специальный файловый дескриптор, из которого можно прочитать данные, отправленные интерфейсом. Аналогичным образом, программа может записывать в этот специальный дескриптор, и данные (которые должны быть правильно отформатированы, как мы увидим) будут использоваться в качестве входных данных для интерфейса tun / tap. Для ядра это выглядит так, будто интерфейс tun / tap получает данные из «провода».
Различие между интерфейсом ответвления и интерфейсом tun заключается в том, что интерфейс ответвления выводит или принимает полный кадр Ethernet, а интерфейс tun выводит или принимает исходный пакет данных IP (а ядро не добавляет заголовок Ethernet). При создании интерфейса используйте флаг, чтобы указать, функционирует ли интерфейс как интерфейс tun или интерфейс касания.
Как только интерфейс tun / tap установлен, его можно использовать как любой другой интерфейс, что означает, что вы можете назначать IP-адреса, анализировать его трафик, создавать правила брандмауэра, устанавливать маршруты к нему и т. Д.
Обладая этими знаниями, давайте попробуем посмотреть, как мы используем интерфейс tun / tap и как его использовать.
Создать виртуальный интерфейс
Код для создания совершенно нового интерфейса и повторного подключения к постоянному интерфейсу практически одинаков, разница в том, что первый должен запускаться от имени пользователя root (точнее, с помощьюCAP_NET_ADMINФункциональные пользователи), и последний может запускаться обычными пользователями при соблюдении определенных условий. Давайте начнем с создания нового интерфейса.
Во-первых, оборудование/dev/net/tunДолжен быть открыт в режиме чтения / записи. Устройство также известно какОборудование для клонирования, Это отправная точка для создания любого виртуального интерфейса TUN / TAP. Операция (как и при любом вызове open ()) возвращает дескриптор файла. Но этого недостаточно, чтобы начать использовать его для связи с интерфейсом.
Основной код, используемый для создания виртуального интерфейса, отображается в дереве исходного кода ядра.Documentation/networking/tuntap.txtФайл. Чтобы изменить его, мы можем написать функцию barebones для создания виртуального интерфейса:
tun_alloc()Функция имеет два параметра:
Программа может использовать следующий код для создания устройства:
Эти дополнительные ioctl () все еще должны запускаться пользователем root. Но теперь у нас есть постоянный интерфейс, принадлежащий конкретному пользователю, поэтому процессы, запущенные таким пользователем, могут успешно подключиться к нему.
Как упоминалось выше, оказывается, что код (повторно), присоединенный к существующему интерфейсу tun / tap, совпадает с кодом, использованным для его создания, иными словами, tun_alloc () можно использовать снова. При этом, чтобы добиться успеха, должны произойти три вещи:
Это происходит, если пользователь выдает его, чтобы указать имя существующего интерфейса, и он является владельцем интерфейса, потому что ядро позволяетTUNSETIFF ioctl () успешно выполнен. В этом случае нет необходимости создавать новый интерфейс, поэтому обычные пользователи могут успешно выполнять операции.
Далее мы попытаемся объяснить, что происходит при вызове ioctl (TUNSETIFF), и как ядро различает запросы выделения для новых интерфейсов и запросы на подключение к существующим интерфейсам:
Вы можете посмотреть код, реализующий описанные выше шаги, в исходных файлах ядра drivers / net / tun.c; важными функциями являютсяtun_attach(),tun_net_init(),tun_set_iff(),*tun_chr_ioctl(); Эта последняя функция также реализует множество доступных ioctl (), включая TUNSETIFF, TUNSETPERSIST, TUNSETOWNER, TUNSETGROUP и т. Д.
В любом случае пользователям без полномочий root не разрешается настраивать интерфейс (т.е. назначать IP-адрес и запускать его), но то же самое верно для любого обычного интерфейса. Если пользователю без полномочий root необходимо выполнить определенные операции, требующие прав доступа root, вы можете использовать обычные методы (suid-двоичная упаковка, sudo и т. Д.).
Это возможный вариант использования (я использовал его):
использование
После такого долгого, но необходимого вступления настало время попробовать его использовать. Поэтому, поскольку это обычный интерфейс, мы можем использовать его так же, как и другой обычный интерфейс. Для наших целей нет никакой разницы между интерфейсами tun и tap: программы, которые создают или подключают к нему, должны знать его тип и ожидать или записывать данные соответственно. Мы создаем постоянный интерфейс и присваиваем ему IP-адрес:
Давайте запустим сетевой анализатор и посмотрим трафик:
Присвоение / 24 IP-адреса интерфейсу создаст маршрут соединения через интерфейс. Модифицируйте эксперимент, чтобы заставить ядро фактически что-то излучать из интерфейса tun (Примечание: ядро