Mostrar conexiones de red de un proceso

25

¿Hay alguna forma de mostrar las conexiones de un proceso? Algo como eso:

show PID

en el que showhay un comando para hacer esto, y PIDes el pid del proceso. La salida que quiero está compuesta por toda la conexión del proceso (en tiempo real). Por ejemplo, si el proceso intenta conectarse a 173.194.112.151, la salida es 173.194.112.151.

Un ejemplo más específico con Firefox:

show `pidof firefox`

y con firefox voy primero a google.com , luego a unix.stackexchange.com y finalmente a 192.30.252.129 . La salida, cuando cierro el navegador, debe ser:

google.com
stackexchange.com
192.30.252.129

(Obviamente, con el navegador, esta salida no es realista, porque hay muchas otras conexiones relacionadas, pero esto es solo un ejemplo).

ᴜsᴇʀ
fuente
¿Bajo qué variante de Unix? La mayoría tiene herramientas para hacer esto, pero diferentes.
Gilles 'SO- deja de ser malvado'
Entonces, ¿esencialmente quieres un registro de todas las conexiones?
Sergiy Kolodyazhnyy
Creo que tcpdump o Wireshark deberían hacer el trabajo entonces.
Sergiy Kolodyazhnyy
Algunas formas posibles de hacer esto: askubuntu.com/questions/11709/…
Mark Plotnick
@Gilles Ubuntu 14.04.3 LTS
ᴇʀsᴇʀ

Respuestas:

23

Que estas buscando strace! Encontré esta respuesta en askubuntu , pero es válida para Unix:

Para iniciar y monitorear un nuevo proceso:

strace -f -e trace=network -s 10000 PROCESS ARGUMENTS

Para monitorear un proceso existente con un PID conocido:

strace -p $PID -f -e trace=network -s 10000

De lo contrario, pero eso es específico de Linux, puede ejecutar el proceso en un espacio de nombres de red aislado y usar wireshark para monitorear el tráfico . Esto probablemente será más conveniente que leer el straceregistro:

  • crear un espacio de nombres de red de prueba:

    ip netns add test
    
  • cree un par de interfaces de red virtuales (veth-a y veth-b):

    ip link add veth-a type veth peer name veth-b
    
  • cambiar el espacio de nombres activo de la interfaz veth-a:

    ip link set veth-a netns test
    
  • configurar las direcciones IP de las interfaces virtuales:

    ip netns exec test ifconfig veth-a up 192.168.163.1 netmask 255.255.255.0
    ifconfig veth-b up 192.168.163.254 netmask 255.255.255.0
    
  • configurar el enrutamiento en el espacio de nombres de prueba:

    ip netns exec test route add default gw 192.168.163.254 dev veth-a
    
  • active ip_forward y establezca una regla NAT para reenviar el tráfico que ingresa desde el espacio de nombres que creó (debe ajustar la interfaz de red y la dirección IP de SNAT):

    echo 1 > /proc/sys/net/ipv4/ip_forward
    iptables -t nat -A POSTROUTING -s 192.168.163.0/24 -o YOURNETWORKINTERFACE -j SNAT --to-source YOURIPADDRESS
    

    (También puede usar la regla MASQUERADE si lo prefiere)

  • Finalmente, puede ejecutar el proceso que desea analizar en el nuevo espacio de nombres, y Wirehark también:

    ip netns exec test thebinarytotest
    ip netns exec test wireshark
    

    Tendrás que controlar la interfaz veth-a.

Olivier
fuente
2
straceen realidad es específico del kernel de Linux, por lo que no es válido para todos los sistemas operativos tipo Unix. Según tengo entendido, los sistemas tipo BSD tienen utilidades similares (DTrace y truss). De todos modos, buena respuesta (muy votado). Bienvenido a Stack Exchange.
Anthony G - justicia para Monica
La respuesta parece apuntar en la dirección correcta, sin embargo, tengo problemas para interpretar el straceresultado mientras lo examino git fetch. Esperaba ver algún tipo de URL incluida en la salida, como también lo solicitó el OP. Alguien puede ayudar?
andreee
14

Tratar

lsof -i -a -p `pidof firefox`
alxrem
fuente
Funciona parcialmente: imprime algunas de las conexiones actuales del proceso, pero luego se cierra automáticamente. Para algunos programas, la salida es solo esta advertencia:lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /home/user/.gvfs Output information may be incomplete.
ᴇʀsᴇʀ
Puede agregar opciones -r1para repetir la salida cada segundo y -wsuprimir las advertencias.
alxrem
2
Esto solo muestra conexiones en un momento dado, no enumera todas las conexiones que realiza un proceso durante su vida útil. Incluso si coloca este comando en un bucle, perderá conexiones de corta duración.
Gilles 'SO- deja de ser malvado'
El interlocutor no solicitó ver las conexiones durante su vida útil. Se podría interpretar (in real-time)como from the point in time of tracking and forward.
llua
8

Aquí hay otro enfoque:

ss -nap | grep $(pidof firefox)

Salida de muestra:

tcp    ESTAB      0      0          192.168.0.222:49050    216.58.218.164:443    users:(("firefox",3280,69))
tcp    ESTAB      0      0          192.168.0.222:48630    198.252.206.25:443    users:(("firefox",3280,106))
tcp    ESTAB      0      0          192.168.0.222:44220     216.58.217.38:443    users:(("firefox",3280,140))
tcp    ESTAB      0      0          192.168.0.222:52690    54.240.170.181:80     users:(("firefox",3280,107))
tcp    ESTAB      0      0          192.168.0.222:48744    198.252.206.25:443    users:(("firefox",3280,87))
tcp    ESTAB      0      0          192.168.0.222:48811    198.252.206.25:443    users:(("firefox",3280,73))
Sergiy Kolodyazhnyy
fuente
1
Esto solo muestra conexiones en un momento dado, no enumera todas las conexiones que realiza un proceso durante su vida útil. Incluso si coloca este comando en un bucle, perderá conexiones de corta duración.
Gilles 'SO- deja de ser malvado'
5

Puedes probar también con netstat -p. Desde la página del manual:

netstat: imprime conexiones de red, tablas de enrutamiento, estadísticas de interfaz, conexiones enmascaradas y membresías de multidifusión

Para mostrar solo las conexiones de red, use netstat -tup. Tenga en cuenta que para ver el PID del proceso, es posible que deba ser root.

Si no tiene netstaten su sistema, puede tener ss, que tiene casi la sintaxis exacta. Puede usar entonces ss -tup(como root).

Abel
fuente
1
Esto solo muestra conexiones en un momento dado, no enumera todas las conexiones que realiza un proceso durante su vida útil. Incluso si coloca este comando en un bucle, perderá conexiones de corta duración.
Gilles 'SO- deja de ser malvado'
1
netstat -p | grep firefox | grep tcp
Philip Kirkbride
@Gilles Lo que significa que es una gran respuesta para cualquiera que quiera ver las conexiones en un momento dado. Como fue mi caso recientemente.
José Antonio reinstala a Mónica el