IP Location Service

Für einige Auswertungen wäre es sehr gut zu wissen, wo sich eine IP-Adresse befindet. Das kann ein geografischer Ort oder auch eine Zuordnung zu einer Firma oder einem Provider sein. Es gibt im Internet viele Dienste, die genau solche Informationen teils kostenfrei, teils gegen Gebühr liefern. Mich hat interessiert, wie ich solche Daten selbst ermitteln kann.

Die richtige Adresse

Zuerst stellt sich die Frage, wie der Prozess die richtige IP-Adresse ermittelt. Ein Programm auf einem Client kann  natürlich die eigenen "lokalen" Adressen ermitteln aber das hilft nicht viel weiter, da fast alle Systeme hier mit privaten IPv4-Adressen arbeiten. Erst mit IPv6 sieht das etwas anderes aus.

Im Heimnetzwerk könnte der Client z.B. per UPNP versuchen seine öffentlichen IP zu ermitteln. Auch ein Traceroute kann ihm dabei helfen, die erste "externe" Adresse zu ermitteln und damit z.B. auf den Provider zu schließen. Aber auch das ist nicht immer ausreichend, da es auch "Carrier Grade NAT" gibt. Der eigene Router bekommt dann eine Adresse aus dem Bereich 100.64.x.x-100.127.x.x (Siehe FTTH mit IPv6 (DG), die sich dann hinter einem großen NAT-System mit der richtigen öffentlichen Adresse verbergen. Entsprechend "ungenau" sind dann die Angaben.


Quelle https://www.bigdatacloud.com/ip-geolocation/what-is-my-ip

Es ist aber besser als nicht und wenn ich schon den Ort so nicht genau in Erfahrung bringen kann, dann erhalten ich zumindest Informationen über den Provider und das Netz-Routing. Wenn ein Anbieter zu einer Adresse aber so eine geografische Region angibt, dann dürfte es an aufgewerteten Daten liegen. So können Browser mit dem passenden Betriebssystem, primär Mobilgeräte, einen GPS-Standort melden.

WHOIS und NICs, IP zu ASN, ASN zu Provider und mehr

Alle Router im Internet müssen natürlich wissen, wie Sie ein Paket anhand der Ziel-Adresse weitergeben, bis es eben am Ziel ist. Dazu gibt es fünf Stellen auf der Welt (ARIN, AFRINIC, APIC, LACNIC, RIPE.NCC), die alle öffentlichen IP-Adressen vergeben und darüber buch führen. Dort können wir erfahren, zu welchem Provider, genauer welchem "autonomen Netzwerk" (ASN), eine IP-Adresse gehört. Zu jedem ASN ist dann natürlich auch ein Besitzer eingetragen. So lässt sich dann in vielen Fällen schon der Provider ermitteln und mit etwas Glück auch die geografische Region. Das funktioniert natürlich weniger gut für Netzwerke, die weltweit genutzt werden.

Leider weiß man natürlich nicht im Voraus, welches dieser fünf NICs für eine Adresse zuständig ist. Alle NICs veröffentlichen aber die Zuordnungslisten der IP-Netzwerke zum ASN. das ist aber keine geografische Zuordnung, sondern nur zum Netzwerk.

Achtung: Das sind FTP-URLs !
ARIN    ftp.arin.net/pub/stats/arin/delegated-arin-extended-latest
RIPE    ftp.ripe.net/ripe/stats/delegated-ripencc-latest
ARFINIC ftp.afrinic.net/pub/stats/afrinic/delegated-afrinic-latest
APNIX   ftp.apnic.net/pub/stats/apnic/delegated-apnic-latest
LACNIC  ftp.lacnic.net/pub/stats/lacnic/delegated-lacnic-latest

Kein Router wertet aber diese Dateien aus. Die Router untereinander nutzen Routingprotokolle (Im Internet wird das "Border Gateway Protokol" (BGP) genutzt. Die Router leiten sich über eine eingerichtete Partnerschaft ihre Leitwege mit und lernen so, welche Adressen auf der jeweils anderen Seite bekannt sind. Diese Tabellen können Sie natürlich auch abfragen. Allerdings müssen Sie dazu schon einen Zugang zu einem BGP-Router haben oder eine Webseite nutzen, die ihnen Abfragen erlaubt:

zudem gibt es natürlich einige Webdienste, die Sie mit einer IP-Adresse direkt befragen können, z.B.

# Abfrage meiner PublicIP
Invoke-RestMethod "https://accountws.arin.net/public/seam/resource/rest/myip"

version ip
------- --
6 2003:c2:e702:3183:8c3d:4cd0:835a:534f
# Ermitteln des Providers für eine IP-Adresse über das RIPE
(invoke-RestMethod 'https://rest.db.ripe.net/search.json?query-string=2003:c2:e702:3183:8c3d:4cd0:835a:534f').objects.object[0].attributes.attribute

name          value
----          -----
inet6num      2003::/19
netname       DE-TELEKOM-20050113
country       DE
org           ORG-DTA2-RIPE
admin-c       DTAG-RIPE
tech-c        DTAG-RIPE
status        ALLOCATED-BY-RIR
mnt-by        RIPE-NCC-HM-MNT
mnt-by        DTAG-NIC
mnt-lower     DTAG-NIC
mnt-routes    DTAG-NIC
mnt-routes    DTAG-RR
mnt-domains   DTAG-NIC
mnt-domains   DTAG-RR
created       18.07.2007 11:48:53
last-modified 02.12.2019 11:42:04
source        RIPE

 
(Invoke-RestMethod https://rest.db.ripe.net/search.json?query-string=2a00:6020:13fa:d300:e569:f4df:70eb:442e).objects.object[0].attributes.attribute
name value
---- -----
inet6num 2a00:6020::/32
netname DE-DGNO-20130322
country DE
org ORG-DGNO1-RIPE
admin-c DGNO-RIPE
tech-c DGNO-RIPE
status ALLOCATED-BY-RIR
mnt-by RIPE-NCC-HM-MNT
mnt-by MNT-DGNO
created 22.03.2013 14:23:17
last-modified 28.06.2016 14:35:50
source RIPE

Diese Abfragen liefern aber nur Netzwerkinformationen aber sind nicht hinreichend für eine geografische Einordnung. Das schreibt das ein oder andere NIC auch explizit auf der Webseite

"The RIPE NCC is not a geolocation provider. Following a unanimous decision by the RIPE NCC Executive Board not to support resource expenditure in the area of geolocation services, the RIPE NCC has no plans to become a provider. "
Quelle: Geolocation in the RIPE Database (https://www.ripe.net/manage-ips-and-asns/db/tools/geolocation-in-the-ripe-database)

stat.ripe.net

Viele Administratoren wissen gar nicht, dass das RIPE selbst eine große öffentlich und anonym zugängliche Datenbank zum Internet verwaltet, die auch einfach per REST-API abgefragt werden kann.

Das beginnt bei einem "Was ist meine IP-Adresse"

PS C:\> $myip=Invoke-RestMethod https://stat.ripe.net/data/whats-my-ip/data.json
PS C:\> $myip

messages         : {}
see_also         : {}
version          : 0.1
data_call_name   : whats-my-ip
data_call_status : supported
cached           : False
data             : @{ip=2a00:6020:b007:3200:dde9:8a23:f574:1b40}
query_id         : 20220106135533-145da973-d95d-42bc-8a05-4075d2b30aeb
process_time     : 0
server_id        : app123
build_version    : live.2022.1.5.62
status           : ok
status_code      : 200
time             : 06.01.2022 13:55:33

PS C:\> $myip.data.ip
2a00:6020:b007:3200:8d98:397f:9ba8:86fd

Das ich aktuell per IPv6 verbunden war, hat mir das RIPE meine Adresse geliefert. Leider kenne ich keinen IPv4-Only Endpunkt, der nicht per IPv6 erreichbar ist, um auch diese Adresse bei einem "Dualstack" zu nutzen.

Mit der Adresse kann ich dann mehr über das Netzwerk erfahren:

PS C:\> $mynet= invoke-restmethod "https://stat.ripe.net/data/prefix-overview/data.json?resource=2a00:6020:b007:3200:593b:4d08:ae26:de8b"
PS C:\> $mynet.data.asns | fl

asn    : 60294
holder : DE-DGW - Deutsche Glasfaser Wholesale GmbH

Damit habe ich den Provider und das ASN

PS C:\> $mygeo= invoke-restmethod "https://stat.ripe.net/data/geoloc/data.json?resource=2a00:6020:b007:3200:593b:4d08:ae26:de8b"
PS C:\> $mygeo.data.located_resources.Locations

country            : DE
city               : Hovelhof
resources          : {2a00:6020:b000::/44}
latitude           : 51,8171
longitude          : 8,6543
covered_percentage : 100

Die Abfrage ist übrigens für jede IP-Adresse möglich und nicht auf die eigene Adresse beschränkt. Nicht immer passt es aber:

$googleip= invoke-restmethod "https://stat-ui.stat.ripe.net/data/geoloc/data.json?data_overload_limit=ignore&resource=8.8.8.8"
$googleip.data.located_resources.Locations

country            : US
city               :
resources          : {8.8.0.0/19}
latitude           : 37,751
longitude          : -97,822
covered_percentage : 100

Die Google Multicast-Adresse ist zwar "US" zugewiesen aber keiner Stadt. Das könnte ein Hinweis sein. 1.1.1.1 ist in AU ohne City verortet und die Schweizer DNS-Server hinter 9.9.9.9 sind als "Berkeley, US" eingetragen. Interessanterweise liefert eine Abfrage für die chinesischen DNS-Server 114.114.114.114 eine Fehlermeldung.

Nutzen Sie einfach mal https://stat.ripe.net/app/launchpad, um etwas über ihre Adresse oder andere Adressen in Erfahrung zu bringen.

GeoIP-Services

Ehe Sie nun aber versuchen, die Dateien der RIPE-Instanzen auszulesen und sich einen eigenen Service zu schreiben, sollten Sie besser prüfen, welche Dienste schon im Internet verfügbar sind. Content-Provider müssen ja schon für ihre Rechteinhaber möglichst genau erkennen, wo sich der Client befindet, damit z.B. Streaming-Angebote auch nur in den vom Lizenzgeber erlaubten gebieten genutzt werden. Meist sind die Kosten überschaubar, denn solche Datensammlungen lassen automatisch ohne viel Personalaufwand erstellen und daher günstig. Die Liste hier ist nicht repräsentativ.

IPAdressen matchen

Einige Datenbanken haben direkt den Datentyp "IP-Address" oder enthaten Umrechnungsfunktionen und erlauben damit eine flotte Speicherung und hoffentlich auch Suche:

Für anderen Datenbanken müssen Se nun natürlich überlegen, wie sie solche Listen von Subnetzen oder IP-Adressen auf ASNs, Länder o.ä. effektiv speichern. Sicher könnten Sie das Netzwerk einfach in der üblichen Notation mit "Netzwerk/Subnetz" schreiben und dann von hinten die Bits durchlaufen und nach Übereinstellungen suchen. Ein anderer Ansatz wäre Start und End-Adresse als separate Spalten zu schreiben. Hier mal ein Beispiel:

Datenbanken sind aber immer ganz gut, wenn es um das Vergleichen von Zahlen geht und genau genommen können Sie IPv4-Adressen auch als Zahl schreiben. Die Adresse von https://www.msxfaq.de löste am 21. Jan 2024 auf die IP-Adresse "178.77.117.98" auf, die aber auch entsprechend der Wertigkeit der Stellen auch als Integer geschrieben werden kann

178.77.117.98 = (((178*256)+77)*256+117)*256+98 = 178.77.117.98

Viele Administratoren sind dann auch überrascht zu sehen, dass Windows auch solche Zahlen erlaubt:

Auch ein Zugriff über "http://178.77.117.98/" würde funktionieren, wenn der Webserver hinter der Adresse nicht noch den Hostheader überprüfen würde. Das funktioniert übrigens auch mit IPv4-Adressen auch wenn hier die maximal 64bit als Netzwerk anzunehmen sind.

GPS und WLAN Ortung

Wenn Sie nicht nur die IP-Adresse eines Clients haben sondern auf dem Gerät des Anwenders selbst Code starten können, dann kann ihre Software natürlich auch die Location-APIs des Betriebssystems nutzen.  Android und IOS sind sehr gut darin, die Position des Geräte und damit auch des Besitzers auf der Erde zu ermitteln. Dazu wird GPS aber vor allem auch WLAN genutzt. Google und Apple haben vermutlich die beste "WLAN-Landkarte" mit Informationen über SSIDs, AccessPoints und deren Feldstärken.

Diese Information kann das Smartphone natürlich nicht ohne Hilfe eines Servers auswerten, weswegen die Daten natürlich erst mal nach Hause gemeldet werden, damit letztlich dann die Position ausgeliefert wird. Dieses Wissen können Sie natürlich nutzen, um den Besucher ihrer Webseite oder Nutzer ihrer App zu verorten. Über die öffentliche IP-Adressen, die Sie auch ermitteln können, können Sie dann auch die Position im "Netzwerk" ermitteln, z.B. welcher Provider genutzt wird.

Weitere Links