Народный

Сеть

TUN / TAP — виртуальные сетевые интерфейсы

Виртуальные L3 (TUN) и L2 (TAP) сетевые интерфейсы Linux / Windows / macOS. Основа большинства VPN-клиентов: ядро передаёт IP-пакеты в user-space процесс через файловый дескриптор.

Определение

TUN и TAP — виртуальные сетевые интерфейсы, существующие в ядре, но не подключённые к физической карте. TUN работает на уровне L3 (IP-пакеты), TAP — на уровне L2 (Ethernet-фреймы). User-space процесс открывает файловый дескриптор /dev/net/tun (Linux) и через read() / write() получает / отправляет пакеты, как будто это настоящая сетевая карта.

Исторически реализован в Linux 2.4 (2001), позже портирован: Windows (TAP-Windows, Wintun), macOS (utun), BSD (tun(4)). На 2026 — стандартный механизм почти любого desktop / mobile VPN-клиента.

Как работает

Жизненный цикл TUN-интерфейса в типичном Linux VPN-клиенте:

import os, fcntl, struct

TUNSETIFF = 0x400454ca
IFF_TUN = 0x0001
IFF_NO_PI = 0x1000

tun = os.open('/dev/net/tun', os.O_RDWR)
ifr = struct.pack('16sH', b'vpn0', IFF_TUN | IFF_NO_PI)
fcntl.ioctl(tun, TUNSETIFF, ifr)

# теперь vpn0 видно в `ip a`. Назначаем адрес:
# os.system('ip addr add 10.8.0.2/24 dev vpn0; ip link set vpn0 up')

# Каждый прочитанный буфер — IP-пакет, который ОС хотела отправить
while True:
    packet = os.read(tun, 1500)   # пакет от ядра
    encrypted = encrypt_to_vpn(packet)
    send_to_server(encrypted)

В обратную сторону: процесс получил зашифрованный пакет с VPN-сервера, расшифровал, делает os.write(tun, raw_packet) — ядро видит входящий пакет на интерфейсе vpn0 и обрабатывает его как пришедший с настоящей сетевой карты.

Платформенные детали:

  • Linux: /dev/net/tun, требуется CAP_NET_ADMIN.
  • Windows: TAP-Windows (исторически от OpenVPN) или Wintun (новая lightweight реализация WireGuard, лучше performance). Требуется administrator + установленный драйвер.
  • macOS: встроенный utun через socket(PF_SYSTEM, SOCK_DGRAM, SYSPROTO_CONTROL). Без сторонних драйверов.
  • iOS / Android: только через VpnService API (Android) или NetworkExtension framework (iOS) — прямого /dev/net/tun нет.

Почему это важно для пользователя VPN

TUN-режим — это «настоящий VPN», покрывающий всю систему. В отличие от SOCKS5-режима, где трафик заворачивается только в тех приложениях, которые настроены через прокси:

  • TUN-режим: все исходящие пакеты OS перехватываются клиентом, шифруются, отправляются на VPN-сервер. Покрывает браузеры, игры, мессенджеры, фоновые приложения, системные обновления.
  • SOCKS5-режим: работает только в приложениях с явной поддержкой прокси (Chrome, Firefox, Telegram-desktop). Системный трафик идёт мимо VPN.

Практически у современных клиентов есть оба режима, переключаемые в настройках:

  • AmneziaVPN, Hiddify, V2Box — есть «TUN Mode» / «System Proxy»-переключатель.
  • WireGuard official клиенты — всегда TUN-режим (TAP на Windows ранних версий, Wintun с 2020).
  • Outline — TUN через Wintun / utun.
  • NekoBox, sing-box — TUN или TUN2SOCKS-bridge.

Юзеру: если ваш VPN не работает в Steam, в Discord, в системных компонентах — у вас включён SOCKS5-режим, а нужен TUN. Переключите в настройках клиента, перезапустите туннель.

Один тонкий момент: TUN-режим требует административных прав. На Windows клиент попросит admin при первом запуске и установит Wintun-драйвер. На macOS — попросит право в System Settings → Privacy & Security. На Android — system-prompt о VPN-permission.

Связанные термины

WireGuard и OpenVPN — основные потребители TUN. SOCKS5 — альтернатива (только для приложений с поддержкой). xray-core, sing-box — поддерживают TUN-режим в современных версиях.

Источники