← Назад в базу знаний

Как VPN-сервер определяет, что вы используете прокси, и наоборот: техники детекции и обхода

Как VPN-сервер определяет, что вы используете прокси, и наоборот: техники детекции и обхода

Асимметрия подозрений

VPN-серверу, по большому счёту, плевать, что вы используете прокси. Он видит просто поток зашифрованных пакетов. А вот прокси-серверу и, главное, сайтам, на которые вы заходите, уже не всё равно. Им нужно понять, кто перед ними.

Прокси — это посредник. Он принимает ваш запрос и пересылает его дальше. VPN — это туннель. Он шифрует весь трафик целиком. Разница в архитектуре порождает разные методы детекции.

Детекция прокси: смотрим на заголовки

Самый примитивный способ — анализ HTTP-заголовков. Прокси часто добавляет свои заголовки: `Via`, `X-Forwarded-For`, `Forwarded`. Это не баг, а фича протокола. Но администратор сайта может эти заголовки проверять.

```bash

curl -I https://example.com -x http://proxy.example.com:8080

```

Ответ покажет что-то вроде:

```

HTTP/1.1 200 OK

Via: 1.1 proxy.example.com (squid/3.5.27)

X-Forwarded-For: 203.0.113.5

```

Если сайт видит `Via` — значит, вы за прокси. Это работает против наивных прокси. Но умные прокси эти заголовки вычищают. Просто потому, что могут.

Тайминги и RTT: физика против анонимности

А вот это уже интереснее. Когда вы сидите за прокси, задержка до сайта складывается из двух сегментов: вы → прокси и прокси → сайт. Если прокси находится в другой стране, RTT скачет неестественно.

Нормальный пользователь из Москвы до немецкого сайта имеет RTT 50-70 мс. Если прокси в Майами, RTT будет 130-160 мс. При этом до российских сайтов задержка останется низкой. Такой разброс — маркер прокси.

VPN в этом плане хитрее. Он шифрует весь трафик, и задержка распределяется равномерно. Но и тут есть нюанс: если VPN-сервер в Германии, а вы сидите в Москве, то до немецкого сайта RTT будет 50 мс, а до российского — те же 50 мс. Для сайта это выглядит подозрительно: пользователь географически в Германии, но прекрасно знает русский и заходит на российские ресурсы без задержек.

TCP/IP fingerprinting: смотрим на стёкла

Каждая ОС по-разному формирует TCP-пакеты. Размер окна, TTL, параметры TCP options — всё это уникально. Инструмент `p0f` или `nmap` с опцией `-O` может определить ОС по этим параметрам.

```bash

nmap -O -p 443 example.com

```

Если вы заходите через прокси, сайт видит TCP-стек прокси-сервера. Если прокси крутится на Linux, а вы — на Windows, это видно. VPN в этом плане не отличается: сайт видит стек VPN-сервера. Но разница есть. Прокси часто работает на дешёвом VPS с минимальной настройкой, и там сразу видно нестандартные параметры. VPN-серверы обычно настраивают тщательнее.

SNI и DNS: утечки, которые всё портят

Вот тут начинается весёлое. HTTPS-соединение начинается с SNI — имени хоста, которое передаётся открытым текстом. Даже если весь трафик идёт через VPN, SNI виден провайдеру. Но это не детекция прокси, это другая история.

А вот DNS — это классика. Прокси-сервер, настроенный криво, пропускает DNS-запросы мимо себя. Ваш компьютер спрашивает DNS-сервер провайдера, какой IP у `example.com`. Провайдер видит этот запрос и понимает: вы ходите через прокси, потому что прямой запрос к сайту не идёт.

Проверка утечек DNS:

```bash

dig +short whoami.akamai.net. @resolver1.opendns.com

```

Если ответ отличается от IP вашего прокси — утечка. VPN с kill-switch эту проблему решает. Прокси — нет.

TLS fingerprinting: джедайские техники

Самый продвинутый метод — анализ TLS ClientHello. Каждый TLS-клиент (браузер, curl, Python requests) формирует ClientHello по-своему. Параметры: версия TLS, наборы шифров, порядок их перечисления, расширения. Всё это создаёт уникальный отпечаток.

Ja3 — хеш, который вычисляется из этих параметров. Если вы используете Python requests через прокси, сайт увидит Ja3 Python, а не Ja3 браузера. Это палится за секунду.

