
Ich schreibe ein Skript, das verschiedene Messwerte (z. B. die Bandbreitennutzung der Schnittstelle) überwacht und iptables
die Regeln entsprechend ändert. Diese Änderungen können mindestens 2x pro Sekunde, bis zu 4 * number of interfaces
pro Sekunde erfolgen.
Die Sache ist, ich bin mir nicht sicher, wie iptables
mit 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 iptables
Befehl 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 iptables
Aufruf.
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 ipset
stattdessen verwenden.
Wenn Sie jedoch Regeln hinzufügen/entfernen, beispielsweise weil Sie andere Parameter spontan ändern (beispielsweise rate
häufigere/seltenere Übereinstimmungen, Änderungen an den QoS-Flags usw.), ipset
ist 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
- Sie können ein Dienstprogramm verwenden
- 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-restore
oder ähnlich wie in Schritt 1 eine Bibliothek verwenden, die das für Sie erledigen kann
- Sie können ein Dienstprogramm verwenden
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 $NAME
in Ihre iptables
Regel 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-restore
oder 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 condition
handelt 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 iptables
Paket 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.