Rechercher des processus à l'aide d'une interface réseau

9

J'essaie de trouver un moyen d'arrêter une interface réseau en toute sécurité, c'est-à-dire sans perturber aucun processus. Pour cela, j'ai besoin de savoir quels processus utilisent actuellement cette interface. Des outils comme ss, netstatou lsofmontrent des signes utiles qui ont des processus sockets ouverts, mais ils ne montrent pas wpa_supplicant, dhcpcd, hostapdet d' autres.

Existe-t-il un moyen de détecter ces processus de manière générale? Ce n'est peut-être pas le cas pour dhcpcd, car ce n'est qu'un programme ouvrant un socket de temps en temps, mais je suppose que wpa_supplicant et hostapd «feraient quelque chose» à cette interface qui est détectable et peut-être aussi conduit au PID correspondant.

ipsec
la source

Réponses:

13

Ces programmes utiliseront des sockets Netlink pour communiquer directement avec le pilote du matériel réseau. lsofla version 4.85 a ajouté la prise en charge des sockets Netlink, mais dans mes tests sur CentOS 5.8, la fonctionnalité ne semble pas très bien fonctionner. Cela dépend peut-être des fonctionnalités ajoutées dans les noyaux plus récents.

Cependant, il est possible de faire une bonne estimation du moment où vous avez rencontré un socket Netlink. Si vous cat /proc/net/netlinkobtenez une liste des sockets Netlink ouvertes, y compris le PID des processus qui les ont ouverts. Ensuite, si vous lsof -p $THEPIDces PID, vous trouverez des entrées avec sockdans la TYPEcolonne et can't identify protocoldans la NAMEcolonne. Ce n'est pas garanti qu'il s'agit de sockets Netlink, mais c'est un très bon pari.

Vous pouvez également déduire qu'un processus donné parle directement à une interface s'il a des fichiers /sys/class/net/$IFNAMEouverts.

Maintenant, tout cela étant dit, je pense que votre question est erronée.

Disons qu'il y a une commande que je n'ai pas découverte. Appelez-le lsif -i wlan0et dites qu'il renvoie une liste de PID accédant à l'interface nommée. Que pourriez-vous en faire qui vous permettrait de "ne pas déranger" les processus utilisant cette interface, comme vous l'avez demandé? Envisagiez-vous de tuer tous les processus utilisant cette interface en premier? C'est assez dérangeant. :) Peut-être pensiez-vous plutôt que supprimer l'interface sous un processus l'utilisant serait en quelque sorte dangereux?

Qu'est-ce qui est si mauvais à la fin ifconfig wlan0 down?

Les interfaces réseau ne sont pas des périphériques de stockage. Vous n'avez pas besoin de vider les données sur le disque et de les démonter correctement. Ne pas casser les sockets ouverts pourrait être utile, mais comme vous le savez déjà, vous pouvez le comprendre avec netstatet lsof. wpa_supplicantne va pas bouder si vous faites rebondir son interface sans cérémonie. (Si c'est le cas, c'est un bug et doit être corrigé; cela n'indiquerait pas une faute de votre part.)

Des programmes de réseau bien écrits font face à de telles choses comme une évidence. Les réseaux ne sont pas fiables. Si un programme ne peut pas faire face à une interface rebondie, il ne pourra pas non plus gérer les câbles Ethernet débranchés, les modems DSL ou les rétrocaveuses .

Warren Young
la source
Merci beaucoup. J'ai découvert que lsof signale correctement les sockets netlink sur mon système. Il semble suffisant de demander à ROUTE de trouver les processus que je veux. Pour ce que je fais avec ces informations: demander à l'utilisateur si l'arrêt doit être annulé dans le cas où l'utilisateur a démarré des processus associés à cette interface.
ipsec
Existe-t-il un moyen de savoir à quelle interface particulière les processus sont connectés?
ipsec
Je ne suis pas au courant d'un moyen, à moins de les straceing au démarrage et de regarder l' bind(2)appel.
Warren Young
Vous pouvez également utiliser n'importe quel "fichier" tun0 dans les proc fs en utilisant cette commande: find /proc/ -name tun0 | cut -d\/ -f3 | uniq | xargs -IPID lsof -p PID
frogstarr78