こんにちは!データセンターの最前線で、数々のネットワークトラブルと夜な夜な格闘してきたNOCエンジニアの私です。
ネットワークの世界に飛び込んだばかりの頃は、「パケット解析」とか「Wireshark」なんて聞くだけで、なんだか難しそうな黒い画面や複雑なグラフを想像して身構えてしまいますよね。でも、安心してください。今日お話しする tshark は、GUI(画面)のないサーバーの中でもサクッと動いて、まるでベテラン探偵のようにネットワークの「今」を暴いてくれる、最高に頼れる相棒です。
今回は、この tshark を使って、コマンドラインからパケットの統計情報を手に入れ、さらに自動化スクリプトに組み込んで日々の運用を楽にする方法を、身近な例えを交えながら優しく紐解いていきたいと思います。一歩ずつ、リラックスして進んでいきましょう!
—
パケット解析って、結局なにをしているの?
まず、「パケット」という言葉のイメージから始めましょう。
ネットワーク上でやり取りされるデータは、そのままドカンと一気に送られるわけではありません。大きな手紙を一度に送るのではなく、何千、何万もの「封筒」に小さくちぎって詰め込み、宛先を書いて一斉にポストに投函するイメージです。この「通信の封筒」の1通1通を、私たちはパケットと呼んでいます。
例えば、あなたがWebサイトを見るとき、あなたのパソコンとWebサーバーの間で、何万通もの封筒が猛烈なスピードで行き交っています。
- 「このページを見せてください!」(リクエストの封筒)
- 「はい、これがその画像データです!」(レスポンスの封筒)
トラブルが起きたとき、例えば「なんだか最近、Webサイトの表示がやけに遅いな……」と感じたとします。そんなとき、私たちはポストの前に陣取って、流れてくる封筒の宛先や、中にどんな手紙が入っているのかを一枚一枚調べる必要があります。これが「パケット解析」の正体です。
普段よく使われる「Wireshark(ワイアークラウド)」は、この調査を綺麗なグラフィカル画面でやってくれる便利なツールですが、サーバー室の片隅にある画面のないLinuxサーバー(CUI環境)では使えません。そこで登場するのが、画面がなくてもコマンドだけでWiresharkと同じ強力な分析ができる tshark なんです。
—
リアルタイム統計の魔法:tshark で通信の「健康診断」をする
GUIのないサーバーで tshark を叩く最大のメリットは、その圧倒的な「軽さ」と「統計機能」にあります。全パケットを画面にダラダラと垂れ流すのではなく、通信全体の「健康診断の結果(統計情報)」を瞬時にまとめて出してくれるのです。
ここでは、現場のエンジニアがよく使う、知っておいて損はない魔法のオプション -z の世界を覗いてみましょう。
1. 通話相関図を作る:-z io,phs(Protocol Hierarchy Statistics)
まず最初は、-z io,phs というオプションです。これは「プロトコル階層統計」と呼ばれていますが、難しく考えなくて大丈夫です。
郵便配達に例えるなら、「我が街の郵便局に届いた荷物のうち、何%がAmazonの段ボールで、何%が生協の箱で、何%が普通の封筒なのか」を綺麗に分類して円グラフ(のようなテキスト)にしてくれる機能です。
実際にサーバーで以下のコマンドを叩いてみましょう(実行には管理者権限が必要な場合が多いので sudo をつけています)。
# ネットワークインターフェース eth0 の通信を30秒間観察し、プロトコル別の内訳を集計する
sudo tshark -i eth0 -z io,phs -a duration:30
コマンドの主な意味を整理しておきますね。
-i eth0: 監視するネットワークの「窓口(インターフェース)」を指定しています。-z io,phs: パケットの内訳(どの通信規格がどれくらい使われているか)を集計して!という命令です。-a duration:30: 「30秒経ったら自動で終了してね」というタイマー設定です。
画面には、Ethernetの中にIPがあって、IPの中にTCPがあって、その中にHTTPやTLSがどれくらいの割合で含まれているのかが、綺麗なツリー構造で表示されます。「あれ、想定していない変な通信が全体の8割を占めているぞ?」といった異常に、一発で気づくことができるのです。
2. トラフィックの波形を見る:-z io,stat
もう一つ強力なのが -z io,stat です。これは、時間の経過とともに通信量がどう増減しているかを、秒単位(またはミリ秒単位)で追跡する機能です。
道路の交通量調査をイメージしてください。「朝の8時は混むけど、10時は空いている」というのが一目でわかるように、ネットワークの「渋滞の波」を可視化してくれます。
# 1秒おきに、HTTP通信(ポート80)のパケット数とデータ量の推移を集計する
sudo tshark -i eth0 -q -z io,stat,1,"COUNT(tcp.port==80) tcp.port==80","SUM(frame.len) tcp.port==80"
ここで使っている -q オプションは、「個別のパケットの中身を画面に表示せず、静かに集計だけに集中して!」というサイレントモードの指定です。これのおかげで、コンソール画面が流れる文字で埋め尽くされるのを防げます。
—
夜間も安心!Pythonスクリプトで tshark を自動化する
ここまでの内容で、tshark がいかに強力な統計ツールであるかが伝わったかと思います。しかし、障害というものは、決まってエンジニアがぐっすり眠っている深夜にやってきます。
「夜中に瞬間的にネットワークが重くなる現象が起きているらしいけれど、ずっと画面を睨んでいるわけにはいかない……」
そんなときは、tshark をPythonなどの自動化スクリプトに組み込んでしまいましょう!定期的に裏でパケットの統計を取らせて、もし異常なトラフィックを検知したらSlackやメールに通知を飛ばす仕組みを作っておくと、劇的に運用が楽になります。
以下に、実務でそのまま使えるシンプルなPythonスクリプトのサンプルを用意しました。
import subprocess
import sys
import time
# 監視対象のネットワークインターフェース
INTERFACE = "eth0"
# 1回あたりの計測秒数
INTERVAL_SEC = 10
def run_tshark_stat():
"""
tsharkを実行し、指定したインターフェースのパケット統計を取得する関数
"""
# 実行するtsharkコマンドの組み立て
# -i: インターフェース指定
# -q: サイレントモード
# -a duration: 測定秒数
# -z io,phs: プロトコル階層統計の取得
cmd = [
"sudo", "tshark",
"-i", INTERFACE,
"-q",
"-a", f"duration:{INTERVAL_SEC}",
"-z", "io,phs"
]
print(f"[{time.strftime('%Y-%m-%d %H:%M:%S' )}] パケット統計の収集中です...")
try:
# subprocessを使ってコマンドを実行し、標準出力を取得する
result = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, check=True)
return result.stdout
except subprocess.CalledProcessError as e:
print(f"エラーが発生しました: {e.stderr}", file=sys.stderr)
return None
if __name__ == "__main__":
print("=== ネットワーク自動監視スクリプトを起動します ===")
# 実際の運用では while ループなどで常駐させ、
# 取得した統計結果(stdout)の中に特定のエラーや異常な数値がないかパース(解析)します。
stat_output = run_tshark_stat()
if stat_output:
print("\n--- 取得した統計レポート ---")
print(stat_output)
# ここに「もし異常値があればSlackに飛ばす」といった処理を繋げられます!
このスクリプトをベースにして、「特定の通信量がしきい値を超えたらログに記録する」「夜間だけ cron で定期実行する」といったカスタマイズを加えることで、あなただけの強力な監視ロボットが完成します。
—
まとめ:コマンドラインの相棒と仲良くなろう
今回は、tshark を使ったリアルタイムなパケット統計の取得方法と、自動化スクリプトへの組み込み手法について解説しました。
最初は黒い画面のコマンドに圧倒されるかもしれませんが、tshark はネットワークという目に見えない世界の「健康状態」をクリアに見せてくれる、最高に誠実なツールです。郵便配達の例えを思い出しながら、まずは手元の環境で -z io,phs などのコマンドを気軽に入力してみてください。
「お、今日のネットワークはいつもより元気がいいぞ」なんて、パケットの鼓動が感じられるようになれば、あなたも立派なNOCエンジニアの仲間入りです!
それでは、また次回の技術でお会いしましょう。快適なネットワークライフを!
コメント