Годами мы концентрировались на разработке блокировщика AdGuard во всех возможных проявлениях: приложения, браузерные расширения, DNS. И вот два года назад мы, внезапно для многих, приняли решение разработать собственный VPN-сервис. И на это было несколько причин.
С самого начала мы решили, что у AdGuard VPN будет одно важное отличие от конкурентов — мы будем использовать VPN-протокол собственной разработки, а не просто возьмём одно из готовых решений.
Зачем, спросите вы? В этой статье мы расскажем, что нас не устроило в существующих протоколах и почему мы разработали свой собственный, а также поделимся планами по его развитию. Спойлер: протокол AdGuard VPN сложнее обнаружить и он быстрее своих аналогов.
Но для начала нам нужно будет немного углубиться в технические детали и рассказать вам:
Всё общение в интернете построено на передаче небольших «пакетов» с данными от компьютера к компьютеру. Существует несколько разных типов пакетов, каждый из них служит своей цели. Правила формирования пакетов и их обработки называются «протоколом». Не бойтесь, мы не будем уходить в дебри устройства интернета, а просто расскажем основы его устройства.
Наверняка вы слышали про IP-адреса? Так вот, IP-адрес — это часть «протокола IP», основного механизма передачи данных по сети. Каждый пакет состоит из трёх частей: IP-адреса отправителя и получателя, а также самих данных.
Получатель знает, кто отправитель, а значит может переслать свой пакет данных в ответ. Правда, «чистый» протокол IP практически не используется. Зато используются два других протокола, на нём основанных — TCP и UDP.
TCP — основная «рабочая лошадка» интернета. Когда вы открываете какой-то сайт, очень вероятно, что для передачи данных используется именно протокол TCP.
TCP-пакет состоит из четырёх частей:
Какую бы сеть вы ни использовали, есть вероятность, что часть отправленных пакетов может затеряться где-то по пути. Протокол TCP делает всё, чтобы они дошли до адресата: в ответ на каждый отправленный пакет получатель отправляет маленький TCP-пакет с подтверждением получения. Если отправитель не получил подтверждения, он будет повторно посылать пакет, пока подтверждение наконец не будет получено.
UDP — ещё один известный, хоть и менее популярный протокол на основе протокола IP. Единственное его отличие от IP в том, что помимо содержимого пакета и адресов отправителя и получателя он передаёт информацию о номерах портов (см. описание портов в разделе про TCP). Как видно на анимации, поток пакетов с данными движется быстрее, чем у TCP — и неудивительно, так как здесь подтверждать ничего не нужно. UDP, в отличие от TCP, ничего не гарантирует, но и не посылает лишних пакетов с подтверждением, за счёт чего может работать быстрее.
Отправляя кому-то письмо, физическое или электронное, вы можете обойтись без содержимого, заголовка, подписи, но не адреса получателя. По такому же принципу работает интернет — чтобы отправлять данные, нужен IP-адрес.
Когда вы заходите на сайт, ему виден ваш IP-адрес, а зная его, несложно вычислить и местоположение пользователя. VPN позволяет вашим данным пройти через зашифрованное соединение от вашего дома/работы или смартфона до другой точки в интернете, возможно, в другой стране, а затем попасть в публичный интернет. Как кролик, незаметно ныряющий в нору, которая ведёт в Зазеркалье.
В результате шифрования вашим данным присваивается IP-адрес другого конца туннеля вместо адреса вашего дома или работы. Теперь, когда вы подключаетесь к веб-серверу, он видит не ваш домашний IP-адрес, а чужой, принадлежащий конечной точке VPN. Таким образом, если вы заходите на конфиденциальный сайт, ваши данные не будут раскрыты.
Думаю, это вы и так знали. А теперь давайте на самом деле углубимся в технические детали. Чтобы VPN работал, нужно каким-то образом передавать и шифровать данные от вашего устройства к VPN-серверу и обратно. Правила передачи и шифрования этих данных называются VPN-протоколом. Самые распространённые – это OpenVPN, WireGuard и IPSec. Все эти протоколы работают примерно одинаково, функционально они очень похожи, но дьявол в деталях (шифрования и установки соединения).
Рассмотрим, как устроена их механика. Допустим, вы хотите посетить сайт. Если у вас включен VPN, то VPN-сервер становится посредником между вами и сайтом. Сначала серверу посылается зашифрованный IP-пакет. VPN-сервер расшифровывает его, меняет «адрес отправителя» (то есть ваш IP) и отправляет пакет получателю (то есть сайту). Как правило, в качестве транспортного протокола для этой цели используется UDP: он в среднем «быстрее», поскольку не требует ожидания подтверждения.
Все популярные VPN-протоколы (OpenVPN, WireGuard, IPSec и другие) объединяют два основных недостатка:
Чтобы «скрыть» использование VPN, чаще всего поток данных «заворачивают» в TCP-соединение, а иногда дополнительно шифруют, чтобы сделать трафик похожим на соединение с обычным сайтом. К сожалению, у такого подхода есть проблема – из-за использования TCP появляется необходимость в дополнительном подтверждении доставки.
Таким образом, используя любой из популярных VPN-протоколов, мы всегда встаём перед выбором: быстро и легко обнаружимо vs. медленно.
Мы разработали протокол AdGuard VPN, видя недостатки предыдущих протоколов и не желая с ними мириться. Так в чём же его преимущества?
Существующие VPN-протоколы также справляются с задачей шифрования, и их (а значит, и факт использования VPN) тяжело обнаружить. Но обычно за это приходится платить сниженной скоростью. В нашем случае это не так, благодаря нескольким решениям.
Первым делом, мы планируем перейти на использование протоколов HTTP/3 и QUIC для связи с сервером. HTTP/3 – это следующая, более современная версия HTTP. К сожалению, новые протоколы не повлияют на скорость в случае хорошего стабильного соединения, но их преимущества проявятся, когда соединение будет хуже – например, на мобильных устройствах или при подключении к Wi-Fi в общественных местах. Явных преимуществ у новых протоколов несколько – с ними не будет ретрансляции (повторной передачи пакета) и очередей с блокировкой заголовка строки (Head of Line Blocking или HoLB), а ещё они позволят использовать миграцию соединения (connection migration). Если не вдаваться в технические подробности, из этих преимуществ вытекает главное – уже упомянутое улучшение качества связи в неидеальных условиях.
TCP и другие протоколы, работающие поверх него (TLS, SSL, HTTP /1.1 и HTTP/2), существуют давно и мастерски справляются со своей задачей, но есть одно но: для их бесперебойной работы должны быть условия, близкие к идеальным. Это означает, что хорошо они работают в сети со стабильным и высоким качеством связи (скажем, домашняя сеть Wi-Fi). Но выходя во внешний мир с его мобильными сетями, вы не можете уберечь себя от слабого сигнала, медленного соединения и других бед, провоцирующих потери пакетов. А эти потери ведут к ретрансляции и HoLB, которые мы уже упоминали. Даже 5G не всесилен, и связь будет хуже в лифтах и длинных перегонах метро. С VPN over HTTP/3 проблема чудесным образом решается: VPN-соединение не будет рваться, даже если вы зайдёте в лифт, или сеть поменяется по другой причине.
Прямо сейчас мы тестируем прототип этой реализации. Вы можете рассчитывать на то, что она станет доступна через пару месяцев.
Если вы давно знакомы с AdGuard, то уже знаете, как много у нас продуктов с открытым кодом. Нам близка концепция открытого программного обеспечения (open-source software), потому что такие проекты помогают людям и способствуют развитию технологий. Но при этом мы не забываем о конфиденциальности и делаем продукты открытыми там, где это возможно.
В будущем мы собираемся предоставить реализацию нашего протокола в открытом доступе. К сожалению, прямо сейчас у нас не хватает времени на подготовку проекта, ведь это большая работа. Но мы надеемся, что до конца этого года сможем выделить достаточно времени и выложить в открытый доступ код как серверной, так и клиентской реализации.
Наш протокол добавлен во все мобильные и десктопные приложения AdGuard VPN. Скачайте любой продукт (или несколько!) уже сейчас и пользуйтесь, зная, что ваши данные защищены самым надёжным образом. А если захотите, рассказывайте нам о впечатлениях — в комментариях к посту или в социальных сетях.