Comment faire expirer un socket TCP

20

Pour les simulations de catastrophe du réseau de notre environnement de serveur, nous recherchons un moyen d'expiration intentionnelle d'un socket TCP. Existe-t-il des moyens simples pour les sockets existants? De plus, un petit programme de test C serait un plus.

Nous avons déjà essayé de désactiver les interfaces réseau pendant la lecture du tampon TCP et la lecture à partir de ressources montées déconnectées (samba).

Notre serveur de test est Ubuntu 12.04.4.

er453r
la source

Réponses:

19

Pour provoquer un délai d'attente de connexion sortant, vous pouvez utiliser iptables. Activez simplement une DROPrègle sur le port que vous souhaitez désactiver. Donc, pour simuler un délai d'expiration pour votre serveur Samaba, alors qu'une connexion active est active, exécutez ce qui suit sur le serveur:

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

La DROPcible ne répondra pas avec un RSTpaquet ou une ICMPerreur à l'expéditeur du paquet. Le client cessera de recevoir des paquets du serveur et finira par expirer.

Selon si / comment vous avez iptablesconfiguré, vous souhaiterez peut-être insérer la règle plus haut dans l'ensemble de INPUTrègles.

Ruisseau
la source
J'ai essayé cela en utilisant netcat (pour écouter / envoyer des données) et j'ai attendu pour toujours ... pas de délai: / Et je peux confirmer que les données ont été supprimées. J'ai même changé /proc/sys/net/ipv4/tcp_keepalive_timepour un très petit nombre
er453r
@ er453r essayez d'activer la sortie verbeuse avec ncat -vpour voir ce qui se passe exactement ncat. Il m'a fallu 2m7.291s sur une installation Ubuntu 12.04 vanille pour expirer
Creek
à droite - je n'ai rien envoyé par le socket lors de ce premier test. J'ai enfin maîtrisé les délais d'attente et les ai décrits en détail ci-dessous :)
er453r
16

La première réponse est correcte, mais j'ai découvert comment ces délais d'attente fonctionnent, vous pouvez donc les observer et les tester (n'oubliez pas de bloquer le port!).

Il existe 4 paramètres de noyau les plus intéressants qui traitent des délais d'expiration TCP:

/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

Maintenant, il y a 2 scénarios:

  1. Le socket est ouvert et essaie de transmettre - puis (s'il n'y a pas de réponse de l'autre côté), le système réessaye tcp_retries2fois. Avec la valeur par défaut de retires, cela prend quelque part plus de 2 minutes et le socket expire.

  2. Le socket est ouvert et inactif - alors les limites de keepalive sont intéressantes. Avec un système de socket inactif, il faudra attendre tcp_keepalive_timequelques secondes, puis essayer tcp_keepalive_probesd'envoyer un KEEPALIVE TCP par intervalles de tcp_keepalive_intvlsecondes. Et seulement après que tout échoue, le socket expire.

er453r
la source
1
vous pouvez également surveiller ce délai en utilisantnetstat -o
er453r