```python

import requests

proxies = {

'http': 'http://proxy.example.com:8080',

'https': 'http://proxy.example.com:8080',

}

r = requests.get('https://example.com', proxies=proxies)

```

Сайт видит: TLS от Python, заголовок User-Agent от Python, но IP прокси. Три разных сущности. Подозрительно? Ещё бы.

Обход: использовать `curl_cffi` с имитацией отпечатка Chrome:

```python

from curl_cffi import requests

proxies = {

'http': 'http://proxy.example.com:8080',

'https': 'http://proxy.example.com:8080',

}

r = requests.get('https://example.com', proxies=proxies, impersonate='chrome')

```

HTTP/2 и HTTP/3: новые поля боя

HTTP/2 принёс новые заголовки: `:authority`, `:method`, `:path`, `:scheme`. Порядок их следования строго определён. Браузеры отправляют их в одном порядке, curl — в другом, Python — в третьем. Детекция по порядку заголовков — реальная техника.

HTTP/3 работает поверх QUIC. Тут свои фишки: транспортные параметры, ID соединений, алгоритмы контроля перегрузки. Всё это можно анализировать. Но пока это экзотика — большинство сайтов не заморачиваются.

Практический кейс: nginx и модуль детекции

Пример: сервер на nginx 1.24 с модулем `ngx_http_geoip_module` и кастомным скриптом на Lua. Он проверяет три вещи: заголовок `Via`, RTT до клиента и Ja3-отпечаток.

```nginx

http {

lua_shared_dict ja3_cache 10m;

server {

listen 443 ssl;

access_by_lua_block {

local via = ngx.var.http_via

if via then

ngx.exit(403)

end

local ja3 = ngx.var.ssl_ja3_hash

if ja3 and ja3 ~= "valid_chrome_hash" then

ngx.exit(403)

end

}

}

}

```

Результат: 97% прокси-трафика отсекается автоматически. VPN-трафик проходит, потому что Ja3 у VPN-клиента свой, но он стабильный и не похож на прокси. Это не защита от целевого обхода, но от массового скриптинга — отлично.

Как VPN детектит прокси

Обратная задача проще. VPN-сервер видит, что к нему приходит трафик от прокси. Как? По тому же Ja3. Прокси-клиент (например, Squid) имеет свой отпечаток TLS. VPN-сервер сравнивает его с базой известных прокси-клиентов.

Ещё один признак — множество одновременных соединений с одного IP. Прокси-серверы часто обслуживают десятки пользователей. VPN-сервер видит: с IP 203.0.113.5 идёт 47 одновременных туннелей. Это не один человек. Это прокси.

Обход детекции: практические советы

Первый совет: не используйте публичные прокси. Они в чёрных списках у всех. Второй: если нужен прокси, берите выделенный IP. На сервисе lexic.ml как раз можно поднять прокси с IPv6 на отдельном подсети. Там нет соседей по IP, и детекция по количеству соединений не сработает.

Третий совет: выравнивайте отпечатки. Если используете прокси для скриптов — имитируйте браузер. `curl_cffi` или `requests` с `tls-client` решают проблему Ja3. Четвёртый: следите за таймингами. Не гоняйте трафик через прокси на другом континенте, если сайт ожидает локального пользователя.

Реальный случай: интернет-магазин и антифрод

Пример: интернет-магазин с антифрод-системой на базе MaxMind и кастомных правил. Система анализировала: IP, заголовки, Ja3, тайминги, историю заказов. Прокси-трафик отсекался по совокупности признаков.

Проблема: легитимные пользователи за рубежом не могли купить товар. Решение: добавили whitelist для IP, которые прошли дополнительную верификацию. Это не идеально, но снизило процент ложных срабатываний с 12% до 2.3%.

Итоги

Детекция прокси и VPN — это гонка вооружений. Сайты внедряют новые методы, прокси-сервисы их обходят. VPN в этой гонке имеет преимущество: шифрование всего трафика скрывает многие признаки. Но и VPN можно определить, если очень захотеть.

Прокси остаются инструментом для задач, где VPN избыточен: парсинг, тестирование, обход региональных блокировок. Для анонимности — VPN. Для специфических задач — прокси. Главное — понимать, какие следы вы оставляете, и уметь их контролировать.

Если нужен прокси под конкретную задачу, берите выделенный IP и настраивайте отпечатки. Если нужен VPN — используйте проверенные протоколы с защитой от утечек. И помните: идеальной анонимности не существует, есть только разные уровни сложности для тех, кто пытается вас вычислить.

✔️Купить прокси