Fråga vad en rad i ett VPN-dataset representerar, och svaren mångfaldigas: ett företag, en lyssnare, en offentlig utgångsadress, ett nåbarhetsresultat. Var och en är legitim, och att blanda dem utan etiketter ger en summa som låter exakt och inte betyder något. Enheten är ett designbeslut, och det måste fattas före den första räkningen. Det mesta av förvirringen i publicerad VPN-statistik kommer av att man hoppar över det steget.

En rad är ett påstående, inte en sak

Varje rad påstår något om världen, och påståendet har ett subjekt. Det är namngivningen av subjektet som gör raden jämförbar med en annan rad.

En leverantörsrad påstår att en organisation erbjuder en tjänst. En slutpunktsrad påstår att en viss adress och port talar ett protokoll. En utgångsrad påstår att trafik lämnade en adress vid en tidpunkt. En mätrad påstår att en sond från någonstans observerade ett resultat. Fyra subjekt, fyra scheman, och ett dataset som blandar dem utan en diskriminator kan inte aggregeras alls.

Diskriminatorn är den billigaste delen av schemat och den som oftast utelämnas.

Välj enheten före räkningen

Välj den enhet som svarar på frågan du faktiskt har. Att räkna slutpunkter svarar på hur många lyssnare som annonserades; att räkna leverantörer svarar på hur många organisationer som var inblandade; att räkna utgångsadresser svarar på hur många skenbara ursprung som finns.

Dessa tal är inte utbytbara, och skillnaderna är stora. En leverantör kan driva tusentals adresser, och en adress kan hysa flera protokollyssnare för olika tjänster. Ett antal adresser är därför varken en övre eller nedre gräns för ett antal leverantörer. Ange enheten i samma mening som talet, varje gång. Ett tal utan enhet är en åsikt med decimaltecken.

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

En offentlig katalog tillhandahåller annonserade deltagare i den tjänsten. Den är inte en inventering av varje kommersiell, organisatorisk och privat driftsättning i världen, och att behandla den som det blåser upp varje härledd statistik.

Härkomsten hör hemma i schemat

En rad utan härkomst kan inte kontrolleras igen. Registrera källposten, insamlingstiden med dess tidszon, observationsmetoden och en status för senast sedd.

Håll annonserade attribut åtskilda från observerade, eftersom de bär olika vikt. En katalogs landsbeteckning är ett annonserat påstående, och den är inte bevis för en servers fysiska placering. En IP-tilldelning identifierar ett nätverksblock, inte varje hyresgäst inuti det, och inte den nuvarande operatören av en applikation ovanpå. Två kolumner och en notis slår varje gång ett sammanslaget fält.

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

En enda JSON-rad gör schemat konkret och är lättare att diskutera än ett beskrivande stycke. Notera att tidsstämpeln bär en tidszon och att metoden namnges i stället för att antydas.

Ta bort dubbletter efter frågan

Dubbletter beror på enheten. Samma adress med två protokollyssnare är ett slutpunktspar och två tjänster, och att slå ihop den i tysthet ändrar räkningen.

Ta bort dubbletter på den nivå frågan handlar om, och registrera hur många råa rader som föll samman i varje bevarad rad. Det förhållandet är i sig ett fynd, eftersom ett stort sammanfall oftast betyder att källan publicerar poster per lyssnare. En leverantör med många adresser ger det omvända mönstret. Båda är korrekta, och bara det registrerade förhållandet låter läsaren skilja dem åt.

Behåll sedan de råa raderna. En tabell utan dubbletter är en vy, och förmågan att bygga upp den igen från råindata är det som gör resultatet reproducerbart.

Publicera täckningsdeklarationen

Ange hur källorna valdes, vilka regioner eller nätverk de täcker, och vad som medvetet saknas.

Privata företagsslutpunkter och icke-annonserade driftsättningar dyker aldrig upp på offentliga listor, så frånvaro i en katalog bevisar bara att katalogen inte listade den. Kontrollera källans villkor och rättigheter till vidaredistribution före publicering, och ta bort fält som aldrig behövdes. En slutpunktsstudie kräver sällan abonnentidentiteter, inloggningsuppgifter eller webbläsarhistorik. Att publicera dem skulle vara ett annat projekt med en annan motivering.

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

De tre kommandona ger ett radantal, en enhetsfördelning och en skiss av täckningen efter annonserat land. Behåll daterade ögonblicksbilder när populationen ändras, och skilj föråldrat från bekräftad frånvaro. Ett avgränsat dataset med en tydlig population slår ett obelagt påstående om att innehålla varje VPN på internet.

Relaterade artiklar