2013-06-07 15:55:48 +0000 2013-06-07 15:55:48 +0000
51
51

Surveiller le trafic TCP sur un port spécifique

J'ai fait des recherches assez poussées à ce sujet, mais je n'arrive pas à trouver un exemple fonctionnel.

Mon objectif est de surveiller le trafic TCP sur un port spécifique pour voir les connexions entrantes et les écrire dans un fichier texte. Le problème est que j'ai aussi besoin d'un horodatage sur chaque ligne pour montrer exactement quand le client s'est connecté à la seconde près.

J'ai déjà épuisé netstat, nmap, et tcptrack, mais aucun ne supporte l'horodatage.

Je pensais qu'un script shell linux pourrait fonctionner si je surveillais un port local spécifique et écrivais du texte dans un fichier quand une connexion est établie puis que je concaténerais simplement la date sur chaque ligne.

Je jouais avec ceci :

netstat -ano|grep 443|grep ESTABLISHED

ainsi que ceci :

tcptrack -i eth0 port 443

mais aucun des deux ne me convient car j'ai besoin du moment où la connexion est établie.

Si vous avez des suggestions ou si vous pouvez m'indiquer la bonne direction, ce serait très apprécié.

Merci. :)

Réponses (7)

73
73
73
2013-06-07 16:03:28 +0000

rédaction : Je continue à obtenir des votes pour ça des années plus tard. S'il vous plaît, n'allez pas chercher cette réponse, la réponse utilisant iptables ici est de loin supérieure à mon avis.


tcpdump port 443 and '(tcp-syn|tcp-ack)!=0'

ou seulement tcp-syn, ou seulement tcp-ack (je suppose que c'est celui-là), selon ce dont vous avez besoin.

33
33
33
2014-12-05 15:08:24 +0000

*Vous pouvez utiliser le support iptables du noyau Linux à cet effet * L'avantage est qu'il ne nécessite aucun logiciel supplémentaire pour être modérément utile. L'inconvénient est qu'il nécessite des privilèges root pour être mis en place (mais étant donné que vous parlez du port 443, qui est un port privilégié, vous avez probablement besoin de privilèges root avec la plupart des solutions).

Ajoutez une règle iptables avec quelque chose comme :

sudo iptables -I INPUT -p tcp --dport 443 --syn -j LOG --log-prefix "HTTPS SYN: "

(Ajustez la partie -I INPUT à votre goût.)

Lorsque la règle est déclenchée, une entrée syslog sera émise par le noyau. Par exemple, avec une règle d'entrée, l'entrée du journal peut ressembler à quelque chose comme :

Dec 5 09:10:56 hostname kernel : [1023963.185332] HTTPS SYN : IN=ifX OUT= MAC=80:80:80:80:80:80:80:80:80:80:80:80:08:00 SRC=A.B.C.D DST=W.X.Y. Z LEN=52 TOS=0x00 PREC=0x20 TTL=119 ID=11901 DF PROTO=TCP SPT=37287 DPT=443 WINDOW=8192 RES=0x00 SYN URGP=0

Vous pouvez alors utiliser n'importe quel outil de surveillance de journal courant pour faire quelque chose d'utile avec ces informations. Si votre implémentation syslog le prend en charge, vous pouvez même les diriger dans un fichier journal séparé, ce qui répond effectivement à votre exigence d'écrire les données de connexion dans un fichier horodaté à la seconde sans logiciel supplémentaire.

Notez que la cible LOG est une cible non terminale, ce qui signifie que toute règle qui la suit sera toujours évaluée, et le paquet ne sera ni rejeté ni accepté par la règle LOG elle-même. Cela rend la cible LOG utile également pour le débogage des règles de pare-feu.

Pour éviter d'inonder votre journal, envisagez d'utiliser le module limit en conjonction avec celui-ci. Voir la page de manuel iptables(8) pour plus de détails.

26
26
26
2013-06-07 16:13:36 +0000

Résolution micro-seconde

Par défaut, l'utilitaire tcpdump indiquera l'heure avec une résolution micro-seconde. Par exemple :

$ sudo tcpdump -i any port 443

affichera une sortie similaire à ce qui suit :

12:08:14.028945 IP localhost.33255 > localhost.https : Flags [S], seq 1828376761, win 43690, options [mss 65495,sackOK,TS val 108010971 ecr 0,nop,wscale 7], length 0 12:08:14.028959 IP localhost.https > localhost.33255 : Flags [R.], seq 0, ack 1828376762, win 0, length 0

Voir tcpdump(8) pour une liste complète des options de tcpdump, et pcap-filter(7) pour la syntaxe complète des filtres que vous pouvez utiliser.

5
5
5
2013-06-07 16:09:31 +0000

443 est un trafic crypté - il est donc difficile de faire la part des choses sur ce port de toute façon :

vous pouvez faire

yum installer ngrep ou apt-get installer ngrep

puis exécuter

ngrep -W byline -d any port 443 -q
2
2
2
2016-06-02 09:48:03 +0000

Vous pouvez également en avoir besoin pour surveiller les paquets entrants et sortants d'autres machines.

tcpflow -i eth0 -c port 7891

(option -i pour mentionner le réseau, option -c pour imprimer les paquets dans la console)

1
1
1
2013-06-07 15:59:57 +0000

Vous pouvez utiliser tcpdump ou Wireshark.

0
0
0
2017-05-26 11:08:35 +0000

Si vous avez besoin d'une solution permanente qui surveillera toujours le trafic sur les ports d'intérêt, je vous suggère d'utiliser la QoS (la commande tc sous linux). tc est un peu cryptique et non documenté, j'utilise donc FireQoS pour configurer la QoS et netdata pour la surveillance en temps réel.

Consultez cette page pour plus d'informations : https://github.com/firehol/netdata/wiki/You-should-install-QoS-on-all-your-servers