Pi-hole API | Anzeige der Aufrufe einer IP | Filterung | getallqueries

Hallo!

Ich wollte mir die aufgerufenen Domains einer IP aus dem Netzwerk anzeigen und zur Übersichtlichkeit filtern und sortieren lassen.

Angefangen habe ich mit:

echo ">getallqueries (1000) >quit" | nc 127.0.0.1 4711

Nun habe ich mittels grep und dem Hostnamen der IP aussortiert:

echo ">getallqueries (1000) >quit" | nc 127.0.0.1 4711 | grep "hostname"

Nun habe ich mittels awk die aufgerufene Domain herausgepickt:

echo ">getallqueries (1000) >quit" | nc 127.0.0.1 4711 | grep "hostname" | awk '{print $3}'

Dann noch sortiert und doppelte Einträge aussortiert:

echo ">getallqueries (1000) >quit" | nc 127.0.0.1 4711 | grep "hostname" | awk '{print $3}' | sort | uniq

Irgendwie ist mir diese Liste immer noch zu lang.
Ich würde gerne unterscheiden zwischen geblockten und ungeblockten Domains. Ich hatte gesehen, dass in der RAW-Liste u.a. auch noch "#53" steht. Mittels "grep (-v) "#53" könnte man das machen. Dummerweise werden nicht geblockte Domains dieser IP, die vorher schon mal von einem anderen Gerät aufgerufen worden sind, ohne "#53" abgelegt, da sie noch im Cache waren.

Hat jemand eine Idee wie ich das besser angehen könnte?

Das Endergebnis sollen zwei Listen einer IP sein, einmal die ungeblockten, einmal die geblockten Domains.

Auch frage ich mich, was die einzelnen Angaben bei der Ausgabe sein sollten.
Beispiel:

1616963753 A DOMAIN hostname.router 2 0 4 149 N/A -1 84.200.70.40#53

Was sind das für Werte hinter dem Hostnamen?
"2 0 4 149 N/A -1"

Viele Grüße
Bernd

Die Telnet-API liefert (fast) ausschließlich nur Antworten aus Pi-holes Arbeitsspeicher, also aus den letzten 24 Stunden.

Für gezielte Recherchen, zumal wenn nicht nur die letzen 24 Stunden untersucht werden sollen, ist eine SQL-Abfrage der Query-Datenbank besser geeignet.

Mit folgendem Kommando listest Du z.B. auf, wie oft eine Domäne von der IP-Adresse 192.168.0.1 seit dem ersten März (2021-03-01) angefragt und von Pi-hole blockiert (status NOT IN) wurde, sortiert nach Häufigkeit:

sqlite3 /etc/pihole/pihole-FTL.db "SELECT count(domain), domain FROM queries \
WHERE client = '192.168.0.1' AND status NOT IN(0,2,3) \
AND timestamp > strftime('%s','2021-03-01') \
GROUP BY domain ORDER BY count(domain) DESC;"

Da Pi-hole die Daten aus dem Arbeitsspeicher standardmässig jede Minute in die Datenbank schreibt, sind aktuelle Daten entsprechend nach dieser Minute verfügbar.

Die Datenbank lässt sich außerdem auch über Pi-holes Weboberfläche unter Long-term data abfragen.

1 Like

Danke für dein Feedback.

Mit der Datenbank komme ich leider nicht klar. Um es besser zu verstehen, hatte ich mir den DB Browser Sqlite besorgt um die Spalten und Zeilen zu sehen. Aber die Abfrage habe ich nicht mal im Ansatz hinbekommen.

Ich habe daher erstmal mit der API weitergearbeitet und folgendes mir erarbeitet:

Geblockte Domains:

echo ">getallqueries (50000) >quit" | nc 127.0.0.1 4711 | awk '{print $2 " " $3 " " $4 " " $5}' | grep '^A ' | grep "Hostname" | grep '[1,4,5,6,7,8,9,10,11]$' | awk '{print $2}' | grep -v --file=domainlist.txt | sort | uniq

Erlaubte Domains:

echo ">getallqueries (50000) >quit" | nc 127.0.0.1 4711 | awk '{print $2 " " $3 " " $4 " " $5}' | grep '^A ' | grep "Hostname" | grep '[2,3,12,13,14]$' | awk '{print $2}' | grep -v --file=domainlist.txt | sort | uniq

Kurze Erklärung in der Reihenfolge der Befehle:

  • awk+print = Hiermit stelle ich die Reihenfolge um (Type nach vorne)
  • grep '^A ' = (Rauswurf von allem außer Type A)
  • grep "Hostname" = (Rauswurf von allem außer vom Hostnamen)
  • grep [Zahlen] = Rauswurf nach Status (erlaubt/geblockt)
  • awk print $2 = Rauswurf aller Daten außer Domain
  • grep -v domainlist.txt = Rauswurf aller Domains in der Liste (üblichen Domains, die man nicht sehen will)
  • sort = Liste sortieren
  • uniq = doppelte Einträge löschen

Gibt es eine Möglichkeit dies in Pi-hole zu vergrößern?
Bei mir läuft Pi-Hole auf einem Raspberry Pi4 mit 4GB RAM, der sowieso kaum belegt ist.

Nein.

Ich würde hier hartnäckig nach wie vor SQL empfehlen.
Die Telnet API wird vermutlich mit einer der nächsten Pi-hole-Versionen eingestellt und verschwinden.

Die von Dir jetzt angestrebte Lösung würde dann nicht mehr funktionieren.

Für die SQL-Anweisung zu geblockten Domänen habe ich Dir bereits ein Beispiel geliefert. Für erlaubte Domänen müsstest Du die Selektion einfach umkehren (von status NOT IN in status IN).

1 Like

Ok, sehe ich ein, ich versuch es.

Das habe ich jetzt hinbekommen. :slight_smile:

In deinem Befehl steht ein festes Datum (1.3.). Geht das auch mit einer Angabe von Tagen, sprich z.B. die letzten x Tage?

Sollte gehen mit

sqlite3 /etc/pihole/pihole-FTL.db "SELECT count(domain), domain FROM queries \
WHERE client = '10.0.1.5' AND status NOT IN(0,2,3) \
AND timestamp > strftime('%s','now','-30 day') \
GROUP BY domain ORDER BY count(domain) DESC;"
2 Likes

This topic was automatically closed 21 days after the last reply. New replies are no longer allowed.