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