Зачем нужен TUN/TAP? Как он осуществляется?

Я, начинающий c++ разработчик, решил создать свой аналог на vless. И поэтому я задался вопросом: Зачем нужен TUN/TAP? Как он осуществляется? Такой вопрос является фундаментальным в разработке подобных приложений и протоколов передачи данных. A как можно сделать так, чтобы пакеты передавались от сервера к клиенту и наоборот? Ведь я не знаю, как сделать интерсептор интернет пакетов. Я хочу сделать свой собственный протокол передачи данных в качестве VPN.


Ответы (1 шт):

Автор решения: eri

Tun/tap нужен для того чтоб поймать пакеты от программ и системы.

Этот драйвер имеет 2 интерфейса.

С одной стороны это сетевой интерфейс на который пакеты направляются через маршрутизацию. TUN драйвер захватывает пакеты на уровне ip. TAP на уровне MAC и позволяет использование в бриджах.

С другой стрим, который доступен из приложений. Из этого стрима читается захваченный пакет и записывается пакет входящий.

Полный алгоритм выглядит так:

Вы запускаете вашу программу

Программа добавляет маршрут до узла на который будет передавать данные

Соединяется с сервером по выделенному маршруту

Программа поднимает интерфейс тун, добавляет на него IP адрес и маршрут по умолчанию

Открывает стрим и читает из него пакеты. Обрабатывает их, шифрует и передает в соединение с сервером

Читает ответ от сервера, достает из него ответные пакеты и пишет в стрим

Ответные пакеты вылетают из tun и отправляются в браузер или ещё куда.

Различия в впн такого рода openvpn, vless и прочих заключаются в том как устанавливается соединение с сервером и шифруются пакеты.

Похожий драйвер NDIS, он посложнее в реализации.

https://github.com/alex-eri/vpnp2p

Вот пример как сделать p2p VPN соединение между 2 хостами через STUN. Тут асинхронный стрим на libuv на Си. На плюсах есть свои способы, или можно упростить до select.

Запуск драйвера вот в этой функции https://github.com/alex-eri/vpnp2p/blob/master/main.c#L225 для виндовс делается чуть по-другому.

→ Ссылка