Afficher les connexions réseau d'un processus

26

Il existe un moyen de montrer les connexions d'un processus? Quelque chose comme ca:

show PID

dans lequel showest une commande pour ce faire, et PIDest le pid du processus. La sortie que je veux est composée de toute la connexion du processus (en temps réel). Par exemple, si le processus tente de se connecter à 173.194.112.151, la sortie est 173.194.112.151.

Un exemple plus spécifique avec Firefox:

show `pidof firefox`

et avec firefox je vais d'abord sur google.com , puis sur unix.stackexchange.com et enfin 192.30.252.129 . La sortie, quand je ferme le brower, doit être:

google.com
stackexchange.com
192.30.252.129

(Évidemment, avec le navigateur, cette sortie n'est pas réaliste, car il existe de nombreuses autres connexions associées, mais ce n'est qu'un exemple.)

ᴜsᴇʀ
la source
Sous quelle variante Unix? La plupart ont des outils pour le faire, mais différents.
Gilles 'SO- arrête d'être méchant'
Donc, vous voulez essentiellement un journal de toutes les connexions?
Sergiy Kolodyazhnyy
Je pense que tcpdump ou Wireshark devraient alors faire le travail.
Sergiy Kolodyazhnyy
Quelques façons possibles de le faire: askubuntu.com/questions/11709/…
Mark Plotnick
@Gilles Ubuntu 14.04.3 LTS
ᴜsᴇʀ

Réponses:

24

Vous cherchez strace! J'ai trouvé cette réponse sur askubuntu , mais elle est valable pour Unix:

Pour démarrer et surveiller un nouveau processus:

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

Pour surveiller un processus existant avec un PID connu:

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

Sinon, mais cela est spécifique à Linux, vous pouvez exécuter le processus dans un espace de noms de réseau isolé et utiliser Wirehark pour surveiller le trafic . Ce sera probablement plus pratique que de lire le stracejournal:

  • créer un espace de noms de réseau de test:

    ip netns add test
    
  • créer une paire d'interfaces réseau virtuelles (veth-a et veth-b):

    ip link add veth-a type veth peer name veth-b
    
  • changer l'espace de noms actif de l'interface veth-a:

    ip link set veth-a netns test
    
  • configurer les adresses IP des interfaces virtuelles:

    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
    
  • configurer le routage dans l'espace de noms de test:

    ip netns exec test route add default gw 192.168.163.254 dev veth-a
    
  • activez ip_forward et établissez une règle NAT pour transférer le trafic provenant de l'espace de noms que vous avez créé (vous devez ajuster l'interface réseau et l'adresse IP 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
    

    (Vous pouvez également utiliser la règle MASQUERADE si vous préférez)

  • enfin, vous pouvez exécuter le processus que vous souhaitez analyser dans le nouvel espace de noms, et wirehark aussi:

    ip netns exec test thebinarytotest
    ip netns exec test wireshark
    

    Vous devrez surveiller l'interface veth-a.

Olivier
la source
2
straceest en fait spécifique au noyau Linux, il n'est donc pas valable pour tous les systèmes d'exploitation de type Unix. Si je comprends bien, les systèmes de type BSD ont des utilitaires similaires (DTrace et truss). Quoi qu'il en soit, bonne réponse (donc voté). Bienvenue sur Stack Exchange.
Anthony G - justice pour Monica
La réponse semble pointer dans la bonne direction, mais j'ai du mal à interpréter la stracesortie lors de l'examen git fetch. Je m'attendais à voir une sorte d'URL incluse dans la sortie, comme l'a également demandé l'OP. Quelqu'un peut-il aider?
andreee
14

Essayer

lsof -i -a -p `pidof firefox`
alxrem
la source
Cela fonctionne partiellement: il imprime certaines des connexions actuelles du processus, mais il se ferme automatiquement. Pour certains programmes, la sortie n'est que cet avertissement:lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /home/user/.gvfs Output information may be incomplete.
ᴜsᴇʀ
Vous pouvez ajouter des options -r1pour répéter la sortie toutes les secondes et -wsupprimer les avertissements.
alxrem
2
Cela montre uniquement les connexions à un moment donné, il ne répertorie pas toutes les connexions qu'un processus établit au cours de sa durée de vie. Même si vous mettez cette commande en boucle, les connexions de courte durée manqueront.
Gilles 'SO- arrête d'être méchant'
L'interrogateur n'a pas demandé à voir les connexions au cours de sa durée de vie. On pourrait interpréter (in real-time)comme from the point in time of tracking and forward.
llua
8

Voici une autre approche:

ss -nap | grep $(pidof firefox)

Exemple de sortie:

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
la source
1
Cela montre uniquement les connexions à un moment donné, il ne répertorie pas toutes les connexions qu'un processus établit au cours de sa durée de vie. Même si vous mettez cette commande en boucle, les connexions de courte durée manqueront.
Gilles 'SO- arrête d'être méchant'
5

Vous pouvez aussi essayer avec netstat -p. Depuis la page de manuel:

netstat - Imprimer les connexions réseau, les tables de routage, les statistiques d'interface, les connexions de mascarade et les appartenances multicast

Pour afficher uniquement les connexions réseau, utilisez netstat -tup. Notez que pour voir le processus PID, vous devrez peut-être être root.

Si vous n'en avez pas netstatsur votre système, vous pouvez en avoir ss, qui a presque la syntaxe exacte. Vous pouvez alors utiliser ss -tup(en tant que root).

Abel
la source
1
Cela montre uniquement les connexions à un moment donné, il ne répertorie pas toutes les connexions qu'un processus établit au cours de sa durée de vie. Même si vous mettez cette commande en boucle, les connexions de courte durée manqueront.
Gilles 'SO- arrête d'être méchant'
1
netstat -p | grep firefox | grep tcp
Philip Kirkbride
@Gilles Ce qui signifie que c'est une excellente réponse pour quiconque souhaite voir les connexions à un moment donné. Comme ce fut mon cas récemment.
Jose Antonio Reinstate Monica