Запитайте, що являє собою один рядок набору даних про VPN, і відповіді множаться: компанія, слухач, публічна адреса виходу, результат доступності. Кожна легітимна, а їх змішування без позначок дає суму, яка звучить точно й не означає нічого. Одиниця — це проєктне рішення, і його треба ухвалити до першого підрахунку. Більшість плутанини в опублікованій статистиці VPN походить від пропускання цього кроку.

Рядок — це твердження, а не річ

Кожен рядок стверджує щось про світ, і твердження має суб’єкт. Саме називання суб’єкта робить рядок порівнюваним з іншим рядком.

Рядок провайдера стверджує, що організація пропонує послугу. Рядок кінцевої точки стверджує, що певна адреса й порт говорять протоколом. Рядок виходу стверджує, що трафік у якийсь момент залишив адресу. Рядок вимірювання стверджує, що зонд звідкись спостерігав результат. Чотири суб’єкти, чотири схеми, і набір даних, який змішує їх без розрізнювача, взагалі неможливо агрегувати.

Розрізнювач — найдешевша частина схеми й та, яку найчастіше опускають.

Виберіть одиницю до підрахунку

Виберіть одиницю, яка відповідає на питання, яке у вас справді є. Підрахунок кінцевих точок відповідає, скільки слухачів було оголошено; підрахунок провайдерів — скільки організацій брало участь; підрахунок адрес виходу — скільки уявних джерел існує.

Ці числа не взаємозамінні, і різниці великі. Один провайдер може тримати тисячі адрес, а одна адреса може приймати кілька протокольних слухачів для різних послуг. Тому число адрес не є ні верхньою, ні нижньою межею для числа провайдерів. Щоразу називайте одиницю в тому самому реченні, що й число. Число без одиниці — це думка з десятковою комою.

UnitThe row assertsWhat a count of it means
ProviderAn organisation offers a serviceHow many operators appear
EndpointAn address and port speak a protocolHow many listeners were advertised
Exit addressTraffic left from an addressHow many apparent origins exist
ObservationA probe saw a resultHow many tests ran, not how many servers

Публічний каталог дає оголошених учасників у цій послузі. Він не є інвентарем кожного комерційного, організаційного та приватного розгортання у світі, і ставлення до нього як до такого роздуває кожну похідну статистику.

Походження належить схемі

Рядок без походження не можна переперевірити. Записуйте вихідний запис, час збору з його часовим поясом, метод спостереження та статус останнього виявлення.

Тримайте оголошені атрибути окремо від спостережуваних, бо вони мають різну вагу. Позначка країни в каталозі — це оголошене твердження, а не доказ фізичного розташування сервера. Розподіл IP визначає блок мережі, а не кожного орендаря всередині нього і не поточного оператора застосунку зверху. Два стовпці й примітка щоразу кращі за одне об’єднане поле.

{"endpoint": "203.0.113.10:1194/udp", "unit": "endpoint", "advertised_country": "NL",
 "observed_at": "2026-11-03T02:15:00Z", "method": "udp_probe", "last_seen": "2026-11-03"}

Один рядок JSON робить схему конкретною, і сперечатися про нього легше, ніж про абзац опису. Зверніть увагу, що позначка часу несе часовий пояс, а метод названий, а не мається на увазі.

Видаляйте дублікати за питанням

Дублікати залежать від одиниці. Та сама адреса з двома протокольними слухачами — це одна пара кінцевих точок і дві послуги, і її тихе злиття змінює підрахунок.

Видаляйте дублікати на тому рівні, про який питає питання, і записуйте, скільки сирих рядків злилося в кожен збережений рядок. Це відношення саме по собі є знахідкою, бо велике злиття зазвичай означає, що джерело публікує записи за кожним слухачем. Провайдер із багатьма адресами дає протилежну картину. Обидва варіанти правильні, і лише записане відношення дає читачеві змогу їх розрізнити.

Далі зберігайте сирі рядки. Таблиця без дублікатів — це подання, а можливість зібрати її заново із сирого вводу робить результат відтворюваним.

Опублікуйте заяву про охоплення

Укажіть, як відбиралися джерела, які регіони або мережі вони охоплюють і що навмисно відсутнє.

Приватні корпоративні кінцеві точки й неоголошені розгортання ніколи не з’являються в публічних списках, тому відсутність у каталозі доводить лише те, що каталог їх не зазначив. Перевірте умови джерела та дозволи на перерозповсюдження перед публікацією і приберіть поля, які ніколи не були потрібні. Дослідження кінцевих точок рідко потребує особистих даних абонентів, облікових даних чи історії перегляду. Їхня публікація була б іншим проєктом з іншим обґрунтуванням.

wc -l vpn-endpoints.jsonl
jq -r '.unit' vpn-endpoints.jsonl | sort | uniq -c
jq -r '.advertised_country' vpn-endpoints.jsonl | sort | uniq -c | sort -rn | head

Ці три команди дають кількість рядків, розподіл за одиницями й нарис охоплення за оголошеною країною. Зберігайте датовані знімки, коли популяція змінюється, і відрізняйте застаріле від підтвердженої відсутності. Обмежений набір із ясною популяцією кращий за непідтверджене твердження, що він містить кожен VPN в інтернеті.

Схожі статті