- How to create a virtual network interface in Ubuntu?
- 2 Answers 2
- Linux: Create virtual network interface
- Create virtual network interfaces on Linux
- Closing Thoughts
- Related Linux Tutorials:
- Виртуальный сетевой интерфейс в linux. TAP vs TUN
- Создаем виртуальный интерфейс в linux вручную
- Создаем интерфейс типа tun
- Создаем интерфейс типа tap
- Создаем интерфейс типа dummy
- Создаем виртуальный интерфейс в linux с помощью systemd-networkd
- Создаем интерфейс типа tun
- Создаем интерфейс типа tap
- Создаем интерфейс типа dummy
How to create a virtual network interface in Ubuntu?
I’m testing a network program on Ubuntu. Is there any way to create a virtual network interface in Ubuntu. Something like lo is good, but unfortunately there is bunch of packets on lo with 127.0.0.1 as source and destination IP addrress.
2 Answers 2
USE CASE: To create a persistent VIP address in a server to function as a ‘loopback’ address
Change to /etc/systemd/network/ directory
user@server:~$ cd /etc/systemd/network/
Create two files, ‘vip.netdev’ and ‘vip.network’
user@server:/etc/systemd/network$ touch vip.netdev vip.network
Show the newly created files
user@server:/etc/systemd/network$ ls vip.netdev vip.network
Edit the two files with your favorite editor to reflect the detail below
user@server:/etc/systemd/network$ more vip.netdev [NetDev] Name=vip Kind=dummy
user@server:/etc/systemd/network$ more vip.network [Match] Name=vip [Network] Address=172.16.1.23 (or whatever address you so choose) Mask=255.255.255.255 Broadcast=172.16.1.255 (match the Address x.x.x.255)
Enable the newly created VIP interface w/out rebooting the server
user@server:/etc/systemd/network$ systemctl restart systemd-networkd
Show the newly create VIP interface
user@server:/etc/systemd/network$ ifconfig ens33: flags=4163 mtu 1500 inet 172.16.1.16 netmask 255.255.255.0 broadcast 172.16.1.255 inet6 fe80::20c:29ff:fe9b:703f prefixlen 64 scopeid 0x20 ether 00:0c:29:9b:70:3f txqueuelen 1000 (Ethernet) RX packets 244 bytes 32605 (32.6 KB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 653 bytes 51807 (51.8 KB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73 mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10 loop txqueuelen 1000 (Local Loopback) RX packets 411 bytes 66247 (66.2 KB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 411 bytes 66247 (66.2 KB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 vip: flags=195 mtu 1500 inet 172.16.1.23 netmask 255.255.0.0 broadcast 172.16.255.255 inet6 fe80::d0a7:56ff:fe83:95ff prefixlen 64 scopeid 0x20 ether d2:a7:56:83:95:ff txqueuelen 1000 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 7 bytes 490 (490.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
user@server:/etc/systemd/network$ ip a 1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: ens33: mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 00:0c:29:9b:70:3f brd ff:ff:ff:ff:ff:ff inet 172.16.1.16/24 brd 172.16.1.255 scope global ens33 valid_lft forever preferred_lft forever inet6 fe80::20c:29ff:fe9b:703f/64 scope link valid_lft forever preferred_lft forever 3: vip: mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1000 link/ether d2:a7:56:83:95:ff brd ff:ff:ff:ff:ff:ff inet 172.16.1.23/16 brd 172.16.255.255 scope global vip valid_lft forever preferred_lft forever inet6 fe80::d0a7:56ff:fe83:95ff/64 scope link valid_lft forever preferred_lft forever
Linux: Create virtual network interface
On Linux, virtual network interface configuration isn’t something most people need to do very often, but it can come in handy sometimes. The system will recognize a virtual interface as a real, physical interface. linux create virtual network interface
In this respect, it works sort of like a virtual machine – that is, it emulates the necessary hardware components to seem like it’s physically connected to the machine.
In this tutorial, you’ll learn how to create a virtual network interface on Linux. Follow along with the step by step instructions below to create one or more of these interfaces on your own system.
In this tutorial you will learn:
- How to create virtual network interfaces on Linux
Category | Requirements, Conventions or Software Version Used |
---|---|
System | Any Linux distro |
Software | N/A |
Other | Privileged access to your Linux system as root or via the sudo command. |
Conventions | # – requires given linux commands to be executed with root privileges either directly as a root user or by use of sudo command $ – requires given linux commands to be executed as a regular non-privileged user |
Create virtual network interfaces on Linux
The methods for creating a virtual network interface have changed a bit through the years. There is more than one way to do this, but we will be using the “dummy” kernel module to set up our virtual interface in these steps.
- Start off by enabling the dummy kernel module with the following command.
$ sudo ip link add eth0 type dummy
$ sudo ifconfig eth0 hw ether C8:D7:4A:4E:47:50
$ sudo ip addr add 192.168.1.100/24 brd + dev eth0 label eth0:0
$ sudo ip link set dev eth0 up
$ ip a [. ] 3: eth0: mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1000 link/ether c8:d7:4a:4e:47:50 brd ff:ff:ff:ff:ff:ff inet 192.168.1.100/24 brd 192.168.1.255 scope global eth0:0 valid_lft forever preferred_lft forever
$ sudo ip addr del 192.168.1.100/24 brd + dev eth0 label eth0:0 $ sudo ip link delete eth0 type dummy $ sudo rmmod dummy
Closing Thoughts
In this tutorial, we learned how to add a virtual network interface to a Linux system, by using the dummy kernel module. This is a useful practice in multiple scenarios. For example, if you have an application that must be tied to a network interface and don’t wish to use your physical adapter.
Related Linux Tutorials:
Comments and Discussions
Виртуальный сетевой интерфейс в 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 с содержимым:
Создаем интерфейс типа tap
Создадим соответственно файлы tap0.netdev с содержимым:
Создаем интерфейс типа dummy
Создадим соответственно файлы dum0.netdev с содержимым:
[NetDev]
Name=dum0
Kind=dummy
Стоит отметить, что если вы планируете маршрутизировать траффик через виртуальные интерфейсы ( а, используя их для цели создания виртуальных частных сетей (VPN), вы точно этого хотите), то в конфигурационный файл в секии «Network» следует добавить диррективу «IPForward=yes».