awk を介して、tcpdump によってキャプチャされたパケットのストリーム内の各パケットから特定のフィールドと ASCII データ (ソース IP、ターゲット IP、およびペイロード) を抽出するパイプラインをセットアップしようとしていますが、問題があります。問題は、ペイロードが任意であり、awk を介してレコードにフィルター処理するために使用できる固定構造を見つけるのが難しいことだと思います。これが私の現在のコマンドです:
sudo tcpdump -i en1 -A -q -l | awk ' { print "fields are $3 $5 $8} '
フィルタリングしようとしている出力の1行を次に示します。
12:45:23.890302 IP 10.0.1.3.52695 > weblnb.fogcreek.com.http: tcp 739
E....M@.@...
T.........P-.....&.....
2U......GET /default.asp?pg=pgRss&ixDiscussGroup=5 HTTP/1.1
Host: discuss.joelonsoftware.com
User-Agent: Vienna/2.6.0.2601
Accept: */*
Accept-Encoding: gzip
Accept-Language: en-us
Cookie: __utma=261409944.1875583.1351297139.1362842383.1362868129.78; __utmz=261409944.1358134504.43.4.utmcsr=joelonsoftware.com|utmccn=(referral)|utmcmd=referral|utmcct=/; fb_SessionId=qc48cvnjvacl3jeo76l8qv69emn119; DBID=LTOJIXRXTFAPXDGFBKCAYLVCILYFCA; fbToken=lqdf3avvfodabtfvd5c4drt18107B8; sUniqueID=20121026230417-66.117.217.10-slb5btkgb5; __utma=131697940.47826445.1351869116.1360335377.1361680499.5; __utmz=131697940.1361680499.5.2.utmccn=(referral)|utmcsr=statcounter.com|utmcct=/p8568424/exit_link_activity/|utmcmd=referral
Connection: keep-alive
このフィルターからの目的の出力は次のとおりです。
10.0.1.3.52695 weblnb.fogcreek.com.http: { E....M@.@...
T.........P-.....&.....
2U......GET /default.asp?pg=pgRss&ixDiscussGroup=5 HTTP/1.1
Host: discuss.joelonsoftware.com
User-Agent: Vienna/2.6.0.2601
Accept: */*
Accept-Encoding: gzip
Accept-Language: en-us
Cookie: __utma=261409944.1875583.1351297139.1362842383.1362868129.78; __utmz=261409944.1358134504.43.4.utmcsr=joelonsoftware.com|utmccn=(referral)|utmcmd=referral|utmcct=/; fb_SessionId=qc48cvnjvacl3jeo76l8qv69emn119; DBID=LTOJIXRXTFAPXDGFBKCAYLVCILYFCA; fbToken=lqdf3avvfodabtfvd5c4drt18107B8; sUniqueID=20121026230417-66.117.217.10-slb5btkgb5; __utma=131697940.47826445.1351869116.1360335377.1361680499.5; __utmz=131697940.1361680499.5.2.utmccn=(referral)|utmcsr=statcounter.com|utmcct=/p8568424/exit_link_activity/|utmcmd=referral
Connection: keep-alive}
注: ここでの抽象化のレベルは、上記の 1 つの特定の例に限定されません。フィルタリングされた出力の一般的な構造は次のようになります。
$sourceip $targetip {$raw_packet_data/payload,_could_be_http_stream_or_just_plain_gibberish}
ペイロード フィールドの境界の終了は、次のパケットの開始である必要があります。$sourceip.
また、awk フィルターは、この方法で tcpdump 出力ストリームのすべての行をキャプチャする必要があります。1 行だけではありません。
これを実装する方法に関する提案はありますか?