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

深夜3時のデータセンター。監視モニターに突如として「TCP Connection Exhaustion(コネクション枯渇)」のアラートが赤々と点滅する。この瞬間、心拍数が跳ね上がらないNOCエンジニアは偽物だ。数万、数百万のクライアントリクエストをさばく超高負荷なエッジプロキシやKubernetesのIngressコントローラーで何かが起きている。

私たちが最初に手に取る武器は何だろうか? 高度なAPM(アプリケーションパフォーマンス監視)ツールか? いや、最終的に真実を語るのは、いつの時代もシェルに叩き込む泥臭いコマンドラインだ。その中でも netstat -an(あるいは現代の ss -nat)は、OSのトランスポート層の脳内を丸裸にする究極のX線写真である。

今回は、この netstat -an が映し出すTCP/UDPソケットのステータスを単なる「死活監視の手段」としてではなく、Linuxカーネルの内部挙動、パケットレベルのステートマシン、そして極限のパフォーマンスチューニングの文脈から徹底的に解剖していこう。

—

1. パケットが織りなすダンス:netstat -an が暴くTCPステートマシンの深層

コンソールに netstat -an を叩いたとき、出力されるズラリとしたリストは、単なるテキストの羅列ではない。それは、世界中から押し寄せるL4(トランスポート層)のパケットたちが、今まさにLinuxカーネルのバッファ上で演じている狂宴の現在地なのだ。

特にインフラエンジニアとして瞬時に脳内パースすべき重要ステータスを振り返っておく。

  • LISTEN: 港の灯台。サーバープロセスがクライアントからの「Synパケット」を待ち構えている状態。
  • ESTABLISHED: 手と手を取り合った黄金郷。3ウェイハンドシェイクが完了し、アプリケーションデータが双方向で激しく往来している状態。
  • TIME_WAIT: 終わった恋の余韻。接続は切断されたが、ネットワークのどこかに迷子の古いパケットが残っている可能性を考慮し、カーネルがポートを一定時間(通常 2 * MSL)ホールドしている状態。

なぜ -an なのか?

-a はすべてのリスニング・非リスニングソケットを表示し、-n は名前解決(DNS逆引きやポート番号からサービス名への変換)を抑制する。

本番障害の現場で逆引きを有効にするのは御法度だ。DNSの応答遅延やタイムアウトによって、「障害調査をしているそのコマンド自体が原因でシステムの負荷を悪化させる」という、笑えないエンジニアの黒歴史を踏むことになるからだ。すべてのIPとポートは、素の数字(Numeric)のままで直視せよ。

—

2. カーネルの急所を突く:TIME_WAITとポート枯渇のメカニズム

数万QPSを超えるWebサーバーやAPIゲートウェイを運用していると、必ず直面するのが TIME_WAIT の激増とそれに伴うエフェメラルポートの枯渇だ。

ここで、TCPの終了シーケンス(4ウェイハンドシェイク)のパケット挙動を思い出してほしい。アクティブクローズ(自ら切断を申し出た側)は、最後の ACK を送信した後、TIME_WAIT 状態に移行する。これはRFC 793で定義された仕様であり、消失したパケットの再送制御や、古い重複パケットが新しい同一4タプル(送信元IP、送信元ポート、宛先IP、宛先ポート)のコネクションを汚染するのを防ぐための防壁だ。

しかし、毎秒5,000件の接続を断続的に繰り返すシステムでは、TIME_WAIT のデフォルト保持時間(通常60秒)の間に、30万ものソケットがカーネルのメモリ空間を占有し、新しいアウトバウンド接続のためのエフェメラルポート(ip_local_port_range)が枯渇する。

現場で即効性のあるカーネルチューニング

この泥沼から脱出するためには、/etc/sysctl.conf に以下のパラメータを刻み込み、カーネルの振る舞いをモダンな実用に最適化する必要がある。

# /etc/sysctl.conf
# -----------------------------------------------------------------
# TIME_WAITソケットの再利用を許可(安全な条件下で既存のTIME_WAITを新規接続に転用)
net.ipv4.tcp_tw_reuse = 1

# ファイアウォール環境やロードバランサ配下で安全性が担保できる場合、
# TCPタイムスタンプを有効にすることで、PAWS (Protection Against Wrapped Sequences) を維持しつつ
# TIME_WAITの弊害を軽減する。
net.ipv4.tcp_timestamps = 1

