Je voudrais voir les en-têtes HTTP envoyés d'Apache (écoute 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 texte clair.
J'ai essayé quelques variantes de la commande tcpdump
suivante:
$ 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 exemple HEAD
).
Comment afficher les en-têtes dans un format lisible par l'homme?
Voici une ligne unique que j'ai trouvée pour afficher les en-têtes HTTP de demande et de réponse en utilisant tcpdump
(qui devrait également fonctionner pour 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 limite la coupure du paquet à 10 Ko et ne connaît que GET, POST et HEAD, mais cela devrait suffire dans la majorité des cas).
[~ # ~] modifier [~ # ~] : l'a modifié pour se débarrasser des tampons à chaque étape pour le rendre plus réactif. Nécessite maintenant Perl et stdbuf, alors utilisez la version originale si vous n'en avez pas: [~ # ~] éditez [~ # ~] : Changement des cibles de port de script de 80 à 4080, pour écouter réellement le trafic qui passait déjà par Apache, au lieu du trafic extérieur direct arrivant au 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:
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 vous assurer d'obtenir le paquet entier.
Vous pouvez également utiliser wireshark
pour afficher les en-têtes de manière interactive.
Essayez d'utiliser http://justniffer.sourceforge.net/ C'est un meilleur outil ou Wireshark avec l'option "Follow TCP Flow", il y a juste de bien meilleures options que tcpdump pour voir les en-têtes (demandes/réponses)