Сеть
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-режим в современных версиях.
Источники
- Linux Kernel — Universal TUN/TAP device driver — основная документация.
- WireGuard — Wintun for Windows — современная реализация для Windows.
- Apple Developer — NetworkExtension framework — iOS / macOS.
- Android Developer — VpnService — Android.