「誰がこの扉を開けているの?」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 で現在の扉の状態を冷静に確認する。この小さな一歩が、数時間の復旧作業を数分に短縮してくれるのです。
最初はコマンドの羅列に圧倒されるかもしれませんが、ネットワークも結局は「誰が、どこで、何をしているか」という人間社会のルールと似ています。ぜひ、皆さんのサーバーでも叩いてみて、今動いている「住人たち」の姿を覗いてみてくださいね。
また次の現場でお会いしましょう!
コメント