Comment puis-je surveiller toutes les demandes / connexions sortantes de ma machine?

71

Ma machine étant un serveur, je souhaite donc ignorer les connexions établies sur mon serveur (par exemple, lorsqu'une personne visite mon site Web). Je veux voir uniquement les connexions / demandes effectuées par mon serveur vers d'autres endroits.

Comment puis-je voir uniquement ces connexions sortantes?

EDIT: Je suis nouveau à ce genre de choses. Ce que j'essaie de faire, c'est simplement de voir si quelque chose de mon serveur est envoyé autre que des données pour mes applications Web. Par exemple, si quelqu'un visite mes sites Web, mon serveur enverra évidemment des données au navigateur du client. Mais supposons qu'il y ait aussi du code quelque part dans le cadre de mon application Web qui envoie des données statistiques à un autre endroit dont je ne suis pas au courant. J'aimerais voir les endroits sur lesquels mon serveur envoie des données, le cas échéant. Ce n'est probablement pas probable, mais supposons que vous décidiez d'utiliser un framework php ou nodejs que vous n'avez pas écrit: il y a une petite chance qu'il puisse envoyer un certain type de données quelque part. Si oui, c'est ce que j'aimerais voir.

trusktr
la source

Réponses:

77

Utilisez netstat. Par exemple

$ netstat -nputw
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
[...]
tcp        0      0 192.168.25.222:22       192.168.0.134:42903     ESTABLISHED 32663/sshd: gert [p

répertorie toutes les connexions sortantes UDP ( u), TCP ( t) et RAW ( w) (sans utiliser lou a) sous une forme numérique ( n, empêche les requêtes DNS longue durée possibles) et inclut le programme ( p) associé à cela.

Pensez à ajouter l' coption pour que la sortie soit mise à jour continuellement.

Gertvdijk
la source
Merci. C'est une bonne information. Pourriez-vous jeter un oeil à ma question mise à jour?
trusktr
1
Détournement complètement inapproprié (sauf que cette réponse a bien fonctionné sur Google): Cette réponse fonctionne également avec Windows. Utiliser netstaten "mode continu" -cne fonctionne pas. Vous utilisez plutôt des chiffres, comme netstat -na 1 | find "[Scan_Host_IP_Addr]"pour le mettre à jour chaque 1seconde (dans cet exemple). ( source ).
Ruffin
4
Cette interrogation, donc il ne sera pas toujours attraper toutes les connexions.
Reinierpost
Existe-t-il un moyen d’afficher des informations plus conviviales telles que les noms de domaine, des informations sur l’IP? Peut-être en utilisant un script personnalisé?
awm
@awm Eh bien, ce serait faisable avec stracele processus, filtrer pour les recherches de serveurs de noms (pas de détails, ce n'est pas une réponse complète à cela). Vous pouvez également afficher le DNS inversé des IP répertoriées en netstatomettant l' noption incluse dans ma réponse.
gertvdijk
11

Si vous souhaitez simplement vous connecter à chaque tentative de connexion, le plus simple est probablement la iptables LOGcible sur Linux (ou la fonctionnalité de journalisation de pare-feu équivalente sur votre système).

Si vous avez besoin de plus d’informations telles que la durée de la connexion et la quantité de données échangées dans les deux sens, alors conntrackd(sous Linux) est probablement la meilleure option.

Notez cependant que ces deux derniers enregistrent uniquement le trafic passant par netfilter, qui correspond généralement à tout le trafic mais ne comptabilise pas le trafic généré avec des piles IP dans l’espace utilisateur (comme les machines virtuelles ou tout ce qui utilise des sockets bruts) ou le trafic ponté.

Pour des solutions plus générales, vous pouvez jeter un oeil à des choses comme argus, bro-ids, sancpou ntopqui consignent toutes sortes d'informations en fonction du trafic qu'ils reniflent sur une interface.

Stéphane Chazelas
la source
9

J'ai essayé un tas d'outils, y compris iftop, ntop, iptrafet bien sûr les très utiles intégrés netstat -tupln(options prises en charge dépendent OS), mais le plus pratique pour mon cas d'utilisation se sont avérées être nethogs- il agrège les connexions par l'origine app , et est le moins bruyant de tous.

Installable via:

sudo apt-get install nethogs

Exécuter en tant que root:

sudo nethogs

Si votre objectif est uniquement de voir toutes les connexions TCP initiées par une application, vous pouvez utiliser:

sudo tcpdump -i lo -A | grep Host:
ccpizza
la source
6

Ce que je pense que vous voulez faire est d’obtenir une liste de ports d’écoute, puis de les supprimer de toute autre connexion TCP, ce seront toutes les connexions sortantes. La commande ss (socket status) affiche les colonnes "Local Address: Port" et "Peer Address: Port", nous devons supprimer les ports d'écoute de la colonne "Local Address: Port" et non de la colonne "Peer Address: Port". sinon vous risquez de manquer certaines connexions sortantes. Donc, pour cela, j'utilise \s{2}+derrière la chaîne ": $ port" dans le grep afin de faire correspondre les espaces qui existent derrière la colonne "Adresse locale: Port"; cette colonne a deux ou plusieurs espaces blancs derrière elle, où "Peer Address: Port" a un espace, puis une nouvelle ligne (grrr ... doit simplement avoir une nouvelle ligne, IMO,\s+\s{2}+.) Normalement, je pourrais essayer d’utiliser la fonctionnalité de filtrage de ss, comme avec ss -tn state established '(sport != :<port1> and sport !=:<port2>)' src <ip address>. Mais il semble qu'il y ait une limite à la longueur de cette chaîne, elle a bombardé un système sur lequel j'avais beaucoup de ports d'écoute. J'essaie donc de faire la même chose avec grep. Je crois que ce qui suit fonctionnera:

FILTER=$(ss -tn state listening | gawk 'NR > 1 {n=split($3,A,":"); B[NR-1]=A[n]} END {for (i=1; i<length(B); i++) printf ":%s\\s{2}+|", B[i]; printf ":%s\\s{2}+", B[i]}')

ss -tn state established dst :* | grep -P -v "$FILTER"

Notez que cela dépend de la version de ss que vous utilisez. Les anciennes versions (comme: utilitaire ss, iproute2-ss111117) ont un format de sortie différent. Vous devrez peut-être utiliser $ 3 au lieu de $ 4 dans awk. Notez également ss -tlnet ss -tn state listeningvous donne différentes sorties, ce qui est un peu contre-intuitif pour moi. YMMV.

J'ai trouvé une solution légèrement plus élégante qui ne nécessite pas de connaître l'adresse IP de l'hôte, ss -tn state established dst :*fonctionne bien, j'ai modifié les lignes de commande ci-dessus.

Vallée
la source
Souhaitez-vous s'il vous plaît ajouter une explication de la façon dont cela fonctionne? ( Modifiez la réponse; ne postez pas d'informations de clarification sous forme de commentaires.) Je pense que je l'ai en partie compris. Il semble qu'il faudra peut-être un peu plus de travail. J'ai exécuté ss -tn state listeningsur un hôte qui exécute un serveur FTP, et naturellement la commande a montré que la machine écoutait sur le port 21. Cela ne signifie-t-il pas que egrep -vtous les hôtes distants dont l'adresse IP comprend «21» (y compris «210») seront filtrés? "," 211 "," 212 ", ...)? Aussi, est-ce asortvraiment nécessaire, ou juste une façade?
G-Man
Je devais arranger à peu près tout, le script corrigé est au dessus.
Dale
En fin de compte, il serait beaucoup plus agréable que ss ou netstat n'inclue que cette fonctionnalité. Faites un ss --outpour obtenir une liste des connexions sortantes.
Dale
Nice, j'aime cette réponse. Je vais l'essayer quand je reviendrai à l'amélioration de la sécurité sur mon serveur. : D
trusktr
On pourrait penser que cela pourrait également être utilisé pour UDP, mais vous devez bien sûr utiliser des drapeaux et des états différents.
Dale
4

tcpdumpvous permet de voir tout le trafic IP circulant vers / depuis une interface spécifique avec la possibilité de filtrer en fonction de certains critères. tcpdumpest généralement installé par défaut sur la plupart des systèmes * nix, sinon il existe généralement un port quelque part pour le récupérer pour votre distribution spécifique.

txtechhelp
la source
2

netstat est une bonne option.Utilisez les paramètres requis (voir ses pages de manuel). Par exemple

netstat -antup

Ici, il peut surveiller tous les processus d'écoute (a) numériques (n) tcp (t) et udp (u) (p).

Vous pouvez également essayer la sscommande. Pour utilisation de référence:

Informations sur le réseau et le socket TCP / UDP SS Linux

Kratos
la source
1

Si vous utilisez Solaris ou un dérivé, jetez un œil à conntrack

jlliagre
la source
Sympa, cela est également disponible sur Arch Linux: archlinux.org/packages/community/i686/conntrack-tools - Pourriez-vous donner un exemple d'utilisation de conntrack pour ne voir que les connexions démarrées à partir local, mais pas à partir d'autres connexions?
trusktr