Linux - lsof/kill

Bonjour,

Je suis semi-débutant sous linux (oui ça existe). J’ai donc un serveur dédié sous debian avec lsof.
Je souhaiterai fermer une connexion TCP sur mon serveur, je la localise donc avec lsof:

[root@monhost ~]$ lsof -i TCP@84.11.11.11:4165 COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME ircd 879 monhost 20u IPv4 209510754 TCP monhost.com:ircd->84.11.11.11:4165 (ESTABLISHED) [root@monhost ~]$

Et … et … et ensuite je suis un peu bloqué. Avec la commande kill, il n’est apparament pas possible de fermer cette connexion. (le pid 879 est un serveur ircd je ne veux donc pas le kill).

Si quelqu’un à une petite idée, merci d’avance :stuck_out_tongue:

V.

PS: Oui, je veux obligatoirement passer par le mode console et non par les commande irc.
PS2: Oui, c’est une fausse ip.

En gros tu veux dégager cette connexion vers ton IRCd ? A ma connaissance il n’est pas possible de forcer une application à abondonner une connexion réseau. Par contre ce que tu peux faire c’est de rajouter temporairement une règle iptables pour faire quitter le client :

iptables -I INPUT --source 84.11.11.11 -p tcp --dport 6667 -j REJECT --reject-with tcp-reset

Et puis quelques secondes plus tard tu enleves la regle :

iptables -D INPUT --source 84.11.11.11 -p tcp --dport 6667 -j REJECT --reject-with tcp-reset

Fut un temps existait la commande tcpkill, syntaxiquement compatible avec tcpdump (je dis “fut un temps” car je n’ai pas touché à un linux depuis longtemps, et la commande n’est apparemment pas intégrée de base à MacOSX).

Une autre solution serait d’utiliser la commande hping pour générer un RST (demande de fermeture de connexion).

Edit : Apparemment, tcpkill vient avec dsniff… Donc si tu as dsniff, tu devrais avoir tcpkill pas loin

Ah oui, bien joué.

Peut-être pas tant que ça :

[quote]3.3.2. …when I can see ongoing connections with tcpdump?

libnids, dsniff’s underlying TCP/IP reassembling library, needs to see the start of a connection in order to follow it. There are several good reasons for this, as outlined in Ptacek and Newsham’s seminal paper on network IDS evasion.[/quote]

Je savais que quelque chose me chiffonnait avec cette commande, trop facile… En gros, tcpkill t’évite seulement d’avoir à construire ton paquet avec hping, mais les informations sur la connexion TCP, tu dois quand même les avoir sniffées avant.

Il y a bien une solution, mais elle est crade, je préviens : ce que tu pourrais faire, ce serait carrément supprimer le socket en mémoire (en remplaçant toute la zone par des 0). Mais attention, ton ircd peut très bien ne pas aimer et réagir bizarrement. De plus, si tu te trompes d’adresse mémoire, tu risques de faire plantouiller ton système (sans danger, t’auras juste à redémarrer). Bon, je vous l’avais dit que c’était crade !

PS : Si je ne dis pas de bêtise, l’adresse mémoire pour un socket se trouve dans la colonne DEVICE de lsof.
Et pour avoir la taille d’un socket en mémoire, un petit tour du côté de la prog. système en C devrait t’aider :stuck_out_tongue:

[quote=« universal_tonton, post:6, topic: 28815 »]Il y a bien une solution, mais elle est crade, je préviens : ce que tu pourrais faire, ce serait carrément supprimer le socket en mémoire (en remplaçant toute la zone par des 0). Mais attention, ton ircd peut très bien ne pas aimer et réagir bizarrement. De plus, si tu te trompes d’adresse mémoire, tu risques de faire plantouiller ton système (sans danger, t’auras juste à redémarrer). Bon, je vous l’avais dit que c’était crade !

PS : Si je ne dis pas de bêtise, l’adresse mémoire pour un socket se trouve dans la colonne DEVICE de lsof.
Et pour avoir la taille d’un socket en mémoire, un petit tour du côté de la prog. système en C devrait t’aider :P[/quote]

Ma solution avec iptables est quand meme plus propre que ca :stuck_out_tongue:

Merci, avec iptables ça marche impec.
Avec quelques recherches sur le net, j’ai vu la solution tcpkill, mais il faut que j’installe des librari supplementaire. Il existe aussi un prog nommé cutter qui permet de fermer une connexion tcp en envoyant un packet RST.

V.

PS: j’oubliais, merci à tous :stuck_out_tongue:

[quote=“universal_tonton, post:6, topic: 28815”]Il y a bien une solution, mais elle est crade, je préviens : ce que tu pourrais faire, ce serait carrément supprimer le socket en mémoire (en remplaçant toute la zone par des 0). Mais attention, ton ircd peut très bien ne pas aimer et réagir bizarrement. De plus, si tu te trompes d’adresse mémoire, tu risques de faire plantouiller ton système (sans danger, t’auras juste à redémarrer). Bon, je vous l’avais dit que c’était crade !

PS : Si je ne dis pas de bêtise, l’adresse mémoire pour un socket se trouve dans la colonne DEVICE de lsof.
Et pour avoir la taille d’un socket en mémoire, un petit tour du côté de la prog. système en C devrait t’aider :P[/quote]
Heu, a mon avis tu risques d’avoir vraiment du mal pour utiliser cette solution, deja va falloir trouver un moyen d’ecrire dans la zone de memoire utilisée par le noyau, ensuite trouver l’adresse memoire de la structure correspondant à cette socket. Et finalement si tu te contentes de mettre des 0, tu risques juste de te retrouver avec un beau plantage de ton OS. Si tu veux pas de plantage, vas te falloir bien étudier les sources du noyau pour voir tout ce qu’il se passe quand tu closes un socket, et essayer de faire pareil mais en reflechissant aux problemes qui se poseront si le socket est modifié par ailleurs au moment ou tu fais la modif de ton coté, et prier très fort pour que tu n’oublies rien. En gros à moins d’etre super fort et de developper des exploits kernel tous les jours, t’as quasi aucune chance pour que ca marche (surtout du premier coup).

Pour la solution avec iptables, à la limite tu peux te faire un petit script BASH qui simplifie la démarche… bon, désolé, unreal m’a donné goùt au BASH et maintenant je fais des scripts pour tout et pour rien :stuck_out_tongue: