こんにちは!NOC(ネットワークオペレーションセンター)で日々、パケットのざわめきを聴きながら障害と格闘しているシニアエンジニアです。
データセンターのフロアでうなるサーバーの冷却音、深夜のインシデントアラート……。ネットワークエンジニアにとって、障害発生時の「今、何が起きているんだ?」という謎を解き明かす瞬間は、まるで難解なミステリー小説のようです。そして、その謎を解くための最強の相棒といえば、そう、tcpdumpですよね。
「tcpdumpの画面を開いたはいいけれど、呪文のような文字が流れてきて目が回る……」
「-Xや-nnといったオプションをとりあえず付けているけど、本当の意味がピンと来ていない……」
そんな悩みを持つインフラ初学者の方も多いのではないでしょうか。大丈夫です。今回は、ベテランエンジニアが現場で体に叩き込んできたtcpdumpの表示制御オプションの本質を、身近な例えを交えながら優しく紐解いていきます。一歩ずつ、確実に理解を深めていきましょう!
—
1. なぜtcpdumpの「見せ方」が重要なのか?
ネットワークを流れるパケットをキャプチャするツールは、いわば「通信の盗聴器」ではなく、「ネットワークのレントゲン撮影機」です。
想像してみてください。病院でレントゲンを撮ったとき、お医者さんが骨のヒビを見つけるためには、鮮明で、余計なノイズがない画像が必要ですよね。tcpdumpのオプションは、まさにその「画質調整ダイヤル」です。
デフォルトのままだと、ツールが親切心から「IPアドレスから名前(ホスト名)を調べよう」「ポート番号からサービス名(httpやsshなど)に変換しよう」と頑張ってくれます。しかし、現場のトラブルシューティングにおいて、この「親切なおせっかい」がかえって仇になることが多々あります。DNSの引き合いでパケットキャプチャの動作自体がもたついたり、正確なポート番号が隠れてしまったりするのです。
そこで登場するのが、パケットの素顔をありのまま、かつスピーディーに暴くための表示制御パラメータたちです。
—
2. おせっかいな変換を断ち切る:-nn オプション
まずは、最も使用頻度が高く、絶対に覚えておくべき -nn オプションから見ていきましょう。
郵便配達の例えで考えてみよう
通信というものは、宛先と差出人の「住所(IPアドレス)」と「部屋番号(ポート番号)」で成り立っています。
例えば、あなたが手紙を書くとき、封筒に「東京都千代田区…」と書きますよね。
普通のtcpdumpは、親切心から「あ、このIPアドレスは webserver01.internal って名前だから、そう表示してあげよう!」と気を利かせます。さらに、ポート番号の 80 を見つけると「あ、これ http ね!」と勝手に文字に置き換えてしまいます。
しかし、現場で「本当にそのIPアドレスと通信しているのか?」「変なポートに飛んでいないか?」をデバッグしたいとき、この勝手な名前解決やサービス名変換は、ノイズでしかありません。
-nn の意味と効果
- 1つ目の
n:IPアドレスをホスト名に逆引きしない(常に数字のままで表示する) - 2つ目の
n:ポート番号をサービス名(httpやsshなど)に変換せず、数字のままで表示する
これらを同時に指定するのが -nn です。
実際のコマンド例
# インターフェース eth0 を流れるパケットを、名前解決なしでキャプチャする
sudo tcpdump -i eth0 -nn
このオプションをつけることで、出力結果が常に「数字(IPとポート)」で統一され、スクリプトでの自動解析や、人間がパッと目視で確認するときのスピードが劇的に向上します。「迷ったらとりあえず -nn」、これは現場の鉄則です。
—
3. 中身を丸裸にする:-X オプション(16進数とASCIIの同時出力)
通信のヘッダー情報(宛先や送信元など)だけを見ても「なぜかアプリケーション層でエラーが起きている」という場合は、パケットが運んでいる「中身(ペイロード)」を覗き見る必要があります。ここで登場するのが -X オプションです。
宅配便のダンボール箱の例え
ネットワークのパケットは、宛先が書かれた「伝票(ヘッダー)」と、中身が入った「ダンボール箱(ペイロート)」に例えられます。
-X オプションは、「ダンボール箱をカッターでザクッと開けて、中に入っている商品(データ)をその場で現物確認する」ようなものです。
-X を指定すると、パケットのデータ部分が「16進数(Hex)」と「ASCII(文字)」の左右ペアで同時に出力されます。
実際の出力イメージ(抜粋)
0x0000: 4500 003c 1c46 4000 4006 b1e6 c0a8 010a E..<@.@.........
0x0010: c0a8 0114 0050 0050 1234 5678 9abc def0 .....P.P.4Vx....
0x0020: 8010 01f5 3b20 0000 0101 080a 1234 5678 ....;........VX
0x0030: 0000 0000 4865 6c6c 6f20 576f 726c 64 ....Hello World
右側のASCII列を見てください。「Hello World」という文字列がくっきりと浮かび上がっていますよね。
アプリケーションが「文字化けしたデータを送っていないか」「パスワードや特定のコマンドが平文で流れていないか」などを確認する際、この -X オプションが決定的な証拠をもたらしてくれます。
—
4. 情報をリッチにする:-v系(-v, -vv, -vvv)オプション
最後は、パケットの「詳細度」を調整する -v(Verbose)系オプションです。
通信の診断をしていると、「もっと細かいヘッダーの情報(例えば、TTLの値や、TCPのウィンドウサイズ、オプションフィールドの中身など)が見たい!」という場面に遭遇します。
顕微鏡の倍率を変える感覚
-v 系は、顕微鏡のダイヤルを回して倍率を上げるようなものです。
-v:少し詳細に(TTLやパケット長などを追加表示)-vv:さらに詳細に(TCPのチェックサムやフラグの詳細など)-vvv:極限まで詳細に(IPオプションや、BGPなどのルーティングプロトコルの中身まで丸裸に)
実際のコマンド例
# TCPフラグやTTLなどの詳細情報をリッチに表示させる
sudo tcpdump -i eth0 -nn -vv
むやみやたらに -vvv を付けると、1つのパケットあたりの情報量が多すぎて画面が流れてしまい、かえって全体像が見えなくなることがあります。「まずは -v で様子を見つつ、必要に応じて引き上げる」というバランス感覚が、プロの技の見せ所です。
—
5. 実務で役立つ!よく使う組み合わせレシピ
ここまで紹介したオプションを組み合わせることで、現場で即戦力となる強力なコマンドが完成します。いくつか実務で本当によく使うレシピをご紹介します。
レシピ1:特定のホストとの通信を、名前解決なしで中身までじっくり追う
# 192.168.1.50 との通信を、ポート名変換なし(-nn)、パケットの中身(-X)、詳細情報(-v)付きでキャプチャ
sudo tcpdump -i eth0 -nn -v -X host 192.168.1.50
レシピ2:Webサーバーへのリクエスト(Port 80)だけをすばやく確認する
# 宛先または送信元のポートが 80 のパケットを、名前解決なしでサクッと確認
sudo tcpdump -i eth0 -nn port 80
—
おわりに:パケットの声に耳を澄ませよう
今回は、tcpdumpの表示制御を司る -nn、-X、-v系の詳細仕様について、実務の現場感覚を交えて解説しました。
最初は呪文のように見えたコマンドも、「名前解決を止めて数字で見る(-nn)」「中身のデータを文字と16進数で暴く(-X)」「顕微鏡の倍率を上げて詳細を見る(-v)」という目的意識を持てば、最高に頼もしい相棒に変わります。
ネットワークは決して嘘をつきません。トラブったときこそ、落ち着いてパケットの「声」に耳を澄ませてみましょう。きっと、問題解決への糸口がそこにあるはずです。
それでは、次回のNOCエンジニアリングブログもお楽しみに!
コメント