【実務・中級編】 netstatコマンドによるTCP/UDPソケットの状態一覧表示 – トラブルシューティング&ネットワーク運用監視実践ガイド

「繋がらない」を「見える」に変える。netstatが語るソケットの真実

深夜のデータセンター、冷房の唸る音の中で、画面に流れるログを眺めながらふと思う。「システムは嘘をつかない」。だが、その「真実」を教えてくれるのは、往々にしてOSが吐き出す無機質なステータス情報だ。

Web APIのレスポンスが遅い、あるいは「Connection Refused」が頻発する。そんなとき、多くのエンジニアはとりあえず curl や ping を打つ。しかし、真のプロフェッショナルは、その先にある「ソケットの状態」を見るために、迷わず netstat(あるいはその後継である ss)を叩く。

今日は、教科書には載っていない「現場の視点」で、TCP/UDPソケットの深淵を覗く方法を解説しよう。

—

1. なぜ「netstat」を知らなければならないのか

APIが期待通りに応答しないとき、問題は往々にしてアプリケーションのコードの外側——つまりTCPスタックの「渋滞」にある。

  • リスニングポートの確認: そもそもプロセスは起動しているのか?
  • SYN_RECVの嵐: SYNフラッド攻撃を受けていないか?あるいは、接続要求が捌ききれなくなっていないか?
  • TIME_WAITの蓄積: 短いコネクションを高速に繰り返す設計により、ポートが枯渇していないか?

これらを確認する術を持たないことは、暗闇で目隠しをしてトラブルシューティングをするに等しい。

2. 現場で叩くべき「鉄板コマンド」

最近のLinuxディストリビューションでは ss コマンドが推奨されているが、往年の netstat もまだ現役だ。まずは、現場で最もよく使うコマンド構成を叩き込んでおこう。

# 現場の常識:全リスニング中のTCP/UDPポートをプロセス名と共に表示する
# -t: TCP, -u: UDP, -l: Listening, -n: 数字表示(DNS逆引き禁止), -p: プロセス名表示
sudo netstat -tulpn

# ssを使うならこちら(最近の主流)
# -t: TCP, -l: Listen, -n: 数字表示, -p: プロセス
sudo ss -tlnp

なぜ -n が重要なのか?

初心者は -n を付けたがらないが、現場では厳禁だ。DNS解決がタイムアウトしてコマンドの応答が数秒間フリーズするのを防ぐためだ。障害発生時の数秒は、命取りになる。

—

3. TCPの状態遷移を読み解く:TIME_WAITの正体

APIエンジニアが最も警戒すべきは、TIME_WAIT 状態のソケットだ。クライアントが頻繁に接続と切断を繰り返すと、サーバー側には終了したはずの接続の「残骸」が残り続ける。

# TIME_WAIT状態のコネクション数を数える
netstat -an | grep TIME_WAIT | wc -l

もしこの数字が数千を超えているなら、ロードバランサーとバックエンド間の通信設定を見直す必要がある。Keep-Alive が有効になっていない、あるいはコネクションの再利用(Connection Pooling)ができていない証拠だ。

Pythonによるリクエストの最適化例

requests ライブラリを使っているなら、セッションを使い回すことが「TIME_WAITによるポート枯渇」を防ぐ唯一の解となる。

import requests

# セッションを維持することで、TCPコネクションを使い回す
session = requests.Session()

# 接続を確立し、ヘッダーでKeep-Aliveを明示する
headers = {'Connection': 'keep-alive'}

response = session.get('https://api.example.com/data', headers=headers)
print(response.status_code)

—

4. 異常検知のためのチェックリスト

障害対応の現場では、以下の3ステップでソケット情報を整理する。

1. Listenを確認: Local Address は 0.0.0.0 になっているか?(特定IPにバインドして外部から繋がらないミスは意外と多い)
2. Send-Q / Recv-Qを確認:

  • Recv-Q が積み上がっていれば、アプリが処理しきれていない(ボトルネック)。
  • Send-Q が積み上がっていれば、ネットワーク帯域が飽和しているか、対向側の処理が遅延している。

3. Stateの偏り: ESTABLISHED が異常に多い場合、コネクションのクローズ処理が適切に行われていない可能性がある。

—

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

コマンドの出力結果は、その瞬間のシステムの「心電図」だ。最初はただの羅列に見えるかもしれない。しかし、何度も見ているうちに、ESTABLISHED が並ぶリズムや、SYN_SENT が消えない時の違和感に気づくようになる。

トラブルシューティングにおいて、最も信頼できるツールは、あなたの目の前にあるCLIコンソールと、その背後にあるネットワークの挙動への理解だ。

さあ、恐れずに netstat を叩いてほしい。あなたのシステムが何を叫んでいるのか、その声を聞き取る準備はできているはずだ。

コメント

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