Http

帶有 tcpdump 的 http 標頭的人類可讀格式

  • December 31, 2015

我想在 Linux 機器上查看從 Apache(監聽埠 80)發送到 Tomcat(埠 4080)的 HTTP 標頭。

根據維基百科

標頭欄位是明文字元串格式的以冒號分隔的名稱-值對。

我嘗試了以下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'

它限制在 10Kb 處切斷數據包,並且只知道 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 }'

一些解釋:

  • sudo stdbuf -oL -eL 使 tcpdump 執行行緩衝
  • tcpdump 魔法過濾器在這裡詳細解釋:https ://stackoverflow.com/questions/11757477/understanding-tcpdump-filter-bit-masking
  • grep 正在尋找任何帶有 GET、HTTP/ 或 POST 的行;或任何看起來像標題的行(字母和數字後跟冒號)
  • *BEGIN{$|=1}*導致 perl 執行行緩衝
  • s/.?(GET |HTTP/$$ 0-9. $$* |POST )/\n$1/g*在每個新請求或響應的開始之前添加一個換行符

引用自:https://serverfault.com/questions/504431