【入門編】 netstatコマンドによるTCPコネクション状態(ESTABLISHED, TIME_WAIT等)の網羅的確認 – トラブルシューティング&ネットワーク運用監視実践ガイド

サーバーが悲鳴を上げている?「netstat」でソケットの行列を読み解く技術

こんにちは!NOCの現場で日々、パケットの海を泳いでいるシニアエンジニアです。

深夜2時、突然飛び込んでくる「Webサイトが重い」「APIがタイムアウトする」というアラート。この時、皆さんはまず何を確認しますか?CPUの負荷率?それともディスクの空き容量でしょうか。

もちろんそれらも重要ですが、サーバーが「ネットワークの渋滞」で身動きが取れなくなっているとき、真っ先に答えを教えてくれるのが今回紹介する netstat コマンドです。

「小難しいアルファベットの羅列ばかりで苦手…」という方も大丈夫。今日はこの netstat を使って、サーバーの中で起きている「コネクションの行列」を可視化する方法を、一緒に紐解いていきましょう。

—

そもそも「コネクションの状態」って何?

サーバーとクライアント(スマホやPC)の通信を、「手紙のやり取り」に例えてみましょう。

1. SYN_SENT / SYN_RECV: 「手紙出しますよ!」「届きました!」と握手をしている状態。
2. ESTABLISHED: 手紙のやり取りが絶賛進行中!最も健康な状態です。
3. TIME_WAIT: 「手紙のやり取りは終わったけど、念のためポストの前で少し待機中」という状態。

この「待機中」のコネクションが多すぎると、新しい手紙を受け取るための空きポストがなくなってしまい、サーバーは通信不能に陥ります。この「ポストの混雑状況」を教えてくれるのが netstat なのです。

—

まずはこれだけ!定番コマンドで全体像を掴む

現場で僕が最初に叩くのはこのコマンドです。

# 全てのTCP接続を、数値(ポート番号など)で表示するコマンド
netstat -ant

それぞれのオプションの意味はこうです。

  • -a: 全てのソケットを表示(Listenして待機中のものも含む)。
  • -n: ホスト名やサービス名を解決せず、IPアドレスとポート番号で表示(これ重要!名前解決でモタつくと調査が遅れます)。
  • -t: TCPの通信だけをフィルタリング。

実行すると、ズラリと行列(コネクション)が表示されますね。ここで注目すべきは、右端の State カラムです。

—

注目すべき「State」の正体

特にトラブル時にチェックすべき状態を、現場の視点で解説します。

1. ESTABLISHED(絶賛営業中)

ここが異常に多い場合、サーバーが処理しきれないほどのリクエストを捌いているか、あるいはコネクションを掴んだまま離さない「ゾンビのようなプロセス」がいる可能性があります。

2. TIME_WAIT(後片付け中)

ここが大量に溜まっているときは要注意です。TCP通信は、終了したあとも「パケットの取りこぼしがないか」を確認するために、数分間その接続を維持します。これが積み重なると、新しい接続を受け付けるための「ポート」が枯渇してしまいます。

3. LISTEN(お客さん待ち)

「80番ポートや443番ポートで、いつでも手紙を受け取れますよ!」と待機している状態です。ここが表示されていないなら、そもそもWebサーバー自体が起動していない可能性大です。

—

調査を加速させる「フィルタリング」の極意

サーバーが大規模になると、netstat の結果は数千行にもなります。そんな時は grep と組み合わせて、必要な情報だけを抜き出しましょう。

# TIME_WAITの状態にある接続数だけをカウントする
netstat -ant | grep TIME_WAIT | wc -l

# 特定のポート(例: 80番)への接続状況だけを確認する
netstat -ant | grep :80

wc -l を使って行数をカウントするのは、現場の定石です。「何個のTIME_WAITがあるか」という数値の変化を見ることで、障害の予兆を察知できるからです。

—

最近のトレンド:ss コマンドへの移行

最近のLinux環境では、netstat の後継として ss (Socket Statistics) コマンドが推奨されています。netstat よりも高速で、カーネルの情報を直接参照するため、接続数が多いサーバーでもサクサク動きます。

# netstat -ant とほぼ同じ結果をより高速に表示
ss -nt

使い方はほとんど同じですので、ぜひ今のうちから ss にも慣れておきましょう。

—

最後に:ネットワークは「生き物」です

ネットワークのトラブルシューティングは、パケットの気持ちになって考えることが一番の近道です。「今、このコネクションはなぜ閉じられないのか?」「どこで立ち往生しているのか?」と想像を巡らせることで、ただのコマンド出力が、サーバーの雄叫びのように聞こえてくるはずです。

最初は難しく感じるかもしれませんが、まずは自分のPCや検証環境で netstat -ant を叩いてみてください。自分のマシンが誰と、どんな状態で繋がっているのかを知る。それが、インフラエンジニアへの第一歩です。

現場からは以上です!また次のトラブルでお会いしましょう(いや、平和な運用が一番ですね)。

コメント

タイトルとURLをコピーしました