VPN допомагає користувачеві приховати свою реальну IP-адресу та змінити видиму країну підключення. Для звичайного відвідувача це може бути способом захистити приватність, але для власника сайту VPN-трафік іноді створює проблеми: спам у формах, повторні реєстрації, обхід географічних обмежень, накрутка переходів або спроби приховати джерело шахрайських дій.
Водночас сам факт використання VPN не означає, що користувач має шкідливі наміри. Тому завдання сайту полягає не лише в тому, щоб визначити підозріле з’єднання, а й правильно на нього відреагувати: дозволити доступ, запросити додаткову перевірку, обмежити окрему дію або повністю заблокувати запит.
У цій статті розглянемо, як працює визначення VPN, які методи можна використати, що пропонує Cloudflare та як підключити перевірку IP через API на PHP.
Що відбувається, коли користувач заходить через VPN
Без VPN сайт бачить публічну IP-адресу, яку відвідувачу надав його домашній або мобільний інтернет-провайдер. За цією адресою можна приблизно визначити країну, регіон, провайдера та автономну систему — ASN.
Після підключення до VPN запит іде спочатку на сервер VPN-провайдера, а вже звідти — на сайт. У результаті сайт бачить не реальну IP-адресу користувача, а адресу VPN-сервера.
Схематично це виглядає так:
Користувач → VPN-сервер → сайт
Сайт не отримує спеціального заголовка на кшталт VPN: yes. Визначення відбувається опосередковано — шляхом аналізу IP-адреси, мережі, провайдера, поведінки запитів та спеціалізованих баз даних.
Навіщо сайту визначати VPN і проксі
Перевірка може бути корисною в різних сценаріях.
Захист форм від спаму
Зловмисник може змінювати IP через VPN і багато разів надсилати одну форму. Звичайне блокування за IP у такому випадку швидко втрачає ефективність.
Захист від повторних реєстрацій
Якщо сервіс надає бонус новому користувачеві, VPN можуть використовувати для створення великої кількості облікових записів.
Контроль географії заявок
Для локального бізнесу важливо розуміти, чи відповідає країна IP обраній країні, номеру телефону або регіону доставки. Невідповідність не доводить порушення, але може бути додатковим сигналом ризику.
Захист рекламного бюджету
Підозрілі повторні переходи з дата-центрів, проксі та VPN можуть свідчити про неякісний або автоматизований трафік. Перевірку IP можна додати до загальної системи антифроду разом із cookies, fingerprint, поведінковими показниками та серверними логами.
Обмеження доступу до окремих функцій
Не обов’язково закривати весь сайт. Перевірку можна застосовувати тільки до реєстрації, авторизації, оформлення замовлення, голосування, використання промокоду або відправлення заявки.
Чи можна визначити VPN зі стовідсотковою точністю
Ні. Абсолютно точного способу визначити всі VPN не існує.
Класичні VPN часто працюють із серверів відомих хостинг-провайдерів. Такі IP порівняно легко розпізнати: вони належать дата-центрам, використовуються великою кількістю клієнтів і вже присутні в базах VPN-сервісів.
Складніше визначати residential proxy — проксі з IP-адресами звичайних домашніх провайдерів. Для сайту таке підключення може виглядати майже як трафік реальної людини. Також VPN-провайдер може регулярно змінювати адреси, а база перевірки — оновлюватися із затримкою.
Можливі й помилкові спрацювання. Наприклад, корпоративний шлюз, мобільний оператор, антивірусний веб-захист або сервіс конфіденційності може мати ознаки проксі.
Тому коректніше говорити не про безпомилкове визначення, а про оцінювання ризику.
Основні способи визначення VPN на сайті
1. Перевірка IP за спеціалізованою базою
Найпростіший практичний спосіб — передати IP-адресу відвідувача до спеціалізованого API. Сервіс перевірить адресу та поверне інформацію про тип мережі.
Залежно від постачальника відповідь може містити:
- ознаку VPN або проксі;
- ознаку Tor;
- тип мережі або хостингу;
- країну та регіон;
- назву провайдера;
- номер ASN;
- рівень ризику або впевненості;
- ознаки зловживань, скрапінгу чи скомпрометованої адреси.
Для такої перевірки можна використати ProxyCheck.io. Його API розподіляє результати за категоріями, серед яких VPN, proxy, Tor, hosting і scraper, а новіша версія API також повертає структуровані мережеві дані та оцінки ризику.
Переваги методу:
- просте підключення;
- база оновлюється постачальником;
- не потрібно самостійно збирати IP-діапазони;
- можна отримати кілька сигналів одним запитом.
Недоліки:
- API має ліміти;
- результат залежить від актуальності бази;
- зовнішній запит може збільшити час обробки;
- потрібне кешування;
- можливі помилкові спрацювання.
2. Аналіз ASN і дата-центрів
Кожна велика мережа має ASN — номер автономної системи. Якщо IP належить відомому хостингу або оператору серверної інфраструктури, це може бути ознакою VPN, проксі, бота або іншого серверного трафіку.
Цей метод можна реалізувати на рівні Cloudflare WAF. Наприклад, правило може реагувати на перелік підозрілих ASN:
ip.src.asnum in {9009 16276 20473 24940}Замість жорсткого блокування краще спочатку вибрати дію Managed Challenge.
Однак ASN не визначає намір користувача. На одному хостингу можуть працювати VPN-сервери, API, системи моніторингу, корпоративні сервіси та звичайні сайти. Тому блокування всього ASN може зачепити легітимний трафік.
Cloudflare дозволяє створювати правила для IP, діапазонів, країн та ASN, а також об’єднувати адреси й ASN у списки для повторного використання в різних правилах.
3. Геолокація IP
Сайт може порівнювати країну IP з іншими даними:
- країною телефонного номера;
- вибраною країною доставки;
- мовою браузера;
- часовим поясом;
- географією рекламної кампанії;
- історією входів користувача.
Наприклад, заявка містить український номер телефону, але надходить з IP дата-центру в іншій країні. Це не доказ шахрайства, проте привід застосувати додаткову перевірку.
Блокування тільки за країною не є надійним способом боротьби з VPN: користувач може вибрати VPN-сервер у дозволеній країні.
4. Аналіз поведінки
IP-перевірка значно ефективніша разом із поведінковими сигналами:
- надто швидке заповнення форми;
- багато запитів за короткий час;
- однакові дані з різних IP;
- часта зміна країн або ASN;
- відсутність JavaScript або cookies;
- нетиповий User-Agent;
- багато невдалих авторизацій;
- повторне використання email, телефону чи платіжних реквізитів.
Окремий сигнал може бути випадковістю. Поєднання кількох сигналів дає значно точнішу оцінку ризику.
5. Перевірка браузера та мережевого з’єднання
Деякі антифрод-системи аналізують TLS-відбитки, параметри браузера, стабільність сесії та інші технічні характеристики. Це складніший рівень захисту, який зазвичай потрібен великим сервісам, платіжним системам або проєктам із високим рівнем шахрайства.
Такі методи не варто використовувати як єдине підтвердження VPN. Вони мають бути частиною загальної моделі ризику та відповідати вимогам законодавства про приватність.
Визначення VPN за допомогою ProxyCheck.io
ProxyCheck.io — спеціалізований сервіс перевірки IP та email-адрес. Для IP він може повідомляти про VPN, proxy, Tor, hosting, scraper та інші категорії ризику.
Загальна схема інтеграції:
- Сайт отримує IP відвідувача.
- Перевіряє, чи є свіжий результат у кеші.
- Якщо результату немає — викликає API.
- Зберігає відповідь на обмежений час.
- Приймає рішення за налаштованими правилами.
Не рекомендується надсилати API-запит під час кожного відкриття кожної сторінки. Перевірку краще виконувати:
- при першому вході;
- перед важливою дією;
- при відправленні форми;
- під час реєстрації або авторизації;
- після появи додаткових ризикових сигналів.
Як правильно отримати IP користувача на PHP
Якщо сайт працює напряму, реальна адреса зазвичай доступна в REMOTE_ADDR.
Якщо домен проксований через Cloudflare, сервер у REMOTE_ADDR бачить адресу вузла Cloudflare. Реальний IP передається в заголовку CF-Connecting-IP.
function getClientIp(): string
{
if (!empty($_SERVER['HTTP_CF_CONNECTING_IP'])) {
$ip = trim($_SERVER['HTTP_CF_CONNECTING_IP']);
if (filter_var($ip, FILTER_VALIDATE_IP)) {
return $ip;
}
}
$ip = $_SERVER['REMOTE_ADDR'] ?? '';
return filter_var($ip, FILTER_VALIDATE_IP) ? $ip : '';
}Важливо: довіряти HTTP_CF_CONNECTING_IP можна лише тоді, коли сайт справді працює через Cloudflare, а прямий доступ до сервера в обхід Cloudflare закритий. Інакше відвідувач може самостійно передати підроблений заголовок.
Не варто безумовно брати перше значення з X-Forwarded-For. Цей заголовок також може бути підроблений, якщо його не встановлює довірений reverse proxy.
Приклад перевірки VPN через API на PHP
Нижче наведений спрощений приклад для API ProxyCheck.io v2. Перед використанням потрібно створити API-ключ і перевірити актуальні параметри в документації сервісу.
function checkIpWithProxyCheck(string $ip, string $apiKey): array
{
$defaultResult = [
'checked' => false,
'proxy' => false,
'type' => '',
'country' => '',
'risk' => 0,
];
if (!filter_var($ip, FILTER_VALIDATE_IP)) {
return $defaultResult;
}
$url = 'https://proxycheck.io/v2/' . rawurlencode($ip)
. '?key=' . rawurlencode($apiKey)
. '&vpn=1&asn=1&risk=1';
$curl = curl_init($url);
curl_setopt_array($curl, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CONNECTTIMEOUT => 2,
CURLOPT_TIMEOUT => 4,
CURLOPT_HTTPHEADER => [
'Accept: application/json',
],
]);
$response = curl_exec($curl);
$httpCode = (int) curl_getinfo($curl, CURLINFO_HTTP_CODE);
curl_close($curl);
if ($response === false || $httpCode !== 200) {
return $defaultResult;
}
$data = json_decode($response, true);
if (!is_array($data) || empty($data[$ip])) {
return $defaultResult;
}
$item = $data[$ip];
return [
'checked' => true,
'proxy' => strtolower($item['proxy'] ?? 'no') === 'yes',
'type' => (string) ($item['type'] ?? ''),
'country' => (string) ($item['isocode'] ?? ''),
'risk' => (int) ($item['risk'] ?? 0),
];
}Використання функції:
$ip = getClientIp();
$result = checkIpWithProxyCheck($ip, 'YOUR_API_KEY');
if ($result['checked'] && $result['proxy']) {
http_response_code(403);
exit('Вимкніть VPN або проксі та повторіть спробу.');
}Це демонстраційний варіант. У робочому проєкті потрібно додати кешування, журналювання, обробку винятків та більш гнучку логіку реагування.
Що робити, якщо API недоступне
Зовнішній сервіс іноді може відповідати із затримкою або бути тимчасово недоступним. Сайт повинен мати заздалегідь визначену fail-open або fail-closed політику.
Fail-open — дозволити дію, якщо перевірку виконати не вдалося. Такий підхід підходить для звичайних сайтів і форм, де помилкове блокування реального клієнта небажане.
Fail-closed — заборонити дію до успішної перевірки. Це може бути виправдано для високоризикових операцій, але збільшує ймовірність блокування легітимних користувачів через технічний збій.
Для більшості комерційних сайтів оптимально використовувати fail-open, але записувати невдалу перевірку в лог і застосовувати додатковий контроль до особливо важливих дій.
Навіщо кешувати результати
Якщо один користувач відкрив десять сторінок, немає потреби десять разів перевіряти ту саму IP-адресу.
Результат можна зберігати:
- у Redis або Memcached;
- у базі даних;
- у файловому кеші;
- у WordPress Transients API;
- у серверній сесії як додаткову оптимізацію.
Строк кешування залежить від завдання. Для негативного результату можна встановити коротший строк, а для відомих VPN або Tor — довший. Потрібно враховувати, що IP може перейти до іншого користувача, а статус адреси з часом змінитися.
Приклад простого ключа:
vpn_check_8f14e45fceea167a5a36dedd4bea2543Саму IP-адресу краще не використовувати у відкритому вигляді у файлових назвах. Для ключа можна застосувати хеш, а строки зберігання персональних даних визначити у політиці приватності.
Чи можна визначати VPN через Cloudflare
Cloudflare добре підходить для попередньої фільтрації, але звичайні тарифи не надають універсальної умови VPN = true для кожного користувача.
На рівні WAF можна:
- блокувати IP та діапазони;
- створювати правила за країною;
- реагувати на ASN;
- використовувати списки IP або ASN;
- застосовувати
BlockабоManaged Challenge; - обмежувати частоту запитів.
Для розширеної поведінкової оцінки Cloudflare має Bot Management. Доступ до поля cf.bot_management.score потребує Enterprise із відповідним доповненням. Cloudflare також описує окреме виявлення трафіку residential proxy та подібних комерційних проксі.
Проте Bot Management насамперед оцінює автоматизований і ризиковий трафік. Людина у звичайному браузері через VPN не обов’язково буде визначена як бот або заблокована.
Для невеликого чи середнього сайту практична схема може виглядати так:
- Cloudflare відсіює очевидно шкідливий трафік.
- WAF застосовує challenge до підозрілих країн або ASN.
- API перевіряє IP перед важливою дією.
- Сайт аналізує поведінку та дані форми.
- Остаточне рішення приймається за сукупністю сигналів.
Блокувати весь сайт чи тільки окремі дії
Повне блокування — найпростіше технічно, але не завжди найкраще для бізнесу. VPN можуть використовувати звичайні клієнти, працівники компаній, мандрівники та користувачі публічного Wi-Fi.
Можливі сценарії реагування:
Дозволити доступ, але записати подію
Підходить на етапі тестування. Ви збираєте статистику та перевіряєте точність, не втрачаючи відвідувачів.
Показати CAPTCHA або Managed Challenge
Це збалансований варіант для трафіку середнього ризику. Реальний користувач зможе продовжити роботу, а частина автоматизованих запитів буде відсіяна.
Заборонити відправлення форми
Сайт залишається доступним, але користувачеві пропонують вимкнути VPN перед заявкою, реєстрацією або замовленням.
Запросити додаткове підтвердження
Можна підтвердити номер телефону, email або одноразовий код. Це доцільніше, ніж блокування, якщо дія має високу цінність.
Повністю заблокувати IP
Виправдано для Tor, підтверджених атак, критично високого ризику або повторних порушень. Повне блокування лише за одним сигналом VPN може призвести до втрати потенційних клієнтів.
Приклад логіки оцінювання ризику
Замість умови «VPN — заблокувати» можна нараховувати бали:
| Сигнал | Приклад ваги |
|---|---|
| Виявлено VPN або proxy | +30 |
| IP належить хостингу | +20 |
| Виявлено Tor | +60 |
| Забагато запитів | +30 |
| Країна IP не відповідає формі | +15 |
| Повторюється телефон або email | +40 |
| Коректна CAPTCHA | −30 |
| Підтверджений номер телефону | −40 |
Можлива політика:
- до 29 балів — дозволити;
- 30–59 — показати CAPTCHA;
- 60–89 — запросити додаткове підтвердження;
- від 90 — заблокувати дію та записати інцидент.
Цифри потрібно адаптувати за реальною статистикою конкретного сайту.
Захист персональних даних
IP-адреса може вважатися персональними даними залежно від юрисдикції та способу обробки. Тому перед передаванням IP сторонньому API потрібно:
- перевірити політику приватності постачальника;
- описати відповідну обробку у власній політиці;
- зберігати лише необхідні дані;
- встановити строки видалення логів;
- обмежити доступ до журналів;
- не публікувати IP у відкритому вигляді;
- перевірити вимоги GDPR та локального законодавства для вашого проєкту.
Не варто збирати додаткові відбитки пристрою «про всяк випадок». Кожен сигнал має мати зрозумілу мету та обґрунтований строк зберігання.
Типові помилки під час впровадження
Довіряти будь-якому заголовку з IP
X-Forwarded-For і навіть CF-Connecting-IP можна підробити, якщо сервер доступний напряму. Потрібно приймати такі заголовки тільки від довіреного reverse proxy.
Перевіряти IP на кожній сторінці
Це уповільнює сайт і швидко витрачає ліміт API. Використовуйте кеш та перевіряйте лише важливі дії.
Блокувати за однією ознакою
VPN не дорівнює шахрайству. Для бізнес-сайту краще поєднати IP-репутацію з поведінкою, rate limiting і підтвердженням контактів.
Ігнорувати IPv6
Система має коректно перевіряти та зберігати як IPv4, так і IPv6. Не використовуйте структуру бази даних, розраховану лише на короткий IPv4.
Не передбачити збій API
Таймаут зовнішнього сервісу не повинен зупиняти весь сайт. Встановіть короткі таймаути та визначте fail-open або fail-closed політику.
Одразу ввімкнути жорстке блокування
Спочатку варто кілька днів або тижнів збирати статистику в режимі моніторингу. Це допоможе оцінити частку VPN-трафіку та кількість помилкових спрацювань.
Рекомендована схема впровадження
Для більшості сайтів достатньо такого плану:
- Підключити сайт до Cloudflare.
- Закрити прямий доступ до сервера в обхід Cloudflare.
- Налаштувати WAF і rate limiting для форм та авторизації.
- Додати Turnstile або іншу перевірку на важливі форми.
- Підключити API перевірки VPN і proxy.
- Кешувати результат за IP.
- Спочатку лише записувати підозрілі події.
- Порівняти результати з реальним спамом і неякісними заявками.
- Додати challenge для середнього ризику.
- Блокувати тільки підтверджені високоризикові випадки.
Такий підхід дозволяє посилити захист, не закриваючи сайт від усіх користувачів, які з законних причин використовують VPN.
Висновок
Сайт не може безпосередньо запитати браузер, чи використовується VPN. Визначення виконується за IP-адресою, ASN, типом мережі, репутаційними базами та поведінкою користувача.
Найпростіше рішення — підключити спеціалізований API, наприклад ProxyCheck.io, кешувати результати та перевіряти IP перед важливими діями. Cloudflare доцільно використовувати як перший рівень захисту: для WAF, rate limiting, перевірок браузера, правил за країною та ASN.
Головний принцип — не прирівнювати VPN до порушення. Надійна система оцінює кілька сигналів і вибирає пропорційну реакцію: моніторинг, CAPTCHA, додаткове підтвердження або блокування.
Якщо потрібно підключити перевірку VPN, проксі або підозрілих IP до сайту, інтеграцію можна реалізувати на PHP, у WordPress, Drupal або в окремому серверному обробнику форми.
Часті запитання
Чи можна точно визначити, що користувач використовує VPN?
Не завжди. Відомі серверні VPN визначаються досить добре, але residential proxy та нові IP-адреси можуть виглядати як звичайне домашнє підключення. Тому результат потрібно трактувати як сигнал ризику, а не абсолютний доказ.
Чи можна заблокувати VPN через Cloudflare?
Частково. У Cloudflare можна блокувати IP, країни та ASN, використовувати WAF, списки й Managed Challenge. Розширене виявлення proxy доступне у корпоративних продуктах Bot Management, але навіть воно не гарантує визначення кожного VPN.
Чи потрібно блокувати весь сайт?
У більшості випадків ні. Доцільніше перевіряти реєстрацію, авторизацію, замовлення або відправлення форми. Для підозрілого відвідувача можна показати CAPTCHA чи запросити підтвердження телефону.
Чи уповільнює API перевірки роботу сайту?
Може уповільнювати, якщо викликати його під час кожного запиту. Щоб уникнути цього, встановлюють короткий таймаут, кешують результат і виконують перевірку тільки перед важливими діями.
Як отримати реальну IP-адресу через Cloudflare?
Cloudflare передає її в заголовку CF-Connecting-IP. Сервер повинен довіряти цьому заголовку тільки для запитів, які гарантовано надходять через Cloudflare.
Що робити, якщо користувача визначено помилково?
Потрібно надати альтернативу: вимкнути VPN, пройти CAPTCHA, підтвердити email або телефон чи звернутися до підтримки. Також варто журналювати спрацювання та регулярно переглядати правила.
Які дані варто зберігати в логах?
Достатньо часу події, хешу або захищеного представлення IP, результату перевірки, типу ризику, дії системи та технічного ідентифікатора запиту. Строк зберігання слід обмежити відповідно до реальної потреби та політики приватності.


