Автор: Редакция «VPN не работает»

Чем отличается VPN от прокси

Прокси и VPN выводят трафик через промежуточный узел, но работают на разных уровнях: прокси обслуживает отдельное приложение и сам ничего не шифрует, а VPN поднимает системный сетевой интерфейс и шифрует IP-пакеты всего устройства. Различий по существу три: уровень обработки, область действия и криптография.

Коротко. SOCKS5 (RFC 1928) — прослойка между прикладным и транспортным уровнями, алгоритмов шифрования в стандарте нет. HTTP-прокси при методе CONNECT (RFC 9110) слепо пересылает байты. WireGuard упаковывает IP-пакеты в UDP и шифрует их связкой ChaCha20-Poly1305. Прокси включается в одной программе, туннель — для всей системы. Анонимности не даёт ни один из механизмов.

Что такое прокси и что такое туннель?

Прокси — посредник, которого клиент выбирает сам своими настройками (RFC 9110, раздел 3.7); там же он отделён от шлюза (обратного прокси) и от перехватывающего прокси, неотличимого от постороннего в середине маршрута. Туннель в смысле VPN — виртуальный сетевой интерфейс: по документации Android сервис создаёт его сам, настраивает адреса и маршруты, а пакеты внутри начинаются с IP-заголовка. Подробнее — что такое ВПН.

На каком уровне работает каждый механизм?

Туннель обрабатывает IP-пакеты, прокси — TCP-поток или отдельный HTTP-запрос. Номер уровня OSI первоисточники не называют: RFC 1928 описывает SOCKS5 как shim-прослойку между прикладным и транспортным уровнями, Chromium — как транспортный прокси. Следствие: SOCKS не даёт услуг шлюза сетевого уровня и не пересылает ICMP, поэтому ping и traceroute через прокси не проходят, а WireGuard инкапсулирует любые IP-пакеты поверх UDP.

Чем HTTP-прокси отличается от SOCKS5?

HTTP-прокси разбирает запрос и видит его целиком, SOCKS5 знает только адрес назначения. Соединение по SOCKS5 идёт в четыре шага:

  1. Клиент открывает TCP-соединение (по традиции порт 1080) и шлёт поле VER = X’05’ со списком методов аутентификации.
  2. Сервер выбирает метод: X’00’ — без аутентификации, X’02’ — пароль по RFC 1929, X’01’ — GSSAPI.
  3. Клиент передаёт команду CMD: CONNECT = X’01’, BIND = X’02’, UDP ASSOCIATE = X’03’; адрес задаёт ATYP — X’01’ для IPv4, X’03’ для домена, X’04’ для IPv6.
  4. Сервер соединяется с целевым узлом и работает трубой, не разбирая содержимого.

У HTTP-прокси иначе: для запросов по http:// цель передаётся в абсолютной форме (RFC 9112, раздел 3.2) — GET http://example.org/pub/page.html HTTP/1.1. Посредник получает схему, домен, путь с параметрами и заголовки Host, Cookie, User-Agent, обязан добавить Via и запрашивает пароль статусом 407.

Почему CONNECT не равен шифрованию?

Потому что CONNECT просит посредника открыть туннель и слепо пересылать данные — таково его определение в RFC 9110. Шифрует TLS внутри туннеля; для ресурса по http:// пойдёт открытый текст. Цель задаётся особой формой, только хост и порт: CONNECT server.example.com:443 HTTP/1.1 — домен и порт видны, URL и заголовки нет. Пароль защитой не является: Basic по RFC 7617 передаёт данные в Base64, а RFC 1929 предупреждает, что пароль SOCKS5 идёт открытым текстом.

Кто разрешает доменное имя в адрес?

Ответ зависит от клиента, а не от протокола — отсюда и недоумение «прокси включён, а DNS-запросы уходят провайдеру».

У туннеля развилки нет: wg-quick принимает ключ DNS = и вызывает resolvconf — резолвер меняется системно.

Сводная таблица различий

Девять осей, по которым они расходятся.

Ось сравненияПрокси (HTTP или SOCKS5)Туннель (WireGuard)
Что обрабатываетHTTP-запрос или TCP-потокIP-пакеты целиком
Область действияОдно приложениеИнтерфейс всей системы
ШифрованиеВ RFC 1928 нет, у HTTP-прокси нетChaCha20-Poly1305, Curve25519, Noise_IK
КлючиНе существуютСмена через 120 с, отказ от старых через 180 с
Видит посредникURL и заголовки, при CONNECT — host:portШифртекст, но виден ваш IP
DNSКлиент или прокси, зависит от программыЗадаёт ключ DNS
UDP и ICMPUDP через UDP ASSOCIATE, ICMP не идётЛюбые IP-пакеты, включая ICMP
АутентификацияX’00’, пароль текстом, Basic в Base64Криптографическое рукопожатие
Обрыв связиОшибка либо соединение мимо проксиKill-switch добавляется вручную: PostUp/PreDown

Как включается прокси и как туннель?

