Vraag wat één rij van een VPN-dataset voorstelt, en de antwoorden vermenigvuldigen zich: een bedrijf, een luisteraar, een openbaar uitgangsadres, een bereikbaarheidsresultaat. Elk is legitiem, en ze zonder labels mengen levert een totaal op dat precies klinkt en niets betekent. De eenheid is een ontwerpbeslissing, en die moet vóór de eerste telling worden genomen. Het meeste misverstand in gepubliceerde VPN-statistieken komt doordat die stap wordt overgeslagen.

Een rij is een bewering, geen ding

Elke rij beweert iets over de wereld, en de bewering heeft een onderwerp. Het benoemen van het onderwerp is wat de rij vergelijkbaar maakt met een andere rij.

Een providerrij beweert dat een organisatie een dienst aanbiedt. Een eindpuntrij beweert dat een bepaald adres en een bepaalde poort een protocol spreken. Een uitgangsrij beweert dat verkeer op een moment een adres heeft verlaten. Een metingrij beweert dat een sonde van ergens een resultaat heeft waargenomen. Vier onderwerpen, vier schema’s, en een dataset die ze zonder onderscheider mengt, kan helemaal niet worden geaggregeerd.

De onderscheider is het goedkoopste deel van het schema en het deel dat het vaakst wordt weggelaten.

Kies de eenheid vóór de telling

Kies de eenheid die de vraag beantwoordt die u werkelijk hebt. Eindpunten tellen beantwoordt hoeveel luisteraars zijn aangekondigd; providers tellen beantwoordt hoeveel organisaties betrokken waren; uitgangsadressen tellen beantwoordt hoeveel schijnbare oorsprongen er zijn.

Die getallen zijn niet uitwisselbaar, en de verschillen zijn groot. Eén provider kan duizenden adressen exploiteren, en één adres kan meerdere protocolluisteraars voor verschillende diensten huisvesten. Een telling van adressen is dus geen boven- of ondergrens voor een telling van providers. Noem de eenheid elke keer in dezelfde zin als het getal. Een getal zonder eenheid is een mening met een decimaalteken.

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

Een openbare gids levert aangekondigde deelnemers in die dienst. Het is geen inventaris van elke commerciële, organisatorische en particuliere implementatie ter wereld, en het zo behandelen blaast elke afgeleide statistiek op.

Herkomst hoort in het schema

Een rij zonder herkomst kan niet opnieuw worden gecontroleerd. Leg het bronrecord vast, de verzameltijd met zijn tijdzone, de observatiemethode en een status van laatst gezien.

Houd aangekondigde attributen gescheiden van waargenomen, omdat ze verschillend gewicht dragen. Het landlabel van een gids is een aangekondigde bewering, en het is geen bewijs van de fysieke locatie van een server. Een IP-toewijzing identificeert een netwerkblok, niet elke huurder erbinnen, en niet de huidige beheerder van een applicatie erboven. Twee kolommen en een notitie verslaan elke keer één samengevoegd veld.

{"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"}

Eén JSON-regel maakt het schema concreet en is makkelijker te bespreken dan een beschrijvende alinea. Merk op dat de tijdstempel een tijdzone draagt en dat de methode wordt genoemd in plaats van geïmpliceerd.

Ontdubbel volgens de vraag

Duplicaten hangen van de eenheid af. Hetzelfde adres met twee protocolluisteraars is één eindpuntpaar en twee diensten, en het stil samenvoegen verandert de telling.

Ontdubbel op het niveau waar de vraag over gaat, en leg vast hoeveel ruwe rijen in elke behouden rij zijn samengevallen. Die verhouding is zelf een bevinding, want een grote samenval betekent meestal dat de bron records per luisteraar publiceert. Een provider met veel adressen geeft het omgekeerde patroon. Beide zijn correct, en alleen de vastgelegde verhouding laat de lezer ze onderscheiden.

Bewaar daarna de ruwe rijen. Een ontdubbelde tabel is een weergave, en het vermogen om die uit de ruwe invoer opnieuw op te bouwen is wat het resultaat reproduceerbaar maakt.

Publiceer de dekkingsverklaring

Vermeld hoe bronnen zijn geselecteerd, welke regio’s of netwerken ze dekken, en wat bewust ontbreekt.

Particuliere bedrijfseindpunten en niet-aangekondigde implementaties verschijnen nooit op openbare lijsten, dus afwezigheid in een gids bewijst alleen dat de gids ze niet heeft vermeld. Controleer de voorwaarden van de bron en de herdistributierechten vóór publicatie, en verwijder velden die nooit nodig waren. Een eindpuntstudie vereist zelden abonnee-identiteiten, inloggegevens of browsegeschiedenis. Die publiceren zou een ander project met een andere rechtvaardiging zijn.

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

Die drie opdrachten geven een rijaantal, een eenheidsverdeling en een schets van de dekking per aangekondigd land. Bewaar gedateerde momentopnamen wanneer de populatie verandert, en onderscheid verouderd van bevestigde afwezigheid. Een afgebakende dataset met een duidelijke populatie verslaat een ongefundeerde bewering elke VPN op het internet te bevatten.

Gerelateerde artikelen