Виртуальный сетевой интерфейс в linux. TAP vs TUN
Читатели, не нуждающиеся в теоретическом изложении концепции виртуальных сетевый интерфейсов Linux, могут сразу перейти к настройке по ссылкам:
- #Создаем интерфейс типа tun с помощью ip
- #Создаем интерфейс типа tap с помощью ip
- #Создаем интерфейс типа dummy с помощью ip
- #Создаем интерфейс типа tun с помощью systemd-networkd
- #Создаем интерфейс типа tap с помощью systemd-networkd
- #Создаем интерфейс типа dummy с помощью systemd-networkd
Создавать сетевые интерфейсы в 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».
Форум русскоязычного сообщества Ubuntu
Страница сгенерирована за 0.034 секунд. Запросов: 25.
- Сайт
- Об Ubuntu
- Скачать Ubuntu
- Семейство Ubuntu
- Новости
- Форум
- Помощь
- Правила
- Документация
- Пользовательская документация
- Официальная документация
- Семейство Ubuntu
- Материалы для загрузки
- Совместимость с оборудованием
- RSS лента
- Сообщество
- Наши проекты
- Местные сообщества
- Перевод Ubuntu
- Тестирование
- RSS лента
© 2012 Ubuntu-ru — Русскоязычное сообщество Ubuntu Linux.
© 2012 Canonical Ltd. Ubuntu и Canonical являются зарегистрированными торговыми знаками Canonical Ltd.
Как создать виртуальный интерфейс linux
Для добавления или удаления виртуальных сетевых интерфейсов не нужно использовать утилиту netifcfg . Требуется вручную отредактировать файл /etc/ifaliases.cf .
Список поддерживаемых виртуальных интерфейсов представлен в главе « Настройка и создание виртуальных сетевых интерфейсов .
Процедура добавления будет рассмотрена на примере 802.1Q интерфейса.
1. Войдите в Linux bash.
2. Создайте виртуальный 802.1Q интерфейс (данная процедура подробно описана в главе « Настройка и создание виртуальных сетевых интерфейсов » ).
3. Определите в нотации Linux имя нового виртуального сетевого интерфейса:
root@Hub1-0:~# ip link show
1: lo: mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
link/ether 00:50:56:9e:84:31 brd ff:ff:ff:ff:ff:ff
3: eth1: mtu 9000 qdisc pfifo_fast master br0 state UP mode DEFAULT group default qlen 1000
link/ether 00:50:56:9e:bf:69 brd ff:ff:ff:ff:ff:ff
4: eth2: mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
link/ether 00:50:56:9e:f5:ec brd ff:ff:ff:ff:ff:ff
5: eth1.4000@eth1: mtu 1400 qdisc noqueue state UP mode DEFAULT group default qlen 1000
link/ether 00:50:56:9e:bf:69 brd ff:ff:ff:ff:ff:ff
Вывод консоли свидетельствует о том, что в системе присутствуют 802.1 Q интерфейс с именем eth1.4000.
4. Добавьте 802.1Q интерфейс eth1.4000 в файл /etc/ifaliases.cf (выделено жирным):
Примечание: Место добавления интерфейса в файл / etc /ifaliases.cf влияет только на порядок отображения его в консоли cisco — like .
root@Hub1-0:~# vim.tiny /etc/ifaliases.cf
interface (name=»GigabitEthernet0/0″ pattern=»eth0″)
interface (name=»GigabitEthernet0/1″ pattern=»eth1″)
interface (name=»GigabitEthernet0/1.4000″ pattern=»eth1.4000″)
interface (name=»GigabitEthernet0/2″ pattern=»eth2″)
interface (name=»default» pattern=»*»)
· значение параметра name должно иметь следующий шаблон:
· значение параметра pattern должно совпадать с именем 802.1Q интерфейса в нотации Linux.
5. Пересчитайте контрольную сумму файла /etc/ifaliases.cf:
root@Hub1-0:~# integr_mgr calc -f /etc/ifaliases.cf
SUCCESS: Operation was successful.
6. Перезапустите VPN сервис:
root@Hub1-0:~# service vpngate restart
Теперь интерфейс GigabitEthernet0/1.4000 должен быть доступен к заданию политики СКЗИ и правил МЭ посредством консоли Cisco-like и LSP, а также к конфигурированию посредством консоли Cisco-like.
7. Процедура удаления выполняется аналогично процедуре добавления.
Создать виртуальный сетевой dummy интерфейс в Linux
Если нужно что-то потестировать, маршруты там или что еще, а трогать существующие сетевые интерфейсы не хотелось бы, можно создать новый виртуальный сетевой интерфейс, назначить ему ip-адрес и пользоваться вполне реально.
Создаем на хосте новый dummy интерфейс:
$ sudo modprobe dummy
$ sudo ip link add virtual-eth0 type dummy
$ ip link show virtual-eth0
Назначаем ему какой-либо адрес:
$ sudo ip addr add 192.168.250.1/24 brd + dev virtual-eth0 label virtual-eth0:0
$ sudo ip link set dev virtual-eth0 up
Теперь если на другом компе назначить маршрут до сети 192.168.250.0/24:
C:\Windows\system32>route add 192.168.250.0 mask 255.255.255.0 192.168.2.195
то можно будет пинговать этот ip (192.168.250.1) снаружи хоста.
Если этот интерфейс больше не нужен, то его можно удалить:
$ sudo ip addr del 192.168.250.1/24 brd + dev virtual-eth0 label virtual-eth0:0
$ sudo ip link delete virtual-eth0 type dummy
$ sudo rmmod dummy
После перезагрузки dummy интерфейс будет удален. Или если выгрузить модуль dummy:
$ sudo rmmod dummy
Авторизуйтесь для добавления комментариев!

Почтовый сервер Mikrotik VPN 3proxy Шифрование Squid Резервное копирование Защита почты Виртуальные машины Настройка сервера java kvm Групповые политики SELinux OpenVPN IPFW WDS Lightsquid Samba firewalld systemd Mobile libvirt Remote desktop WiFi Iptables NAT Postfix Dovecot Удаление данных Софт Безопасность Winbox User agent Хостинг Передача данных Онлайн сервисы Privacy LetsEncrypt VPN сервер Настройка прокси RRDTool sendmail Rsync Linux SSH Система Windows Синхронизация Облако fail2ban FreeBSD