Рубрики
network \ сеть

ip / tun / tup / veth / dummy / виртуальный интерфейс

Ссылки:

https://segmentfault.com/a/1190000009249039
https://segmentfault.com/a/1190000009251098

dummy

!!! не актуально 
Зачем? для loopback как на свитчах\роутерах когда есть много маршрутов, в теории на такой интерфейс можно будет достучатся,
можно присвоить ему отдельный адрес и анонсировать его остальной сети через протокол OSPF (Open Shortest Path First), 
который использует multicast и не зависит от конкретных адресов интерфейсов. 
В этом случае адрес на loopback останется доступным, если у маршрутизатора есть хотя бы один живой канал в остальную сеть.
ip link add name dum0 type dummy
ip link set dum0 up
ip address add 192.0.2.10/32 dev dum0

tun/tap

+----------------------------------------------------------------+
|                                                                |
|  +--------------------+      +--------------------+            |
|  | User Application A |      | User Application B |<-----+     |
|  +--------------------+      +--------------------+      |     |
|               | 1                    | 5                 |     |
|...............|......................|...................|.....|
|               v                      v                   |     |
|         +----------+           +----------+              |     |
|         | socket A |           | socket B |              |     |
|         +----------+           +----------+              |     |
|                 | 2               | 6                    |     |
|.................|.................|......................|.....|
|                 v                 v                      |     |
|             +------------------------+                 4 |     |
|             | Newwork Protocol Stack |                   |     |
|             +------------------------+                   |     |
|                | 7                 | 3                   |     |
|................|...................|.....................|.....|
|                v                   v                     |     |
|        +----------------+    +----------------+          |     |
|        |      eth0      |    |      tun0      |          |     |
|        +----------------+    +----------------+          |     |
|    10.32.0.11  |                   |   192.168.3.11      |     |
|                | 8                 +---------------------+     |
|                |                                               |
+----------------|-----------------------------------------------+
                 v
         Physical Network



veth

+----------------------------------------------------------------+
|                                                                |
|       +------------------------------------------------+       |
|       |             Newwork Protocol Stack             |       |
|       +------------------------------------------------+       |
|              ^               ^               ^                 |
|..............|...............|...............|.................|
|              v               v               v                 |
|        +----------+    +-----------+   +-----------+           |
|        |   eth0   |    |   veth0   |   |   veth1   |           |
|        +----------+    +-----------+   +-----------+           |
|192.168.1.11  ^               ^               ^                 |
|              |               +---------------+                 |
|              |         192.168.2.11     192.168.2.1            |
+--------------|-------------------------------------------------+
               v
         Physical Network


Пример:

ip link add veth0 type veth peer name veth1
ip addr add 192.168.2.11/24 dev veth0
ip link set veth0 up
ip link set veth1 up

ping -c 4 192.168.2.1
PING 192.168.2.1 (192.168.2.1) 56(84) bytes of data.
From 192.168.2.11 icmp_seq=1 Destination Host Unreachable


ip addr add 192.168.2.1/24 dev veth1
ping -c 4 192.168.2.1 -I veth0
PING 192.168.2.1 (192.168.2.1) from 192.168.2.11 veth0: 56(84) bytes of data.
64 bytes from 192.168.2.1: icmp_seq=1 ttl=64 time=0.032 ms
64 bytes from 192.168.2.1: icmp_seq=2 ttl=64 time=0.048 ms

rp_filters

echo 1 > /proc/sys/net/ipv4/conf/veth1/accept_local
echo 1 > /proc/sys/net/ipv4/conf/veth0/accept_local
echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter
echo 0 > /proc/sys/net/ipv4/conf/veth0/rp_filter
echo 0 > /proc/sys/net/ipv4/conf/veth1/rp_filter

Виртуальных интерфейсы: tun, tap и dummy

Отличие интерфейсов tun и tap заключается в том, что tap старается больше походить на реальный сетевой интерфейс, а именно он позволяет себе принимать и отправлять ARP запросы, 
обладает MAC адресом и может являться одним из интерфейсов сетевого моста, так как он обладает полной поддержкой ethernet - протокола канального уровня (уровень 2).
Интерфейс tun этой поддержки лишен, поэтому он может принимать и отправлять только IP пакеты и никак не ethernet кадры.
Он не обладает MAC-адресом и не может быть добавлен в бридж. 
Зато он более легкий и быстрый за счет отсутствия дополнительной инкапсуляции и прекрасно подходит для тестирования сетевого стека или построения виртуальных частных сетей (VPN). 
Виртуальный интерфейс типа dummy очень похож на tap, разница лишь в том, что он реализуется другим модулем ядра.

Создаем интерфейс типа tun вручную и на время(жить будет до перезагрузки):
ip tuntap add dev tun0 mode tun
ip address add 10.0.0.1/30 dev tun0
ip address show tun0
!!! Внимание tun интерфейс невозможно добавить в бриджи (так как он не имеет MAC)
Собственно при попытки добавить tun в бридж будет ошибка:
ip link set dev tun0 master br0
RTNETLINK answers: Invalid argument


Создаем интерфейс типа tap вручную и на время(жить будет до перезагрузки):
ip tuntap add dev tap0 mode tap
ip address add 10.0.0.5/30 dev tap0
ip address show tap0
В бридж tap добавляется без проблем:
ip link set dev tap0 master br0

Создаем интерфейс типа dumm вручную и на время(жить будет до перезагрузки):
ip link add dev dum0 type dummy
ip address add 10.0.0.7/30 dev dum0
ip address show dum0
В бридж dumm добавляется без проблем:
ip link set dev dum0 master br0




P.S.
Стоит отметить, что если вы планируете маршрутизировать траффик через виртуальные интерфейсы 
( а, используя их для цели создания виртуальных частных сетей (VPN), вы точно этого хотите), 
то в конфигурационный файл в секции "Network" следует добавить директиву "IPForward=yes".

Примеры конфигов для systemd:


TUN:
vim /etc/systemd/network/tun0.netdev
------------------------------------
[NetDev]
Name=tun0
Kind=tun
------------------------------------

vim /etc/systemd/network/tun0.netdev
------------------------------------
[Match]
Name=tun0
[Network]
Address=10.0.0.1/30
------------------------------------

TAP:
vim /etc/systemd/network/tap0.netdev
------------------------------------
[NetDev]
Name=tap0
Kind=tap
------------------------------------
vim /etc/systemd/network/tap0.network
-------------------------------------
[Match]
Name=tap0
[Network]
Address=10.0.0.5/30
-------------------------------------

DUMMY:
vim /etc/systemd/network/dum0.netdev
------------------------------------
[NetDev]
Name=dum0
Kind=dummy
------------------------------------
vim /etc/systemd/network/dum0.network
-------------------------------------
[Match]
Name=dum0
[Network]
Address=10.0.0.7/30
-------------------------------------