【入門編】 netstatによるリスニングポートとプロセスID(PID)の紐付け – トラブルシューティング&ネットワーク運用監視実践ガイド

「誰がこの扉を開けているの?」netstatで迷宮入りトラブルを解決する技術

ネットワークエンジニアとして夜通し障害対応をしていると、時折こんな怪奇現象に遭遇します。

「Webサーバーが起動しているはずなのに、ブラウザでアクセスしても応答がない」
「特定のポートで待ち受けたいのに、『アドレスが既に使用されています』と怒られる」

こんな時、皆さんはどうしますか? 闇雲にサーバーを再起動する前に、まずは「今、このサーバーのどの扉(ポート)を、誰(プロセス)が握っているのか」を突き止める必要があります。

今日は、そんな時に頼れる相棒 netstat コマンドについて、現場の知見を交えてお話ししましょう。

—

ネットワークの「ポート」を郵便受けに例えてみる

まずはイメージから入りましょう。サーバーを一つの大きな「集合住宅」だと考えてみてください。

  • IPアドレス:その集合住宅の「住所」です。
  • ポート番号:各部屋に設置された「郵便受け」の番号です。

Webサーバー(HTTP)なら80番、SSHなら22番というように、特定のサービスは決まった番号の郵便受けで手紙(通信)を待っています。

ところが、時々困ったことが起きます。「本来、101号室(ポート80)で待っているはずの住人が不在なのに、郵便受けが誰かに占領されていて、新しい住人が入れない」といった状況です。あるいは、「全く身に覚えのないプロセスが勝手に裏口を開けている」なんてことも。

そんな時、netstat というコマンドを使えば、「今、どの番号の郵便受けを、誰が使っているか」を一発で特定できるのです。

—

基本のキ:netstat で現状を確認する

まずは、現在サーバーで何が待ち受け状態(LISTEN)になっているか見てみましょう。

# -t: TCPを表示
# -l: 待ち受け(LISTEN)状態のポートのみ表示
# -n: ホスト名やサービス名を解決せず、数値(IPとポート)で表示(これ重要!)
netstat -tln

-n オプションを付ける理由は、解決処理を省くことでコマンドのレスポンスを速くするためです。現場で障害対応している時に、DNSの逆引きでモタつく時間は命取りですからね。

—

本題:犯人を特定する -p オプションの魔法

先ほどのコマンドでも「何番のポートが開いているか」は分かりますが、一番知りたい「その扉を開けている犯人(プロセス)」までは分かりません。

ここで登場するのが、最強のオプション -p です。

# sudoを忘れずに!プロセスIDを見るには管理者権限が必要です
sudo netstat -tlnp

これを実行すると、右端に PID/Program name という項目が表示されます。例えば、以下のような出力が得られるはずです。

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      1234/nginx: master

これを見ると、「ああ、1234 というIDの nginx というプロセスが、80番ポートをしっかり握りしめているんだな」と一目瞭然ですね。

—

現場で役立つ「あとの祭り」を防ぐテクニック

もし、謎のプロセスがポートを占拠していて、サービスを再起動できないときはどうすればいいでしょうか?

1. PIDを確認する:先ほどの netstat -tlnp でPIDを確認します。
2. プロセスの中身を調べる:ps -ef | grep <PID> で、どんな起動引数で動いているか確認しましょう。
3. 優しく閉じる:いきなり強制終了(kill -9)するのではなく、まずは kill <PID> で安全な終了を促します。

最近の流行:ss コマンドをご存知ですか?

余談ですが、最近のLinuxディストリビューションでは netstat は「古いツール」扱いされ、後継の ss コマンドが推奨されることが多いです。使い方はほぼ同じですが、動作が非常に高速です。

# netstat -tlnp と全く同じことが素早くできます
sudo ss -tlnp

現場のエンジニアとしては、どちらも使えるようになっておくと、急な環境変化にも動じなくなりますよ。

—

まとめ:一歩ずつ、「見える化」していこう

トラブルシューティングの極意は、「推測するな、計測せよ」です。

「たぶんポートが開いてないんだろう」という推測から入るのではなく、まずは netstat -tlnp で現在の扉の状態を冷静に確認する。この小さな一歩が、数時間の復旧作業を数分に短縮してくれるのです。

最初はコマンドの羅列に圧倒されるかもしれませんが、ネットワークも結局は「誰が、どこで、何をしているか」という人間社会のルールと似ています。ぜひ、皆さんのサーバーでも叩いてみて、今動いている「住人たち」の姿を覗いてみてくださいね。

また次の現場でお会いしましょう!

コメント

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