Ma machine est un serveur, je veux donc ignorer les connexions établies avec mon serveur (par exemple, lorsque quelqu'un visite mon site Web). Je veux voir niquement les connexions/demandes effectuées par mon serveur à d'autres endroits.
Comment puis-je voir niquement ces connexions sortantes?
EDIT: Je suis nouveau dans 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 que je ne connais pas. J'aimerais voir les endroits où mon serveur envoie des données, le cas échéant. Ce n'est probablement pas probable, mais supposez 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.
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 l
ou a
) sous forme numérique (n
, empêche d'éventuelles requêtes DNS de longue durée) et inclut le programme (p
) associé à cela.
Pensez à ajouter l'option c
pour que la sortie soit mise à jour en continu.
Si vous voulez simplement enregistrer chaque tentative de connexion, la plus simple est probablement la cible iptables
LOG
sous Linux (ou la fonction de journalisation de pare-feu équivalente sur votre système).
Si vous avez besoin de plus d'informations comme 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.
Cependant, notez que les deux ci-dessus enregistrent uniquement le trafic qui passe par netfilter, qui est généralement tout le trafic, mais ne tient pas compte du trafic généré avec des piles IP dans l'espace utilisateur (comme les machines virtuelles ou tout ce qui utilise des sockets brutes) ou du trafic ponté.
Pour des solutions plus générales, vous pouvez jeter un œil à des choses comme argus
, bro-ids
, sancp
ou ntop
qui enregistrent toutes sortes d'informations en fonction du trafic qu'ils reniflent sur une interface.
J'ai essayé un tas d'outils, y compris iftop
, ntop
, iptraf
, et bien sûr le très utile intégré netstat -tupln
(les options prises en charge dépendent du système d'exploitation), mais le plus pratique pour mon cas d'utilisation s'est avéré être nethogs
- il regroupe les connexions par l'application d'origine, et est le moins bruyant de tout.
Installable via:
Sudo apt-get install nethogs
Exécuter en tant que root:
Sudo nethogs
Si votre objectif est de voir toutes les connexions TCP initiées par n'importe quelle application, vous pouvez utiliser:
Sudo tcpdump -i lo -A | grep Host:
Ce que je pense que vous voulez faire, c'est obtenir une liste de ports d'écoute, puis les supprimer de toutes les autres connexions TCP, alors 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 y parvenir, j'utilise \s{2}+
Derrière la chaîne ": $ port" dans le grep pour faire correspondre les espaces qui existent derrière la colonne "Local Address: Port"; cette colonne a deux ou plusieurs blancs espaces derrière elle, où "Peer Address: Port" a un espace et ensuite une nouvelle ligne (grrr ... devrait juste avoir une nouvelle ligne, IMO, alors j'aurais pu utiliser \s+
au lieu de \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 sur la durée de cette chaîne, elle a bombardé un système où j'avais un beaucoup de lis ports de serrage. 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: l'utilitaire ss, iproute2-ss111117) ont un format de sortie différent, vous devrez donc peut-être utiliser 3 $ au lieu de 4 $ dans awk. Notez également que ss -tln
Et ss -tn state listening
Vous donnent une sortie différente, 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'IP de l'hôte, ss -tn state established dst :*
Fonctionne bien, j'ai modifié les lignes de commande ci-dessus.
tcpdump
vous 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. tcpdump
est généralement installé sur la plupart des systèmes * nix par défaut, sinon il y a généralement un port quelque part pour le récupérer pour votre distribution spécifique.
netstat
est une bonne option. Utilisez les paramètres comme requis. (voir ses pages de manuel) Par exemple
netstat -antup
Ici, il peut surveiller tous les processus d'écoute (a) numérique (n) tcp (t) et udp (u) (p).
Vous pouvez également essayer la commande ss
. Pour référence:
Si vous exécutez Solaris ou un dérivé, jetez un œil à conntrack