Прокси включается настройкой приложения: расширение Chrome управляет им через API chrome.proxy с разрешением proxy и схемами http, https, quic, socks4, socks5. Браузерные «VPN-расширения» так и работают — меняют настройки одного браузера, а мессенджеры, игры и обновления системы идут мимо. Системный канал иной: на Android сервис объявляется с разрешением BIND_VPN_SERVICE, активным может быть лишь одно подключение, а списки addAllowedApplication и addDisallowedApplication взаимоисключающие. Практика — как пользоваться ВПН.

Когда уместен каждый механизм?

Прокси уместен, когда нужно увести трафик одной программы. Пример без стороннего сервиса — ssh -D: OpenSSH поднимает локальный SOCKS-сервер (SOCKS4 и SOCKS5) и пробрасывает соединения по каналу SSH. Туннель уместен, когда важен охват: один канал для всех приложений, поддержка UDP и ICMP, предсказуемая точка выхода, защита в публичном Wi-Fi, безопасный удалённый доступ. Границы есть и у него: туннелирование поверх TCP WireGuard не поддерживает, маскировкой трафика проект не занимается. Как поднять канал — настройка WireGuard на своём VPS.

Чего не делают оба механизма?

Ни прокси, ни туннель не дают анонимности: меняется видимый адрес, а не личность. Прокси способен раскрыть вас сам — RFC 7239 определяет заголовок Forwarded с параметром for, куда подставляется исходный адрес клиента. Раздел 4 рекомендует держать заголовок выключенным по умолчанию, а раздел 8.3 признаёт адрес клиента чувствительными данными и требует обфусцированных идентификаторов в for и by по умолчанию. Что от смены точки выхода не зависит вовсе — вход в аккаунт и фишинг — разобрано в материале что такое ВПН. Исходный адрес известен владельцу узла и там, и там; что попадает в логи — в материале про безопасность.

Частые вопросы

Короткие ответы на частые вопросы о прокси и туннеле.

Материал носит научно-технический характер и посвящён шифрованию трафика и настройке собственного защищённого канала. Прямой ответственности за использование VPN физическим лицом законодательство РФ не устанавливает. Сайт не рекламирует сервисы и не публикует рейтинги.

Что безопаснее — VPN или прокси?

Вопрос поставлен неточно: разница не в безопасности как таковой, а в трёх осях — уровне обработки данных, области действия и наличии криптографии. В RFC 1928 у SOCKS5 нет ни одного алгоритма шифрования, а HTTP-прокси при методе CONNECT просто пересылает байты. WireGuard шифрует IP-пакеты связкой ChaCha20-Poly1305 и меняет ключи через 120 секунд. При этом чужой туннель по доверию не лучше чужого прокси: владелец узла в обоих случаях видит ваш исходный адрес.

Шифрует ли SOCKS5 трафик?

Нет. RFC 1928 допускает конфиденциальность только как необязательную инкапсуляцию при методе GSSAPI (X'01'), а обычные методы X'00' — без аутентификации — и X'02' — логин и пароль — шифрования не дают вовсе. Пароль по RFC 1929 передаётся открытым текстом, и стандарт сам не рекомендует его там, где возможно прослушивание. В Chrome методы аутентификации SOCKSv5 не поддерживаются.

Почему прокси включён, а DNS-запросы уходят провайдеру?

Потому что резолвинг задаёт клиент, а не протокол. В curl опция --socks5 разрешает имя локально, а --socks5-hostname отдаёт это прокси; те же роли у схем socks5:// и socks5h://. Chrome при SOCKSv5 всегда резолвит на прокси, а при SOCKSv4 — только локально и только в IPv4-адрес. В Firefox за это отвечает пара настроек: network.proxy.socks5_remote_dns по умолчанию true, network.proxy.socks_remote_dns — false.

Работает ли ping через прокси?

Нет. RFC 1928 прямо оговаривает, что SOCKS не предоставляет услуг шлюза сетевого уровня, включая пересылку ICMP-сообщений, а ping и traceroute построены именно на ICMP. UDP в протоколе есть отдельной командой UDP ASSOCIATE (X'03'), но ассоциация живёт лишь пока открыто управляющее TCP-соединение, а Chrome UDP через SOCKSv5 не ретранслирует. Туннель сетевого уровня передаёт любые IP-пакеты, ICMP в том числе.

Почему браузерное расширение не помогает другим приложениям?

Потому что расширение меняет прокси-настройки одного браузера через API chrome.proxy с разрешением proxy, а системный интерфейс не поднимает. Мессенджеры, игры, магазины приложений и обновления системы идут мимо него. Системный канал на Android объявляется с разрешением BIND_VPN_SERVICE и охватывает всё устройство, причём одновременно активным может быть только одно такое подключение.

Даёт ли прокси анонимность?

Нет, и он способен раскрыть вас сам. RFC 7239 определяет заголовок Forwarded с параметром for, куда подставляется исходный адрес клиента; раздел 8.3 признаёт такой адрес чувствительными данными и требует обфускации идентификаторов по умолчанию, а сам заголовок RFC рекомендует держать выключенным по умолчанию (раздел 4). HTTP-прокси, кроме того, обязан добавлять заголовок Via в каждое пересылаемое сообщение, а для запросов по http:// получает полный URL вместе с Cookie и User-Agent.

Поделиться: Telegram ВКонтакте