Verursachen sich schnell ändernde iptables-Regeln Probleme?

Verursachen sich schnell ändernde iptables-Regeln Probleme?

Ich schreibe ein Skript, das verschiedene Messwerte (z. B. die Bandbreitennutzung der Schnittstelle) überwacht und iptablesdie Regeln entsprechend ändert. Diese Änderungen können mindestens 2x pro Sekunde, bis zu 4 * number of interfacespro Sekunde erfolgen.

Die Sache ist, ich bin mir nicht sicher, wie iptablesmit Regeländerungen umgegangen wird. Werden die Dinge neu kompiliert und das Skript wird die CPU stark belasten? Oder was passiert mit Paketen, die während der Regeländerung noch verarbeitet werden? Werden sie gelöscht? Solche Bedenken gibt es.

Verursachen sich schnell ändernde iptables-Regeln Probleme?

BEARBEITEN: Für meine spezielle Anwendung sind alle Regeln bereits vorhanden. Sie dienen eher zum Aktivieren oder Deaktivieren (Hinzufügen oder Entfernen) bestimmter Regeln. Mit anderen Worten, die Tabellen werden mit der Zeit nicht wachsen und extrem groß werden.

Antwort1

Wie ändert man die Regeln?

Rufen Sie den iptablesBefehl wiederholt auf? Das wird erhebliche Auswirkungen auf die Leistung haben, denn so funktioniert iptables:

  • Erfassen Sie die gesamten Netfilter-Tabellen/-Ketten
  • Führen Sie EINE Änderung wie gewünscht durch
  • Laden Sie die gesamten Netfilter-Tabellen/-Ketten zurück in den Kernel.

Das geschieht amjeder einzelne iptablesAufruf.

Die Frage ist: Welcher Art sind die Änderungen, die Sie an den Regeln vornehmen?

Wenn Sie Regeln basierend auf Quell- und/oder Zieladressen hinzufügen/entfernen, sollten Sie ipsetstattdessen verwenden.

Wenn Sie jedoch Regeln hinzufügen/entfernen, beispielsweise weil Sie andere Parameter spontan ändern (beispielsweise ratehäufigere/seltenere Übereinstimmungen, Änderungen an den QoS-Flags usw.), ipsetist diese Option möglicherweise nicht für Sie geeignet.

Wenn Ihr Skript jedoch Änderungen vornimmtin Massen, können Sie es auch folgendermaßen machen:

  • Erfassen Sie die gesamten Netfilter-Tabellen/-Ketten
    • Sie können ein Dienstprogramm verwenden iptables-save, oder je nachdem, in welcher Sprache Sie Ihr Skript schreiben, gibt es möglicherweise eine Bibliothek, die dies für Sie erledigen kann
  • Führen Sie ALLE gewünschten Änderungen auf einmal durch
  • Laden (Commit) Sie die gesamten Netfilter-Tabellen/-Ketten zurück in den Kernel.
    • Sie können ein Dienstprogramm verwenden iptables-restoreoder ähnlich wie in Schritt 1 eine Bibliothek verwenden, die das für Sie erledigen kann

BEARBEITEN:

Ah, da die Regeln bereits in der Tabelle sind, können Sie dieBedingungsübereinstimmungum sie ein-/auszuschalten.

Fügen Sie es -m condition --condition $NAMEin Ihre iptablesRegel ein.

Dadurch wird eine Datei erstellt, /proc/net/ipt_condition/$NAME. Die Übereinstimmung ist erfolgreich, wenn die Datei enthält 1, und andernfalls, wenn die Datei enthält0

!(Sie können die Übereinstimmung natürlich durch Negation umkehren .)

Zum Beispiel:

iptables -A INPUT -m condition --condition allow_880 -p tcp -m tcp --dport 880 -j ACCEPT

So aktivieren Sie die Regel:

echo 1 > /proc/net/ipt_condition/allow_880

Etwas deaktivieren:

echo 0 > /proc/net/ipt_condition/allow_880

(Sie können jeden beliebigen Namen verwenden. Ich empfehle, ihn leicht erkennbar zu machen. Es gibt eine maximale Länge für den Namen, aber ich weiß nicht mehr, wie lang.)

Bearbeitung 1a:

Wenn Sie die Tabelle bereits erstellt haben, können Sie sie am einfachsten bearbeiten, indem Sie die Ausgabe von speichern iptables-save, sie bearbeiten (die Bedingungsübereinstimmungen für Regeln hinzufügen, die sie benötigen) und dann die gesamte Datei mit iptables-restoreoder laden.iptables-apply

Denken Sie daran: 1 Bedingungsdatei kann mehr als 1 Regel steuern. Sie müssen nicht 1 Datei pro Regel haben, es sei denn, Sie möchten das unbedingt.

Bearbeitung 1b:

Wie @AB in den Kommentaren erwähnt hat (danke!), -m conditionhandelt es sich möglicherweise nicht um eine Standardfunktion der in Ihrer Distribution integrierten iptables. In diesem Fall müssen Sie wahrscheinlich ein zusätzliches Paket installieren, zum Beispiel xtables-addons.

(Entschuldigung, das habe ich vergessen, da ich Gentoo verwende und das iptablesPaket bei Gentoo einfach der Kernel-Konfigurationsdatei folgt.)

Antwort2

In diesem Fall könnte Nftables besser geeignet sein. Nftables ist so konzipiert, dass es effizienter und skalierbarer ist als iptables, insbesondere bei komplexen Regelsätzen oder häufigen Änderungen. Es bietet eine bessere Leistung aufgrund seiner Integration in den Linux-Kernel und der optimierten Syntax.

verwandte Informationen