Я хотел бы просмотреть заголовки HTTP, отправленные из Apache (прослушивание порта 80) в Tomcat (на порту 4080) на машине Linux.
В соответствии с Википедия,
Поля заголовка представляют собой пары имя-значение, разделенные двоеточиями, в формате строки с открытым текстом.
Я пробовал несколько вариантов следующих tcpdump
команда:
$ 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?
Результат всегда был один и тот же - странная смесь тарабарщины и английских слов (например, HEAD
).
Как просмотреть заголовки в удобочитаемом формате?
Вот однострочник, который я придумал для отображения HTTP-заголовков запросов и ответов, используя tcpdump
(что должно работать и в вашем случае):
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'
Он ограничивает отсечение пакета на 10 КБ и знает только команды GET, POST и HEAD, но этого должно быть достаточно в большинстве случаев.
РЕДАКТИРОВАТЬ: изменил его, чтобы избавиться от буферов на каждом этапе, чтобы сделать его более отзывчивым. Однако сейчас необходимы Perl и stdbuf, поэтому используйте исходную версию, если у вас их нет: РЕДАКТИРОВАТЬ: Изменены цели порта скрипта с 80 на 4080, чтобы фактически прослушивать трафик, который уже прошел через apache, вместо прямого внешнего трафика, поступающего на порт 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 }'
Некоторые пояснения:
Вы можете получить что-то близкое к тому, что хотите, используя -A
, например
E....c@.@...
.....Ng.d.P..Ch.).....s.......
.A...u.BHEAD / HTTP/1.1
User-Agent: curl/7.29.0
Host: www.google.com
Accept: */*
Не забудьте использовать -s 0
чтобы убедиться, что вы получите весь пакет.
В качестве альтернативы вы можете использовать wireshark
для интерактивного просмотра заголовков.
Попробуй использовать http://justniffer.sourceforge.net/ Это лучший инструмент или Wireshark с опцией «Follow TCP Flow», просто есть много лучших вариантов, чем tcpdump для просмотра заголовков (запросов / ответов)