Comment puis-je me débarrasser des sockets dans l'état FIN_WAIT1?

18

J'ai un port bloqué par un processus que je devais tuer. (un petit démon telnet qui s'est planté). Le processus a été tué avec succès mais le port est toujours dans un état «FIN_WAIT1». Cela n'en sort pas, le délai d'attente semble être fixé à «une décennie».

Le seul moyen que j'ai trouvé pour libérer le port est de redémarrer la machine entière, ce qui est bien sûr quelque chose que je ne veux pas faire.

$ netstat -tulnap | grep FIN_WAIT1 
tcp        0  13937 10.0.0.153:4000         10.0.2.46:2572          FIN_WAIT1  -

Est-ce que quelqu'un sait comment je peux débloquer ce port sans redémarrer?

Gert M
la source

Réponses:

18
# record what tcp_max_orphans's current value
original_value=$(cat /proc/sys/net/ipv4/tcp_max_orphans)

#set the tcp_max_orphans to 0 temporarily
echo 0 > /proc/sys/net/ipv4/tcp_max_orphans

# watch /var/log/messages
# it will split out "kernel: TCP: too many of orphaned sockets"
# it won't take long for the connections to be killed

# restore the value of tcp_max_orphans whatever it was before. 
echo $original_value > /proc/sys/net/ipv4/tcp_max_orphans

# verify with 
netstat -an|grep FIN_WAIT1
IdaWong
la source
2
cela améliorerait la réponse à noter $whateveritwasavant de l'écraser.
contrôle
7

Vous devriez pouvoir définir le délai d'expiration avec /proc/sys/net/ipv4/tcp_fin_timeout.

Il ne semble vraiment pas y avoir de moyen d'effacer le socket manuellement.

innaM
la source
6
Cette réponse n'est pas correcte. tcp_orphan_retries affecte FIN_WAIT1, tcp_fin_timeout affecte FIN_WAIT2.
suprjami
suprjami est correct, tcp_fin_timeout affecte FIN_WAIT2. Ce qui est uniquement déclenché lors de l'utilisation de SO_LINGER.
Matt
@innaM Pouvez-vous s'il vous plaît supprimer cette réponse? Il n'est pas correct et accumule des downvotes. Je vois que vous êtes toujours actif, il semble donc plus judicieux de supprimer la réponse.
Andrew B
@Andrew B: Il semble qu'il ne soit pas possible de supprimer les réponses acceptées.
innaM
6

Il semble que le paramètre tcp_orphan_retries contrôle le nombre de tentatives qui seront effectuées avant qu'un port sans serveur ne soit libéré. C'était 0 ici, après l'avoir mis à 1, les ports avaient disparu.

HTH

user64877
la source
1
Étroitement lié: 0 est une valeur par défaut, ce qui signifie 8. serverfault.com/a/408882/152073
Andrew B
5

/proc/sys/net/ipv4/tcp_fin_timeoutest le délai d'expiration de l'état FIN-WAIT-2, et non FIN-WAIT-1. Vous devriez suivre la route tcpkill ou vous pouvez essayer de jouer avec les temps de Keepalive sous /proc/sys/net/ipv4/tcp_keepalive_*pour forcer un kill par le SO.

Ryan Ahearn
la source
2

L'exécution de ces étapes sous l'ID racine et cela m'a effacé:

Capturez le paramètre du noyau à modifier dans une variable

$ orig_orphans=$(sysctl -a|grep tcp_max_orph|cut -f3 -d' ')

Définissez temporairement le nombre maximal d'orphelins sur 0

$ sysctl -w net.ipv4.tcp_max_orphans=0

Vérifiez que le port problématique n'est plus utilisé

$ netstat -np|grep 9716

Attendez un peu et répétez l'étape ci-dessus si nécessaire jusqu'à ce que la commande ci-dessus ne renvoie aucune ligne

Réinitialisez le paramètre du noyau tcp_max_orphans à la valeur d'origine à partir de la variable ci-dessus

$ sysctl -w net.ipv4.tcp_max_orphans=$orig_orphans
Rad Mandapati
la source
Bonjour, Bienvenue sur Serverfault. J'ai modifié votre message pour rendre la mise en forme de votre réponse plus cohérente avec les autres réponses sur ce site. Pour votre prochaine réponse, veuillez ne pas utiliser autant de titres que vous l'avez fait ici et envisagez de prendre d'autres réponses comme modèle pour vos propres réponses. Merci pour votre contribution. Profitez de votre trajet sur serverfault.
Richard
1

FIN_WAIT1

L'application sur la machine locale a fermé la connexion. Une indication de cela a été envoyée à la machine distante.

Votre application a fermé son côté de la connexion, le socket attend maintenant que le côté distant confirme cette fermeture. Si vous avez un problème avec un grand nombre de ces prises détenues dans FIN_WAIT1, vous devez suivre les conseils de Manni ci-dessus.

Dave Cheney
la source
0

Sur le noyau Linux> = 4.9, vous pouvez utiliser la sscommande d'iproute2 avec la clé -K

ss -K dst 192.168.1.214 dport = 49029 le noyau doit être compilé avec l'option CONFIG_INET_DIAG_DESTROY activée.

via /unix//a/511691/43898

eri
la source
-4

cela peut aider:

net.ipv4.tcp_keepalive_probes = 5
net.ipv4.tcp_keepalive_intvl = 15
net.ipv4.tcp_retries2 = 2
net.ipv4.tcp_orphan_retries = 1
net.ipv4.tcp_reordering = 5
net.ipv4.tcp_retrans_collapse = 0
wkf1436
la source
6
Cela peut aider si vous expliquez ce que c'est. Nous sommes des professionnels, et en tant que tels, nous ne collons pas aveuglément des choses et espérons que cela aide.
Michael Hampton