# エフェメラルポートの範囲を極限まで拡大(デフォルトの数倍に広げる)
net.ipv4.ip_local_port_range = 1024 65535

# TCPのFIN-WAIT-2タイムアウト時間を短縮し、ゾンビコネクションのメモリリークを防ぐ
net.ipv4.tcp_fin_timeout = 15

設定を反映するには、以下のコマンドを実行する。

sudo sysctl -p

このチューニングにより、netstat -an | grep TIME_WAIT | wc -l のカウンターが暴騰していても、システムは平然と新しいパケットを飲み込み続けるようになる。

—

3. セキュリティとアタックサーフェス:LISTENの向こう側に潜む脅威

セキュリティの観点から netstat -an を眺めると、これは強力な「侵入検知・脆弱性監査ツール」に姿を変える。

よくあるインシデントの典型例が、「開発・テスト用にバインドしたつもりのデバッグ用データベースポートや管理画面(例: 3306, 6379, 9090)が、0.0.0.0(すべてのインターフェース)で LISTEN していた」というポカミスだ。

次のようなワンライナーを日常のセキュリティチェックに組み込んでおくと、夜も安心して眠れるようになる。

# ローカルループバック(127.0.0.1)以外でLISTENしている危険な外部公開ポートを炙り出す
netstat -an | grep LISTEN | grep -v "127.0.0.1" | grep -v "::1"

もしここに意図しないプライベートIPやパブリックIPがバインドされた LISTEN ソケットを見つけたら、それはアプリケーションのバインド設定ミス、あるいはすでに踏み台にされたサーバーからのリバースシェル(バックドア)の可能性を疑うべきだ。トランスポート層の可視化は、シグネチャベースのIDSをすり抜けるゼロデイ設定ミスを最も素早く暴く。

—

4. モダンインフラにおける netstat から ss へのパラダイムシフト

ここまで netstat について熱く語ってきたが、シニアエンジニアとして正直な事実を伝えておこう。現代のLinuxディストリビューション(Ubuntu, RHEL 8以降など)において、古き良き netstat コマンドは net-tools パッケージの一部であり、すでにレガシー(非推奨)の扱いとなっている。

内部的には、netstat は /proc/net/tcp などの仮想ファイルをパースして情報を取得している。しかし、数百万のソケットが存在する超高負荷サーバーにおいて、カーネル空間からユーザー空間へのテキストベースのデータコピーは、CPUに多大な負荷をかける。

そこで現代のエンジニアが使うべきなのが、iproute2パッケージに含まれる ss コマンドだ。ss はカーネルの Netlink ソケットを直接叩くため、圧倒的な速度でソケット情報を抽出できる。

実務で役立つ ss の必殺コマンド集

# netstat -an に相当し、かつ圧倒的に高速にすべてのTCP/UDPソケットを表示
ss -an

# 状態が ESTABLISHED のTCPソケットのみを抽出(フィルタリングの美しさを見よ)
ss -t -a state established

# メモリリークの温床となりやすい送受信バッファのキューサイズ(Send-Q / Recv-Q)を強制表示
ss -t -a -i

特に -i オプション(情報表示)を組み合わせると、RTT(Round Trip Time)や輻輳ウィンドウ(Congestion Window: cwnd)、MSS(Maximum Segment Size)といった、L4レイヤーの生々しいパフォーマンス指標が手に取るようにわかる。これこそが、パケットの挙動を愛するプロフェッテショナルが見るべき「真実の景色」である。

—

5. 結びにかえて:パケットの呼吸を感じろ

ネットワークトラブルの現場で右往左往する若手エンジニアによく言う言葉がある。
「パケットは嘘をつかない。そしてカーネルのソケットステータスも嘘をつかない」と。

高レイヤーのフレームワークやクラウドのマネージドサービスがどれほど抽象化を進めようとも、最終的にクライアントとサーバーを結んでいるのは、この薄気味悪いほど緻密に設計されたTCP/UDPのステートマシンにほかならない。

netstat -an(あるいは ss -nat)の出力結果の海に飛び込み、それぞれのステータスが語るパケットの往来を脳内で再生できるようになれば、どんなに複雑怪奇なネットワーク障害も、必ず糸口が見えてくる。

さあ、次のアラートが鳴り響く前に、手元のターミナルでソケットの鼓動を確認してみようではないか。

コメント

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