ネットワークの向こう側で何が起きているのか。目に見えないパケットの足音を聴くことができたら、障害シューティングは劇的に変わります。
数え切れないほどの夜をデータセンターの監視モニターの前で過ごしてきた私にとって、tcpdumpはまるで「聴診器」のような存在です。パケットがルーターを抜け、NIC(ネットワークインターフェースカード)の門を叩く瞬間を捉える。このコマンドを使いこなせるようになると、ネットワークの迷宮で立ち往生することはなくなります。
今回は、パケットキャプチャの基本中の基本である -i オプション(インターフェース指定)と、みんなが一度は迷う「ANYインターフェース」の挙動について、現場の知見を交えながら優しく紐解いていきましょう。
—
1. パケットキャプチャの世界へようこそ:ネットワークは「郵便配達」だ
「パケット」という言葉を聞くと、なんだか難しそうなデータの塊を想像してしまいますよね。でも、難しく考える必要はありません。ネットワークの世界は、私たちの身の回りにある「郵便配達」の仕組みとまったく同じです。
あなたのパソコンから送信されたデータ(手紙)は、宛先が書かれた封筒に入れられ、ケーブルという道路を通って相手の元へ届けられます。この手紙のやり取りを、道路の途中でこっそり覗き見して「今、誰から誰へ、どんな手紙が届いたか」を記録するノートが、tcpdumpというツールです。
そして、その覗き見をする場所(どの道路に張り込むか)を指定するのが、今回主役となる -i オプションになります。
—
2. -i オプションの基本:どこで見張り番をするか
tcpdumpを実行するとき、一番最初に決めるべきなのが「どのインターフェース(通信の出入り口)を監視するか」です。
サーバーには通常、いくつかの通信の窓口があります。
- サーバー自身の内部だけで通信するためのループバック(
lo) - 外部の世界とつながる物理的なLANポート(
eth0やens19f0など)
例えば、外部からのWebアクセスを監視したいのに、間違えて内部用の窓口を見張っていたら、当然パケットは1つも見つかりません。「あれ、通信しているはずなのに何も流れてこないぞ…?」という初学者がハマる罠の9割は、この監視場所のミスマッチが原因です。
まずは、自分のサーバーにどんな窓口があるのかを確認してみましょう。
# サーバーに存在するネットワークインターフェースの一覧を表示する
ip a
このコマンドを実行すると、eth0 や ens33 といった名前が見つかるはずです。それでは、実際に特定のインターフェースを指定してパケットを覗き見してみましょう。
# eth0インターフェースを通過するパケットをリアルタイムでキャプチャする
sudo tcpdump -i eth0
-i eth0 と指定することで、「eth0という名前の門をくぐるパケットだけをすべて記録してくれ!」と tcpdump に指示しているわけですね。
—
3. 「ANY」という甘い誘惑:すべての門を見張る -i any の正体
すべてのインターフェースを指定できたら楽なのに、と思ったことはありませんか?
実は、tcpdump には -i any という、すべての通信の窓口をまとめて監視できる強力なオプションが用意されています。
「どの窓口を通るか分からないから、とりあえず全部 any で監視しておけば安心だよね!」
そう思ってこのオプションを使いがちですが、ここに現場のエンジニアが教える「ちょっとした罠」があります。any を使ったときの挙動を、郵便局の例えで考えてみましょう。
通常のインターフェース指定(-i eth0 など)は、「特定の交差点に立って、そこを通る車を監視する」状態です。
しかし、-i any は「街中のすべての交差点に分身を置いて、行き交うすべての車を1冊のノートに時系列でメモする」ようなものです。
ここで注意しなければならないのは、「行き」と「帰り」のパケットの数え方です。
# すべてのインターフェースを対象にパケットをキャプチャする
sudo tcpdump -i any
-i any を使うと、サーバーに出入りするすべてのパケットを網羅できるため、全体像をざっくり把握したいときには非常に便利です。しかし、複数あるNICのどちらからパケットが入り、どちらから出ていったのかという「方向性」が曖昧になりがちです。
複雑なルーティングを設定しているサーバーや、VPNトンネルが絡むトラブルシューティングの現場では、この「方向性の見失い」が原因で、原因究明が遅れてしまうことがよくあります。
—
4. 現場で役立つ!実用的な tcpdump のレシピ集
ただダラダラと流れるパケットを眺めているだけでは、目が疲れてしまいますよね。実務では、必要な情報だけをスマートに絞り込んでキャプチャするのがプロの技です。
ここでは、今日からすぐに使える実用的なコマンドをいくつかご紹介します。
レシピ1:特定のIPアドレス通信だけを抜き出す
特定のサーバー(例えば 192.168.1.50)との通信だけに絞りたいときは、IPアドレスを指定します。
# eth0において、特定のIPアドレス(192.168.1.50)が絡むパケットだけを表示する
sudo tcpdump -i eth0 host 192.168.1.50
レシピ2:特定のポート番号(Web通信など)に絞る
HTTP(ポート80)やHTTPS(ポート443)など、特定のサービス通信だけを覗き見したいときはポートを指定します。
# ポート443(HTTPS)の通信だけをキャプチャする
sudo tcpdump -i eth0 port 443
レシピ3:ファイルに保存してあとからじっくり解析する
流れるパケットを画面で見ているだけだと、流れていってしまいます。あとからWiresharkなどのGUIツールでじっくり解析したいときは、ファイルとして保存(pcap形式)するのが定石です。
# パケットをファイル(capture.pcap)に保存する(画面には表示しない)
sudo tcpdump -i eth0 -w capture.pcap
—
5. おわりに:パケットは嘘をつかない
ネットワークの障害対応において、ログファイルは時に嘘をついたり、肝心なエラーが出力されていなかったりします。しかし、ネットワークのワイヤー上を実際に流れているパケットは、決して嘘をつきません。
「今、本当にパケットが届いているのか?」
「どこでパケットが途切れているのか?」
その答えを知りたいときは、落ち着いて tcpdump の -i オプションで正しい窓口に立ち、パケットたちの声に耳を傾けてみてください。最初は暗号のように見えたパケットの羅列が、きっとあなたに正確な真実を語りかけてくれるはずです。
一歩ずつ、確実にパケットの読み方をマスターしていきましょう。あなたのインフラライフが、より快適なものになりますように!
コメント