Regex whitelist funktioniert nicht

Hallo zusammen,
ich gebe über die Regex Whitelist folgendes frei:

^(?!.*samsung).*cdn*(?!.*samsung).*$

d.h. er soll alles whitelisten, was *cdn*.* enthält, jedoch nicht was den Begriff "samsung" enthält (SmartTV...). In sämtlichen Online Regexteste bekomme ich matches

z.B.
[MATCH]
cdn.adnxs.com
tags.tiqcdn.com

[KEIN MATCH]
cdn.samsungcloudsolutions.com

Theoretisch funktioniert es.

Jedoch werden beiden gematchten domains im Regex Whitelist von pihole geblockt -> gravity.

Was habe ich falsch gemacht, warum der Whitelist Match nicht funktioniert? Es wird doch folgende Reihenfolge angewandt (von 5 nach 1)

    1. Exact Whitelist
    1. Regex Whitelist
    1. Exact Blacklist
    1. Blocklist domains (AKA gravity)
    1. Regex Blacklist

Ich denke, es liegt daran, dass dein RegEx lookahead nutzt und dies von Pi-hole's RegEx Syntax nicht unterstützt wird. Genaueres kann uns sicher @DL6ER sagen.

Was funktioniert ist hier beschrieben: Overview - Pi-hole documentation

pi@s740:~$ pihole-FTL regex-test "^(?samsung).*cdn*(?samsung).*$" cdn.adnxs.com
[i] Compiling regex filter...
    Compiled regex filter in 0.078 msec

Checking domain...
    NO MATCH!
   Time: 0.025 msec
pi@s740:~$ pihole-FTL regex-test "^(?samsung).*cdn*(?samsung).*$" cdn.samsungcloudsolutions.com
[i] Compiling regex filter...
    Compiled regex filter in 0.145 msec

Checking domain...
    NO MATCH!
   Time: 0.027 msec

Ich steige da nicht wirklich durch, wie das dann heißen müsste. Habe jetzt schon einige Versionen laut Doku probiert. Kannst du mir eventuell einen gültigen durchgeben?

Mit einem RegEx wird es in Pi-hole eher nicht gehen, selbst mit mehreren vielleicht nicht. Was ist denn dein eigentliches Ziel? Nur die 2-3 Samsung CDN Domains zu blocken? Weißt du denn wie viele es sind? Warum musst du explizit auch alle *.cdn* freigeben?

Über die gravity werden immer mal wieder einige cdn domains geblockt, was dann zum fehlerhaften Laden/Darstellung der Webseite führt. Bisher habe ich ca. 40 cdn Seiten in der Whitelist aufgeführt. Also die enthalten wirklich cdn als Teil ihrer Domain.

Den Samsung TV muss ich leider ins Internet lassen, möchte aber die samsungcloud domains, welche auch cdn enthalten blocken. Sind 2-3 Domains, ja. Der TV schickt wiederkehrend alle zwei Sekunden drei Anfragen raus. Das funkt mir zu viel raus :slight_smile:

Über einen Blacklist Regex habe ich es schon hinbekommen, dass er erstmal alle TLD, außer welche definierten zu blocken (.de, .com, .net uvm). Das ganze dann mit ;invert umgekehrt, damit die aufgeführten nicht geblockt werden^^

Vllt gibts ja doch einen Trick17

Richtig. Reguläre Ausdrücke existieren in vielen verschiedenen Geschmacksrichtungen, wir legen es hier auf nackte Performance an. Für Performance wird entweder BRE (basic regular expressions) oder ERE (extended regular expressions) empfohlen. Wir nehmen letzteren Standard, da er einige Dinge mehr kann. Pi-holes FTL kann dann entweder die GNU-Regex Bibliothek oder TRERegex einsetzen (in den bereitgestellten Programmen immer letzteres), beides mit Pi-hole eigenen Extensions, die in den Docs aufgelistet sind.

Lookahead sind extrem teuer in der Ausführung, daher haben wir diese nicht in den Werkzeugkasten aufgenommen. Die Erwartung ist schließlich, dass dutzende (vielleicht hunderte oder gar tausende) Regex innerhalb von idealerweise weniger als einer Millisekunde ausgewertet werden können um keine quälenden Verzögerungen zu verursachen. Diesen Anspruch haben PCRE oder andere umfangreichere Regex-Dialekte meist nicht, da sie meist alleine daherkommen und dann auch noch i.A. auf wesentlich leistungsfähigeren Maschinen als z.B. einem Raspberry Pi laufen.

Wir haben Lookbehind, aber das scheint mir hier für die vorliegende Aufgabe nicht nützlich.

Ansonsten noch der kurze Kommentar zu

dem cdn* mit dem * Multiplikator auf dem n - das ist vermutlich so auch nicht gewollt, dass hier cdn, cdnnnn und cdnnnnnnn passen. Und am Ende brauchst Du kein .*$ weil das im Endeffekt ja nur sagt: "und was da sonst noch alles kommt bis zum Ende". Das kann man ohne Verlust einfach streichen.

Ich würde folgendes machen: steck den Fernsehr in eine eigene Gruppe (nicht default!) und blockiere diese zwei/drei Domains in der neuen Gruppe. In der Default gibst du einfach *cdn* frei. Nach belieben kannst du noch Adlisten zu der Fernsehrgruppe hinzufügen.

@yubiuser
Das mit den Gruppen könnte DER Tip gewesen sein. Zwar waren mir die Gruppen bekannt, aber dadurch dass ich diese noch nie bisher einsetzte, verschwand das aus meinem Kopf.

@DL6ER
Vielen Dank für die Aufschlüsselung. Apropo Performance. Das war mir bisher nie so richtig bekannt mit Regex, aber ich werde das mal mit dem Testcommand den yubiuser schrieb ausprobieren. Habe da nämlich gelegentlich ein ganz merkwürdiges langsames Ladeverhalten mancher Webseites.

Besten Dank bis hier her. Ihr macht eine Top Arbeit :grinning:

@yubiuser @DL6ER
Das mit den Gruppen funktioniert super.

Hätte nur eine Anregung, dass es beim Führen von Gruppen sehr sinnvoll wäre, wenn man bei den Gruppen eine Art Erben-Merkmal/Auto-Zuweisung einstellen könnte. Bisher Name, Status und Description einstellbar.

Auto-Zuweisung = Ein : Gruppe fügt sich bei allen Adlists/Whitelists/Blacklists autom als enabled hinzu

Auto-Zuweisung = Aus : Gruppe muss man bei Adlists/Whitelistss/Blacklists separat aktivieren

Wenn man das bei einer Gruppe aktiviert, dann muss man bestehende selber einstellen. Hätte also eine Wirkung für alle spätere Einstellung, jedoch deutliche Verbesserung des Einstellungsaufwands.

Wäre so etwas für eine kommende Pihole Version umsetzbar?

Wir haben das intern diskutiert und die Umsetzung ist nicht so einfach. Bitte eröffne einen Feature reqeust in https://discourse.pi-hole.net/c/feature-requests/8 damit der Wunsch hier im Thread nicht verloren geht.

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