90 votes

Format lisible par l'homme pour les en-têtes http avec tcpdump

Je voudrais visualiser les en-têtes HTTP envoyés par Apache (écoutant sur le port 80) à Tomcat (sur le port 4080) dans une machine Linux.

Selon Wikipedia ,

Les champs d'en-tête sont des paires nom-valeur séparées par deux points au format de chaîne en clair.

J'ai essayé quelques variations de ce qui suit tcpdump commandement :

$ sudo tcpdump -lnX dst port 4080 -c 10

11:29:28.605894 IP SOME_IP.33273 > SOME_IP.4080: P 0:49(49) ack 1 win 23 <nop,nop,timestamp 1191760962 509391143>
    0x0000:  4500 0065 3a9f 4000 3f06 0084 628a 9ec4  E..e:.@.?...b...
    0x0010:  628a 9c97 81f9 0ff0 9e87 eee0 144b 90e1  b............K..
    0x0020:  8018 0017 fb43 0000 0101 080a 4708 d442  .....C......G..B
    0x0030:  1e5c b127 4845 4144 202f 6461 7070 6572  .\.'HEAD./dapper
    0x0040:  5f73 6572 7669 6e67 2f41 644d 6f6e 6b65  _serving/AdMonke
    0x0050:  793f                                     y?

Le résultat était toujours le même - un étrange mélange de charabia et de mots anglais (par ex. HEAD ).

Comment puis-je afficher les en-têtes dans un format lisible par l'homme ?

124voto

Kibber Points 1216

Voici une ligne simple que j'ai créée pour afficher les en-têtes HTTP de la demande et de la réponse à l'aide de la fonction tcpdump (ce qui devrait aussi fonctionner dans votre cas) :

sudo tcpdump -A -s 10240 'tcp port 4080 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)' | egrep --line-buffered "^........(GET |HTTP\/|POST |HEAD )|^[A-Za-z0-9-]+: " | sed -r 's/^........(GET |HTTP\/|POST |HEAD )/\n\1/g'

Il coupe le paquet à 10Kb et ne connaît que les commandes GET, POST et HEAD, mais cela devrait suffire dans la majorité des cas.

エディテージ Je l'ai modifié pour supprimer les buffers à chaque étape et le rendre plus réactif. Il a cependant besoin de Perl et de stdbuf maintenant, donc utilisez la version originale si vous ne les avez pas : エディテージ : Changement des cibles du port script de 80 à 4080, pour écouter réellement le trafic qui est déjà passé par apache, au lieu du trafic extérieur direct arrivant sur le port 80 :

sudo stdbuf -oL -eL /usr/sbin/tcpdump -A -s 10240 "tcp port 4080 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)" | egrep -a --line-buffered ".+(GET |HTTP\/|POST )|^[A-Za-z0-9-]+: " | perl -nle 'BEGIN{$|=1} { s/.*?(GET |HTTP\/[0-9.]* |POST )/\n$1/g; print }'

Quelques explications :

  • sudo stdbuf -oL -eL fait fonctionner tcpdump en tampon de ligne
  • le filtre magique de tcpdump est expliqué en détail ici : https://stackoverflow.com/questions/11757477/understanding-tcpdump-filter-bit-masking
  • grep recherche toutes les lignes avec GET, HTTP/ ou POST ; ou toutes les lignes qui ressemblent à un en-tête (lettres et chiffres suivis de deux points).
  • BEGIN{$|=1} permet à perl de fonctionner en tampon de ligne
  • s/.* ?(GET |HTTP/[0-9.]* |POST )/ \n $1/g ajoute une nouvelle ligne avant le début de chaque nouvelle demande ou réponse

24voto

Flup Points 7496

Vous pouvez obtenir quelque chose de proche de ce que vous voulez en utilisant -A par exemple

E....c@.@...
.....Ng.d.P..Ch.).....s.......
.A...u.BHEAD / HTTP/1.1
User-Agent: curl/7.29.0
Host: www.google.com
Accept: */*

N'oubliez pas d'utiliser -s 0 pour être sûr d'avoir le paquet entier.

Vous pouvez également utiliser wireshark pour visualiser les en-têtes de manière interactive.

0voto

Sidhi Ciang Points 151

Essayez d'utiliser http://justniffer.sourceforge.net/ C'est un meilleur outil ou Wireshark avec l'option "Follow TCP Flow", il y a juste beaucoup de meilleures options que tcpdump pour voir les en-têtes (demandes/réponses).

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X