Wie blockiere ich Punkte „.“ in einer Iptables-Regel?

Wie blockiere ich Punkte „.“ in einer Iptables-Regel?

Ich habe diese Regel in meinen Iptables, um Domänen zu blockieren, die mit enden .watch:

sudo iptables -A OUTPUT -j DROP -m string --string ".watch" --algo kmp

Das Problem ist jedoch, dass das .nicht abgeglichen werden kann. Die obige Zeile stimmt also mit nichts überein. Wenn ich jedoch den Punkt von .watchbis entferne watch, funktioniert es einwandfrei.

Wie kann ich die Punkte „.“ in iptables-Regeln blockieren?

Antwort1

Syntaktisch scheint das korrekt zu sein, aber Ihr Ansatz ist für diesen Zweck nicht geeignet. DieSaitenpatchstimmt mit einer Zeichenfolge irgendwo im Paket überein:

  • Sie verwerfen alle Pakete, die watchoder .watchirgendwo vorhanden sind. Dies führt wahrscheinlich zu Fehlalarmen und führt sogar einen neuen Vektor für Denial-of-Service-Angriffe ein.
  • Es kann keinen verschlüsselten Datenverkehr verarbeiten. Es kann nicht blockierenGroßteil des Webverkehrs.
  • bmObwohl Ihnen für den Matching-Algorithmus ( Boyer–Moore & Knuth–Pratt–Morris) relativ gute Optionen zur Verfügung stehen kmp, kann die Verwendung des String-Filters immer noch rechenintensiv sein.

Auch davor wird in der Dokumentation ausdrücklich gewarnt:

Bitte verwenden Sie dieses Match mit Vorsicht. Viele Leute wollen dieses Match zusammen mit dem DROP-Ziel verwenden, um Würmer zu stoppen. Das ist ein großer Fehler. Es würde durch jede IDS-Umgehungsmethode zunichte gemacht werden.

In ähnlicher Weise haben viele Leute diese Übereinstimmung verwendet, um bestimmte Funktionen in HTTP wie POST oder GET zu stoppen, indem sie alle HTTP-Pakete mit der Zeichenfolge POST verwerfen. Bitte haben Sie Verständnis dafür, dass diese Aufgabe besser von einem Filterproxy erledigt wird. Darüber hinaus würde mit der ersteren Methode jeder HTML-Inhalt mit dem Wort POST verworfen. Diese Übereinstimmung wurde entwickelt, um interessante Pakete zur besseren Analyse in die Warteschlange des Benutzerlandes stellen zu können, das ist alles. Das Verwerfen von Paketen auf dieser Grundlage würde durch jede IDS-Umgehungsmethode verhindert.

Für das, was Sie erreichen möchten, gibt es bessere Alternativen:

  • DNS-basierte Filterung. Jeder DNS-Server kann dies tun. Zum Beispiel:DNS-Masqist ein gängiger, leichtgewichtiger DNS-Forwarder: Sie können einfach address=/watch/0.0.0.0seine Konfiguration ergänzen.
  • Webproxy-basierte Filterung.

Antwort2

DNS-Namen werden als Längenpräfixlabels kodiert (sieheRFC 1035für Details), Sie müssen also verwenden, --hex-string "|05|watch|00|"um Namen abzugleichen, die auf enden .watch(beachten Sie, dass die Länge als 2 hexadezimale Ziffern geschrieben wird, z. B. serverfault.comwürde als kodiert ). Beachten Sie, dass dies mit und "|0b|serverfault|03|com|00|"kombiniert werden sollte (oder 5353, wenn Adressen abgeglichen werden), da es sonst wahrscheinlich auf viele andere, nicht verwandte Pakete zutrifft.-p udp--destination-port 53.local

DNS-Abfragen können auch über TCP erfolgen, das Filtern von TCP ist jedoch komplexer und vorhandene Kommentare zu verschlüsselten Anfragen sowie Vorschläge zur Verwendung der Filterung auf Anwendungsebene mit einem DNS und/oder Webproxy gelten weiterhin.

verwandte Informationen