Виртуальный сетевой интерфейс в 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».
Выделенный сервер своими руками
Навигация
Облако тегов
Мои контакты
mail:
admin@dedicatesupport.com
Партнеры
Друзья
Счетчики
Ошибка OpenVPN: Cannot open TUN/TAP dev /dev/net/tun:
Иногда при инсталляции, старте OpenVPN возникает ошибка, которая в /var/log/massages выглядит примерно так:
server openvpn[xxx]: Note: Cannot open TUN/TAP dev /dev/net/tun: No such file or directory (errno=2)
server openvpn[xxx]: Cannot allocate TUN/TAP dev dynamically
Чаще всего это означает, что устройства(файла) по указанному пути /dev/net/tun на самом деле нет. Значит создадим его. Иногда нет не только файла /dev/net/tun, но и каталога /dev/net/. Тогда и его нужно будет создать.
mkdir /dev/net
mknod /dev/net/tun c 10 200
Так же на всякий случай не мешает проверить скомпилирован ли модуль tun командой
и если его нет, попробовать его загрузить с помощью команды
Привет! Помогите ,пожалуйста,
Привет! Помогите ,пожалуйста, я пробовала так как указано выше и мне выжало ошибку:
# mkdir /dev/net
mkdir: cannot create directory ‘/dev/net’: File exists
root@test:
# mknod /dev/net/tun c 10 200
mknod: ‘/dev/net/tun’: File exists
root@test:
# lsmod | grep tun
root@test:
# modprobe tun
modprobe: ERROR: could not insert ‘tun’: Unknown symbol in module, or unknown parameter (see dmesg)
спасибо! Красава.
Выдает
Выдает ошибку.
[root@324b5c39d5 /]# modprobe tun
FATAL: Could not load /lib/modules/2.6.32-042stab090.4/modules.dep: No such file or directory
Спасибо! Помог с виртуальными
Спасибо!
Помог с виртуальными машинами XEN на debian 5
Спасибо, умный
Спасибо, умный человек!
Настраивал OVPN на Android, очень помогло!
Правда нужно было перед каждым подключением набирать это в терминале.
Чтобы упростить жизнь и запускать скрипт одной кнопкой — можно качнуть GScript с Маркета.
Я вставил туда такое:
#!/system/bin/sh
modprobe tun
lsmod | grep tun
exit 0
Может пригодиться кому 😉
Просто спас! Спасибо большое!
Просто спас! Спасибо большое!
а если выдает you must difine
а если выдает you must difine TUN/TAP в логе при старте OpenVPN. Что делать?
Мануал tun/tap
Обычно man по настройке идет с самой программой, а так же есть на сайте ее разработчика. Определитесь сначала с ПО, а затем спрашивайте про manual.
в мануале от VirtualBox есть почти все, что тебе нужно. Остальное есть в гугле 🙂
Вобщем виртуалка qemu, т.к. нравится своей нетребовательностью к ресурсам.
Теперь возникли следующие вопросы:
1. Нужна ли вообще поддержка tun/tap в ядре виртулизированной машины?
2. Используется ли вообще сетевая карта в виртуальной машине? Как известно в qemu эмулируется NE2000, поддержка которой в ядре вроде бы есть, но при попытке сделать ifconfig /dev/net/tun 192.168.5.2 (Устройство tun есть) выдается следующее:
# SIOCSIFADDR: No such device
Я так понимаю он ненаходит сетевуху? Еще раз говорю что поддержка NE2000 включена.
Прошу непинать, т.к. в этом вопросе я вообще почти ничего непонимаю и незнаю с чего начать. В англоязычных мануфлах тоже очень тяжело разбираться когда незнаешь даже основ, а гугл непомог.
Re: tun/tap
5.3.3.2.1. Static TAP interfaces
After creating a new TAP interface, you will have to create an ethernet bridge, put your Ethernet ad-
apter into promiscous mode so that it can accept frames for other interfaces as well, add it to the
bridge and then transfer the network configuration of your Ethernet adapter to the bridge.
To create a TUN device and bridge it, perform the following steps as root:
1. As root, run tunctl to create a new TAP interface:
tunctl -t tap1 -u
where is the user who wants to run VirtualBox with the new bridge.
2. Create a new bridge, which we will call br0:
brctl addbr br0
3. Put your network adapter in promiscuous mode so that it will accept Ethernet frames for MAC
addresses other than its own:
ifconfig eth0 0.0.0.0 promisc
You will lose network connectivity on eth0 at this point.
4. Add your network adapter to the bridge:
brctl addif br0 eth0
5. Transfer the network configuration of your ethernet adapter to the bridge (the following ex-
ample assumes your network adapter is configured with DHCP):
dhclient br0
Your physical Ethernet adapter will now merely act as a transport medium for the bridge.
For configurations where the network adapter is configured statically, you need to setup br0 ex-
actly as you would have set up eth0. At this point the host should have network connectivity
again.
6. Add the new TAP device to the bridge as well:
brctl addif br0 tap1
7. Activate the new TAP device:
ifconfig tap1 up
After this, you can now specify tap1 in the settings of your virtual machine, as if it were a real net-
work adapter.
Note
In order to use a static TAP interface, the VirtualBox process needs to have write access to
/dev/net/tun. Either make sure the access bits allow access or add the user of the Virtu-
alBox process to the group owning that device file.