こんにちは!NOC(ネットワークオペレーションセンター)で日々パケットの荒波と格闘しているシニアエンジニアです。数え切れないほどの障害対応をくぐり抜けてくると、「あぁ、あの時も変なパケットに悩まされたなぁ」と遠い目をしてしまうことがあります。
インフラの世界に飛び込んだばかりの頃って、黒い画面(ターミナル)に流れる文字を見るだけで圧倒されてしまいますよね。「パケットキャプチャ」なんて聞くと、なんだか難しそうな要塞の門を叩くような気分になるかもしれません。でも、安心してください。一歩ずつ、身近な例えから紐解いていけば、誰でもパケットの心を読めるようになりますよ。
今回は、ネットワーク監視やトラブルシューティングの強力な相棒である tshark(Wiresharkのコマンドライン版です)の、ちょっとカッコよくて実用的な機能についてお話しします。
—
パケットキャプチャは「巨大な郵便局の仕分け作業」
私たちが普段使っているインターネットは、世界中に手紙(パケット)を送り届ける巨大な郵便局のようなものです。Webサイトを見たり、動画を再生したりするとき、数千、数万もの小さな封筒が、目にも留まらぬ速さでネットワークという道路を駆け抜けています。
トラブルが起きたとき、例えば「なんだか最近、特定のWebサイトが開くのが遅いな……」と思ったとき、私たちはどうするでしょうか? 届いたすべての封筒を一つひとつ机に広げて中身を確認していたら、日が暮れてしまいますよね。
そこで登場するのが、tshark です。
tshark は、流れてくる膨大なパケットの中から、「宛先がこの人のやつだけ教えて!」とか、「中身のこの部分だけ抜き出して!」とお願いできる、超優秀な仕分けロボットだと思ってください。
今回は、このロボットに賢く働いてもらうための2つの強力な機能、「ディスプレイフィルター(-Y)」 と 「フィールド抽出(-T fields)」 をマスターしていきましょう。
—
1. 欲しいパケットだけをピンポイントで捕まえるディスプレイフィルター(-Y)
まずは、郵便局の山積みの荷物から、目的の荷物を見つけ出すお話です。
Wiresharkの画面でポチポチとフィルターをかけた経験がある方もいるかもしれませんが、CUI(黒い画面)で動く tshark でも、-Y というオプションを使うことで全く同じ強力なフィルターを適用できます。
例えば、「ネットワーク全体の中から、IPアドレスが 192.168.1.50 の端末がやり取りしている通信だけを覗き見たい!」というときは、以下のようにコマンドを叩きます。
# IPアドレスが 192.168.1.50 の通信だけを画面に表示する
tshark -i eth0 -Y "ip.addr == 192.168.1.50"
ここで使っている "ip.addr == 192.168.1.50" がディスプレイフィルターです。
「難しそう……」と思いましたか? 大丈夫です。これは英語で「IPアドレス(ip.addr)が、この値(== 192.168.1.50)と等しいもの」と言っているだけなんです。
もう少し実務的な例を挙げてみましょう。障害対応の現場では、「エラー応答」を探すことがよくあります。例えば、Webサーバーから「おっと、ページが見つからないよ」という 404 Not Found のエラーが返っているパケットだけを綺麗に炙り出したいときは、こう書きます。
# HTTPのステータスコードが 404(Not Found)のパケットだけに絞り込む
tshark -i eth0 -Y "http.response.code == 404"
まるで、膨大な書類の山から「404」と書かれた付箋のついた書類だけをシュッと抜き出すようで、なんだか気持ちがいいですよね。
—
2. 欲しい情報だけをキレイに摘み出すフィールド抽出(-T fields)
さて、ここからが本番、シニアエンジニアの真骨頂です。
「特定のパケットを見つけることができた。でも、パケット全体を表示されると情報が多すぎて、エクセルや他のツールで集計しにくい……」そんな時に使うのが -T fields という魔法のオプションです。
郵便物に例えるなら、封筒の「宛先」と「消印の日付」だけをハサミでチョキチョキと切り取って、きれいにノートにリストアップしていくような作業です。
実際にコマンドを見てみましょう。
# パケットの「発生時刻」「送信元IP」「宛先IP」だけをタブ区切りで抜き出す
tshark -r capture.pcap -T fields -e frame.time -e ip.src -e ip.dst
なんだか見慣れないアルファベットが出てきましたね。でも、一つひとつ分解すれば怖くありません。
-r capture.pcap: すでに保存しておいたパケットのファイル(キャプチャファイル)を読み込んでね、という意味です。-T fields: 「パケット全体じゃなくて、指定した項目(フィールド)だけを教えて!」というモード切替スイッチです。-e 項目名: 抜き出したい項目(Extraction)を指定するオプションです。いくつでも並べることができます。
このコマンドを実行すると、画面には余計な装飾が一切消え、指定した情報だけが綺麗に並んで出力されます。
実務で役立つ!CSV形式での出力と区切り文字の変更
インフラの運用監視では、この抽出したデータをCSV(カンマ区切り)形式にして、後からPythonなどのスクリプトで解析したり、表計算ソフトにブチ込んだりすることが日常茶飯事です。
そんなときは、-E というオプションを組み合わせて、出力の見た目を自由自在にコントロールできます。
# HTTPの「リクエストURL」と「クライアントのIP」をCSV形式(カンマ区切り)で出力する
tshark -r capture.pcap \
-Y "http.request" \
-T fields \
-e ip.src \
-e http.request.uri \
-E header=1 \
-E separator=, \
-E quote=d
少し長くなりましたが、後ろの -E から始まる部分がポイントです。
-E header=1: 出力の1行目に「項目名(ヘッダー)」を表示してくれます。-E separator=,: 項目と項目の間をカンマ(,)で区切ります(これでCSVの完成です!)。-E quote=d: 文字列データをダブルクォーテーション(")で囲んでくれます。URLの中にカンマが含まれているときにデータが崩れるのを防ぐ、プロの知恵です。
このコマンドを1発叩くだけで、その日その時間にどんなURLにアクセスがあったのかの一覧が、綺麗に整ったCSVデータとして手に入ります。すごく便利だと思いませんか?
—
現場で役立つ、ちょっとした小ワザと心構え
ここまで tshark のディスプレイフィルターとフィールド抽出について見てきましたが、最後に現場で本当に困ったときに思い出してほしいポイントをいくつかシェアしますね。
1. フィールド名が分からないときは?
「このプロトコルの、この部分を抜き出したいんだけど、フィールド名(-e の後ろに書く名前)が分からない!」という時は、WiresharkのGUI版でそのパケットを開いてみてください。画面の下部にある「パケット詳細(Details)」ツリーで該当箇所をクリックすると、左下に http.request.uri のような正式なフィールド名がこっそり表示されます。これをそのまま tshark で使えばOKです。
2. まずは小さいファイルで試そう
データセンターの通信量は膨大です。何ギガバイトもある巨大なキャプチャファイルに対していきなりコマンドを実行すると、パソコンがうなりを上げてフリーズしてしまうことがあります。まずは -c 100(最初の100パケットだけ処理する)などのオプションを組み合わせて、安全に動作テストをするのがベテランの流儀です。
—
まとめ
今回は、tshark の -Y オプションによるディスプレイフィルターと、-T fields による華麗なフィールド抽出の世界をご紹介しました。
はじめは黒い画面と長いコマンドの羅列に圧倒されてしまうかもしれませんが、パケットを「郵便物」に見立てて、「どの手紙を探そうかな?」「宛先と中身のここだけメモしておこう!」という気持ちで向き合えば、ネットワークの動きが手に取るように見えてきます。
トラブルシューティングは、いわばネットワークの世界の「名探偵」です。今回マスターした tshark の技を武器に、ぜひ日々の運用監視やトラブル解決を楽しんでみてくださいね。それでは、また次回のNOCルームでお会いしましょう!
コメント