Netzfilter: Pakete mit IP-Optionen verwerfen

Netzfilter: Pakete mit IP-Optionen verwerfen

Ich möchte eine Regel hinzufügen, die ein IPv4Paket mit einem beliebigen IP optionnachfolgenden Header verwirft. Ich verstehe, dass das IHLFeld (Internet-Headerlänge) im Header die Anzahl der 32-Bit-Wörter im IPv4-Header enthält, einschließlich Optionen. Mein Verständnis ist also, dass eine Regel die Paket-+Optionslänge aus dem IHLFeld abrufen und mit 20 vergleichen sollte (IPv4-Headerlänge ohne Optionen) und das Paket verwerfen sollte, wenn es größer als 20 ist.

Gibt es ein spezielles Modul, das die Überprüfung und Auswertung (Durchführung von Rechenoperationen) des Headers iptablesermöglicht ?IP

Antwort1

iptablesenthält die u32Match-Methode, die es ermöglicht, einige bitweise (aber keine beliebigen arithmetischen) Operationen, Bereichsvergleiche und einige zeigerartige Indirektionen auf die Paketnutzlast durchzuführen, um Bedingungen zu erfüllen:

u32

U32 prüft, ob aus einem Paket extrahierte Mengen von bis zu 4 Bytes bestimmte Werte haben. Die Spezifikation dessen, was extrahiert werden soll, ist allgemein genug, um Daten an bestimmten Offsets aus TCP-Headern oder Nutzdaten zu finden.

Es verfügt über eine eigene Grammatik für die Untersprache und die Grammatik und Beispiele im Handbuch sollten untersucht werden.

Internationales Völkerrechtist die Größe des IP-Headers (in 32-Bit-Blöcken statt in Bytes) und ist Teil der ersten 32 Bits im Header (4 Bits für die Version mit dem Wert 0x04 für IPv4, gefolgt von den 4 Bits für IHL) und, wenn also keine Option vorhanden ist, sollte diese Größe die Mindestgröße sein: 20 (Bytes) / 4 (Bytes pro 32-Bit-Wörter), also IHL = 5 (32-Bit-Wörter). Ich werde keine ungültigen Fälle behandeln, bei denen IHL < 5 ist, der IPv4-Stapel sollte sich bereits darum gekümmert haben.

Dies bedeutet:

  • Nimm den ersten 32-Bit-Wert
  • maskiere es für den IHL-Teil
  • verschiebe es um 24 Bit
  • Vergleiche Gleichheit mit 5 (invertiere das Ergebnis mit !der Übereinstimmung)

Um ein solches eingehendes Paket zu verwerfen mitiptables:

iptables -A INPUT -m u32 ! --u32 '0 & 0x0F000000 >> 24 = 5' -j DROP

ohne Umkehrung (stattdessen Übereinstimmung mit 6 oder höher):

iptables -A INPUT -m u32 --u32 '0 & 0x0F000000 >> 24 = 6:0xF' -j DROP

Das Handbuch enthält ein ähnliches Beispiel, bei dem es um 24 Bit verschoben und dann mit 4 multipliziert wird (also nur um 22 Bit verschoben wird), um Bytes und keine 32-Bit-Wörter zu erhalten (weil die u32später verwendeten Zeiger 8-Bit-Adressen verwenden), um den Anfang der Layer-4-Nutzlast abzurufen und mit weiteren Vorgängen fortzufahren:

... 0 >> 22 & 0x3C @ 0 >> 24 = 0"

Die erste 0 bedeutet, dass die Bytes 0-3 gelesen werden, >>22 bedeutet, dass diese 22 Bits nach rechts verschoben werden. Das Verschieben um 24 Bits würde das erste Byte ergeben, also sind nur 22 Bits das Vierfache davon plus ein paar weitere Bits. &3C eliminiert dann die zwei zusätzlichen Bits rechts und die ersten vier Bits des ersten Bytes. Wenn beispielsweise IHL=5 ist, ist der IP-Header 20 (4 x 5) Bytes lang.
[...]

Geben Sie für den Fall des OP:

iptables -A INPUT -m u32 ! --u32 '0 >> 22 & 0x3C = 20' -j DROP

ohne Inversion (und ohne Rücksicht darauf, dass der nächste mögliche Wert nicht 21, sondern 24 ist, und ohne Rücksicht auf den genauen Maximalwert, solange der angegebene Wert größer ist):

iptables -A INPUT -m u32 --u32 '0 >> 22 & 0x3C = 21:0xFF' -j DROP

Die erste Methode könnte wie folgt vereinfacht werden:

  • Nimm den ersten 32-Bit-Wert
  • maskiere es für den IHL-Teil
  • Vergleiche Gleichheit mit (5<<24), d. h. vergleiche mit 0x05000000 (dito)

Geben:

iptables -A INPUT -m u32 ! --u32 '0 & 0x0F000000 = 0x05000000' -j DROP

oder:

iptables -A INPUT -m u32 --u32 '0 & 0x0F000000 = 0x06000000:0x0F000000' -j DROP

oder auch:

  • Nimm den ersten 32-Bit-Wert
  • Vergleichen Sie den Wert mit dem Bereich zwischen 0x45000000 und 0x45FFFFFF für OK (IPv4stetsbeginnt mit 4 und jeder Wert nach dem IHL-Teil ist zu ignorieren) oder zwischen 0x46000000 und 0x4FFFFFFF für nicht OK.

Geben:

iptables -A INPUT -m u32 ! --u32 '0 = 0x45000000:0x45FFFFFF' -j DROP

oder:

iptables -A INPUT -m u32 --u32 '0 = 0x46000000:0x4FFFFFFF' -j DROP

Treffen Sie Ihre Wahl.

verwandte Informationen