Wie kann ich eine TCP-Verbindung unter bestimmten Bedingungen mithilfe von Linux-Netfilter/Iptables an beiden Enden sofort zurücksetzen?

Wie kann ich eine TCP-Verbindung unter bestimmten Bedingungen mithilfe von Linux-Netfilter/Iptables an beiden Enden sofort zurücksetzen?

Liebe Serverfault-Community,

Ich habe folgendes Problem: Ich muss TCP-Verbindungen auf beiden Netzwerkseiten sofort zurücksetzen (trennen), wenn in den Paketdaten eine bestimmte Zeichenfolge gefunden wird. Ich habe keine Kontrolle über die Anwendungen auf beiden Seiten und kann nur Linux-IPTables (oder ähnliche Tools) verwenden, um den Verbindungsabbruch durchzuführen.

Meine erste Idee bestand darin, die folgende iptables-Regel zu verwenden, um das gewünschte Ergebnis zu erzielen:

/usr/sbin/iptables -A INPUT -p tcp --dport 1234 -m string --algo bm --string 'BAD STRING' -j REJECT --reject-with tcp-reset

Dies funktioniert auf der Remote-Seite einwandfrei, indem ein TCP-RST-Paket an den Client gesendet wird, der daraufhin sofort die Verbindung trennt. Leider wird die lokale Seite über die erzwungene Trennung nicht benachrichtigt und der Serverprozess (Verbindung) bleibt für immer hängen.

Ich dachte, die Anforderung, eine bereits bestehende Verbindung auf beiden Seiten unter einer bestimmten Bedingung (in diesem Fall einer Zeichenfolgenübereinstimmung in einem IP-Paket) sofort zu trennen, sei nicht sehr ungewöhnlich. Also führte ich eine Google-Suche durch, konnte aber zu meiner Überraschung in angemessener Zeit nichts Brauchbares finden.

Gibt es eine Möglichkeit, mit iptables auf beiden Netzwerkseiten eine TCP-Trennung zu erreichen? Wenn nicht, welche anderen Tools könnte ich verwenden (denken Sie daran, dass ich keine Kontrolle über die Client-/Server-Anwendungen habe)?

Vielen herzlichen Dank schon einmal für eure wertvollen Antworten!

Beste grüße,

Jens

Antwort1

Sie könnenxt_RESET, z.B,-j RESET

Antwort2

Sie können Ihre Anwendung so konfigurieren, dass ein Timeout erfolgt.

Eine andere Lösung besteht darin, TCP KeepAlive zu konfigurieren und häufigere Überprüfungen durchzuführen, beispielsweise alle 10 Minuten.

Einige Anwendungen implementieren ein KeepAlive auf Anwendungsebene. Z. B. SSH, Apache.

Wenn das Keep-Alive-Signal gesendet und die Verbindung am Remote-Ende geschlossen wird, erhalten Sie vom Remote-Ende ein RST.

Statefull-Firewalls vergessen die Verbindung nach einer Zeit der Inaktivität. Das bedeutet, dass Sie verworfene Pakete und halboffene Verbindungen erhalten können, wenn Sie eine Zeit lang (30 Minuten oder 1 Stunde) keinen Verkehr haben.

Ich denke, es ist besser, nach dem konkreten Problem zu fragen, das Sie lösen möchten, als nach der konkreten Lösung, die Sie implementieren möchten.

Antwort3

Leider wird die lokale Seite nicht über die erzwungene Trennung informiert.

Das sollte so sein. Ein TCP-Reset bedeutet, dass dem Client mitgeteilt werden sollte, dass die Verbindung geschlossen wird. Wenn Ihr Client beim Senden des Resets hängt, bedeutet dies, dass er den Reset, der von Ihrem Host, auf dem IPTables ausgeführt wird, zurückgesendet wird, nicht richtig verarbeitet. Sofern Sie keine Möglichkeit haben, dieses Problem zu beheben, fällt mir keine Möglichkeit ein, dies zu erreichen.

verwandte Informationen