Encuentra procesos usando una interfaz de red

9

Estoy tratando de encontrar una manera de apagar de forma segura una interfaz de red, es decir, sin interrumpir ningún proceso. Para esto, necesito averiguar qué procesos están usando actualmente esa interfaz. Las herramientas como ss, netstato lsofestán mostrando muy útil, que los procesos tienen tomas abiertas, pero que no muestran wpa_supplicant, dhcpcd, hostapdy otros.

¿Hay alguna forma de detectar estos procesos de manera general? Puede que no sea para dhcpcd, ya que es solo un programa que abre un socket de vez en cuando, pero supongo que wpa_supplicant y hostapd "harían algo" en esa interfaz que es detectable y quizás también conduce al PID relevante.

ipsec
fuente

Respuestas:

13

Dichos programas utilizarán sockets Netlink para comunicarse directamente con el controlador del hardware de la red. lsofla versión 4.85 agregó soporte para sockets Netlink, pero en mis pruebas en CentOS 5.8, la característica no parece funcionar muy bien. Quizás depende de las características agregadas en los núcleos más nuevos.

Sin embargo, es posible hacer una suposición bastante buena sobre cuándo te has encontrado con un socket de Netlink. Si cat /proc/net/netlinkobtiene una lista de sockets abiertos de Netlink, incluido el PID de los procesos que los tienen abiertos. Luego, si tiene lsof -p $THEPIDesos PID, encontrará entradas con socken la TYPEcolumna y can't identify protocolen la NAMEcolumna. No se garantiza que estos son sockets Netlink, pero es una apuesta bastante buena.

También puede inferir que un proceso dado está hablando directamente con una interfaz si tiene archivos /sys/class/net/$IFNAMEabiertos.

Ahora, dicho todo esto, creo que su pregunta está equivocada.

Digamos que hay un comando que no he descubierto. Llámelo lsif -i wlan0y diga que devuelve una lista de PID que acceden a la interfaz nombrada. ¿Qué podría hacer con él que le permitiera "no molestar" los procesos utilizando esa interfaz, como lo solicitó? ¿Planeabas acabar con todos los procesos usando esa interfaz primero? Eso es bastante inquietante. :) ¿Tal vez estabas pensando que quitar la interfaz de debajo de un proceso que la usa de alguna manera sería perjudicial?

¿Qué tiene de malo al final ifconfig wlan0 down?

Las interfaces de red no son dispositivos de almacenamiento. No tiene que vaciar datos en el disco y desmontarlos con gracia. Puede que no valga la pena romper los enchufes abiertos, pero como ya sabe, puede resolverlo con netstaty lsof. wpa_supplicantno va a ponerse de mal humor si rebota su interfaz sin ceremonias. (Si lo hace, es un error y necesita ser reparado; no indicaría alguna falla tuya).

Los programas de red bien escritos hacen frente a tales cosas como algo natural. Las redes no son confiables. Si un programa no puede hacer frente al rebote de una interfaz, tampoco podrá hacer frente a cables Ethernet desconectados, módems DSL o retroexcavadoras .

Warren Young
fuente
Muchas gracias. Descubrí que lsof informa correctamente los sockets de netlink en mi sistema. Parece suficiente grep para ROUTE para encontrar los procesos que quiero. Por lo que estoy haciendo con esta información: preguntarle al usuario si el apagado debe cancelarse en caso de que el usuario haya iniciado procesos asociados con esta interfaz.
ipsec
¿Hay alguna manera de averiguar a qué interfaz particular están conectados los procesos?
ipsec
No conozco un camino, a falta de straceellos cuando se inician, y esperando la bind(2)llamada.
Warren Young
También puede usar cualquier "archivo" tun0 en el proceso usando este comando: find /proc/ -name tun0 | cut -d\/ -f3 | uniq | xargs -IPID lsof -p PID
frogstarr78