So funktioniert die Live-Karte
Hinter der Live-Ansicht steckt dxtap: ein kleiner Open-Source-Agent (MIT), der BIND9-Anfragen direkt auf dem Resolver zu anonymen Geo-Zellen aggregiert. Diese Seite zeigt, wie Sie das auf eigenen Servern nachbauen.
Quellcode: gitlab.noritec.de/dremaxx/dxtap — MIT-Lizenz.
Anonym ab Quelle
dxtap steht nicht im Datenpfad. BIND liefert Ereignisse per dnstap über einen Unix-Socket; die Client-IP wird nur prozesslokal für einen GeoIP-Lookup verwendet und sofort verworfen.
Den Server verlassen pro Tick (100 ms) ausschließlich: auf 0,1° (~11 km) gerundete Koordinaten-Zellen mit Zähler und Transportprotokoll, Zähler der aktivsten Orte (Stadt + Land aus demselben stadtgenauen GeoIP-Eintrag wie die Koordinaten), ein QTYPE-Histogramm und die Gesamtzahl. Keine IP-Adressen, keine Domainnamen, keine Ports, keine Einzel-Zeitstempel — das komplette Wire-Format:
1{ "type": "tick", "server": "myresolver",
2 "site": { "lat": 50.11, "lon": 8.68 },
3 "ts": 1756240000000, "n": 42,
4 "buckets": [ { "lat": 48.1, "lon": 11.6, "n": 17, "proto": "udp" } ],
5 "places": [ { "city": "Munich", "country": "DE", "n": 17 } ],
6 "qtypes": { "A": 30, "AAAA": 8, "HTTPS": 4 } }BIND9 mit dnstap
dnstap ist in den Debian/Ubuntu-Paketen bereits einkompiliert — zwei Zeilen Konfiguration genügen.
1dnstap { client query; };
2dnstap-output unix "/run/dxtap/dnstap.sock";1named-checkconf && rndc reconfigdxtap installieren
Signiertes, öffentliches apt-Repository — Updates kommen danach mit apt upgrade.
1curl -fsSL https://packages.noritec.io/repository/raw/noritec-apt.asc \
2 | gpg --dearmor -o /usr/share/keyrings/noritec-apt.gpg
3echo 'deb [signed-by=/usr/share/keyrings/noritec-apt.gpg] https://packages.noritec.io/repository/apt stable main' \
4 > /etc/apt/sources.list.d/noritec.list
5apt update && apt install dxtap1apt install geoipupdate # Edition: GeoLite2-City -> /var/lib/GeoIP/GeoLite2-City.mmdb1# /etc/dxtap/config.toml
2server_id = "myresolver"
3site_lat = 50.11
4site_lon = 8.68
5ingest_url = "wss://example.org/api/ingest/dxtap"
6ingest_token = "CHANGE_ME"1systemctl start dxtapEin Backend, das die Ticks empfängt
Ein WebSocket-Server mit Bearer-Token — mehr braucht es nicht. Minimalbeispiel mit Node.js (npm install ws):
1import { WebSocketServer } from 'ws';
2
3const TOKEN = 'CHANGE_ME';
4const wss = new WebSocketServer({ port: 8080 });
5
6wss.on('connection', (socket, req) => {
7 if (req.headers.authorization !== `Bearer ${TOKEN}`) return socket.close(4401);
8 socket.on('message', (raw) => {
9 const msg = JSON.parse(String(raw));
10 if (msg.type === 'hello') console.log(`${msg.server} connected`);
11 if (msg.type === 'tick') console.log(`${msg.server}: ${msg.n} queries, ${msg.buckets.length} cells`);
12 });
13});Ab hier sind es Ihre Daten: Karte, Dashboard oder Metriken — das Wire-Format oben ist der komplette Vertrag.