IPTables Bug?

Hallo alle zusammen,

ich bin gerade etwas am Programmieren und stoße dabei auf ein merkwürdiges Problem. In meinem Tool wird ein bash-script sehr oft aufgerufen, welches IPTables Regeln hinzufügen und löschen soll. Das hinzufügen der Regeln (Hauptsächlich Redirects) klappt auch wunderbar und ich sehe alle Regeln wenn ich sie mir von IPTables ausgeben lasse.

Wenn ich beim beenden des Programmes jedoch alle Regeln wieder entfernen möchte kommt es zu einem Problem. Es wird genau der gleich IPTables Befehl aufgerufen wie beim hinzufügen (jedoch mit -D statt -A) um die Regeln zu löschen.

Interessanterweise bleiben dabei einige Regeln am Ende stehen. Das Problem ist reproduzierbar, jedoch betrifft es immer andere zufällige Regeln. Wenn ich mein Bash-Script in eine Datei loggen lassen, sehe ich, dass die Regel angeblich mit Returncode 0 von IPTables entfernt wurde.

Ist jemandem von euch ein Problem mit IPTables bekannt, wenn viele (auch gleichzeitige, da threaded) Regeln gleichzeitig gelöscht oder hinzugefügt werden sollen?

Würde mich über Erfahrungen freuen.

Grüße
Terminatorthree
 
Existieren die gleichen Regelen vielleicht mehrfach in iptables? Dann müssen diese auch (mehrmals) wieder entfernt werden.
 
Danke für deine Rückmeldung.
Nein die Regeln existieren definitiv genau 1 mal und sind eindeutig. Ich habe die Regeln sowohl vorher, währeddesssen als auh nachher gezählt und verglichen.

Weitere Ideen wären super
 
Nein habe ich noch nicht. Was soll das bringen? hinzugefügt werden sie ja alle, nur nicht wieder entfernt. Testen werde ich es aber trotzdem gleich mal.

Edit: nein, hat auch nichts geändert
 
Last edited by a moderator:
Naja, wenn er nur viele Regeln selektiv entfernen will, müsste er den Rest ja jedesmal danach wieder neu hinzufügen. Vielleicht auch nicht unbedingt das optimalste.

Kannst du uns von deinem Script eine "Light" Variante zum reproduzieren zur Verfügung stellen. Damit sich hier nicht erst jeder was anderes bastelt und am Ende doch nicht aufs gleiche Ergebnis kommt. :)
 
Hallo,

erstmal vielen Dank für eure Antworten. Ich habe das Programm nun so geändert, dass die Regeln in eine Queue gepackt und dann sequentiell abgearbeitet werden und immer auf die Fertigstellung einer Regel gewartet wird. Das Problem scheint sich damit vollständig lösen zu lassen.

Die Idee mit dem kompletten Löschen der Chain und Aufbauen der verbleibenden Regeln habe ich auch aufgegriffen, damit lässt sich in manchen Fällen die Performance deutlich verbessern. Interessanterweise dauert das Aufbauen der vielen Regeln bei sequentieller Abarbeitung verhältnismäßig lange.

Vielen Dank an alle die sich an diesem Thread beteiligt haben, ich denke wenn es keine weiteren Ideen gibt, kann hier zugemacht werden.

P.S: Es handelte sich größtenteils um Redirect Regeln, Das Problem mit dem nicht kompletten Löschen der Regeln lies sich BEI MIR reproduzieren, jedoch kann ich nicht mehr sicher sagen, ob es sich um einen Java-(Programmier)-Problem oder wirklich um ein IPTables Problem handelt.
 
Ich hab das eben mal ausprobiert und reproduziert.
Vielleicht hättest du einfach mal nach der Fehlermeldung googlen sollen, die iptables in solchen Fällen ausspuckt:
Code:
iptables: Resource temporarily unavailable.

Dann stößt man nämlich zum Beispiel auch auf sowas: http://www.spinics.net/lists/netfilter-devel/msg15667.html
Da sind auch 4 Lösungsansätze drin:
  • nicht parallel ausführen
  • Sleep zwischen den Ausführungen
  • Neuversuchen, falls vorhergehender Versuch fehlgeschlagen
  • ipset
 
Danke für den Tipp.
Leider habe ich diese Fehlermeldung gar nicht bekommen, sodass ich nicht wusste wonach ich googlen sollte. Bei mir wurde iptables von einem Wrapper-Script aufgerufen und hat auch keinen Fehlercode (in meinen Tests) zurückgegeben, ich habe extra den Returncode loggen lassen und der war bei mir 0. Letztendlich habe ich das Problem ja nun auch genau durch die von die geposteten Ansätze gelöst, entweder sleep oder sequentielle Abarbeitung (was ich letztendlich umgesetzt habe).

Vielen Dank aber für die Aufklärung

Terminatorthree
 
Back
Top