Как VPN-сервер определяет, что вы используете прокси, и наоборот: техники детекции и обхода
Содержание
- Асимметрия подозрений
- Детекция прокси: смотрим на заголовки
- Тайминги и RTT: физика против анонимности
- TCP/IP fingerprinting: смотрим на стёкла
- SNI и DNS: утечки, которые всё портят
- TLS fingerprinting: джедайские техники
- HTTP/2 и HTTP/3: новые поля боя
- Практический кейс: nginx и модуль детекции
- Как 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 — используйте проверенные протоколы с защитой от утечек. И помните: идеальной анонимности не существует, есть только разные уровни сложности для тех, кто пытается вас вычислить.