Wie man eine TCP-Socket-Zeitüberschreitung verursacht

20

Für die Simulation von Netzwerkkatastrophen in unserer Serverumgebung suchen wir nach einer Möglichkeit, absichtlich eine Zeitüberschreitung für einen TCP-Socket herbeizuführen. Gibt es einfache Möglichkeiten für vorhandene Steckdosen? Auch ein kleines C-Testfallprogramm wäre von Vorteil.

Wir haben bereits versucht, Netzwerkschnittstellen beim Lesen des TCP-Puffers und beim Lesen von nicht verbundenen gemounteten Ressourcen (Samba) zu deaktivieren.

Unser Testserver ist Ubuntu 12.04.4.

er453r
quelle

Antworten:

19

Um eine bestehende Verbindung zum Timeout herzustellen, können Sie verwenden iptables. Aktivieren DROPSie einfach eine Regel für den Port, den Sie deaktivieren möchten. Um ein Timeout für Ihren Samaba-Server zu simulieren, während eine aktive Verbindung besteht, führen Sie Folgendes auf dem Server aus:

sudo iptables -A INPUT -p tcp --dport 445 -j DROP

Das DROPZiel antwortet dem Absender des Pakets nicht mit einem RSTPaket oder ICMPFehler. Der Client hört auf, Pakete vom Server zu empfangen, und es tritt möglicherweise eine Zeitüberschreitung auf.

Je nachdem, ob / wie Sie iptableskonfiguriert haben, möchten Sie die Regel möglicherweise höher in den INPUTRegelsatz einfügen.

Bach
quelle
Versuchte dies mit Netcat (zum Abhören / Senden von Daten) und wartete ewig ... kein Timeout: / Und ich kann bestätigen, dass die Daten gelöscht wurden. Ich habe sogar /proc/sys/net/ipv4/tcp_keepalive_timeauf eine sehr kleine Nummer
umgestellt
@ er453r aktiviere die ausführliche Ausgabe mit, um ncat -vzu sehen, was genau passiert ncat. Es dauerte 2m7.291s auf einem Vanille Ubuntu 12.04 zu Timeout installieren
Creek
richtig - ich habe während des ersten Tests nichts durch die Steckdose geschickt. Ich habe die Timeouts endlich gemeistert und sie im Detail unten beschrieben :)
er453r
16

Die erste Antwort ist richtig, aber ich habe herausgefunden, wie diese Timeouts funktionieren, sodass Sie sie beobachten und testen können (nicht vergessen, den Port zu blockieren!).

Es gibt vier interessante Kernel-Parameter, die sich mit TCP-Timeouts befassen:

/proc/sys/net/ipv4/tcp_keepalive_time
/proc/sys/net/ipv4/tcp_keepalive_intvl
/proc/sys/net/ipv4/tcp_keepalive_probes
/proc/sys/net/ipv4/tcp_retries2

Jetzt gibt es 2 Szenarien:

  1. Der Socket ist geöffnet und versucht zu senden - dann (wenn es keine Antwort von der anderen Seite gibt), versucht das System es noch tcp_retries2einmal. Mit dem Standardwert von retires dauert es etwas mehr als 2 Minuten und der Socket läuft ab.

  2. Die Steckdose ist geöffnet und im Leerlauf - dann sind Keepalive-Limits interessant. Bei einem Idle-Socket-System wird tcp_keepalive_timesekundenlang gewartet , und danach wird tcp_keepalive_probesmal versucht, in tcp_keepalive_intvlSekundenintervallen ein TCP-KEEPALIVE zu senden . Und erst danach fällt die Steckdose aus.

er453r
quelle
1
Sie können diese Zeitüberschreitungen auch mitnetstat -o
er453r,