ネットワーク運用の現場で血と汗を流してきたシニアエンジニアの私から、インフラの世界に飛び込んだばかりのあなたへ、どうしても伝えておきたい技術があります。
サーバーを触っていると、「あれ、なんだか知らないうちに勝手に外と通信している気がする…」「設定したはずのWebサーバーが起動しない。ポートがすでに使われているって怒られた!」なんてトラブルに直面したことはありませんか?
そんなとき、あなたの強力な相棒になってくれるのが、今回紹介する netstat や ss といったネットワーク確認コマンドです。特に、「どのアプリが、どのポートを占有しているのか(プロセス名とPIDの紐付け)」を暴き出す -p オプションの使い方は、インフラエンジニアとして絶対に知っておくべき必須の技なんですよ。
難しい専門用語やパケットの細かい仕組みはいったん脇に置いて、まずは身近な世界に置き換えて優しく紐解いていきましょう!
—
郵便受けと差出人を暴く!ネットワークとプロセスの関係
サーバーが外部と通信する仕組みは、よく「郵便配達」に例えられます。
- IPアドレス = お届け先の住所
- ポート番号 = マンションの部屋番号(例:Webなら80号室、暗号化Webなら443号室など)
そして、その部屋のドアの向こう側で手紙を受け取ったり出したりしている「住人」こそが、OS上で動いているプロセス(アプリケーション)です。
トラブルシューティングの現場では、よくこんな状況に出くわします。
「深夜なのに、見たこともない知らない住人が勝手に部屋の鍵を開けて外と連絡を取り合っているぞ……!?」
こんなとき、「誰がその部屋を使っているんだ?」と突き止めるために使うのが、今回主役の -p オプションです。これを使えば、ポートを使っている犯人(プロセス名やPID:プロセスID)を特定できるというわけですね。
—
まずは古い歴史を知る:netstat -p の世界
長年、Linuxの世界でネットワーク調査の定番といえば netstat コマンドでした。今でも多くの古いシステムや手順書で目にする機会があります。
例えば、「現在、どのプロセスがどのポートで待ち受けて(リスニングして)いるのか」を調べたいときは、以下のようにコマンドを叩きます。
# 全てのTCP/UDPポートのリスニング状態を、プロセス名(-p)付きで数値(-n)で表示する
netstat -tulpn
ここで使っているオプションの意味を、一つずつ優しく分解してみましょう。
-t: TCPの通信を表示してね-u: UDPの通信を表示してね-l: 今まさに接続を待ち受けている(Listening)状態のものに絞ってね-n: IPアドレスやポート番号を名前解決せず、数字のままスピーディーに表示してね-p: 今回の主役! そのポートを開いている「プログラム名」と「PID(プロセスID)」を表示してね
このコマンドを実行すると、ターミナルの画面にはずらりと通信のリストが流れます。その右端に、nginx: master process や apache2、あるいは怪しいスクリプトのPIDなどが表示されるため、「犯人はこいつだな!」と一目で特定できるようになるのです。
—
現代のスタンダード:より速く、より正確な ss -p
さて、先ほど紹介した netstat ですが、実は今のモダンなLinux(UbuntuやCentOSの新しいバージョンなど)の現場では、「もう引退したレジェンドOB」という扱いになりつつあります。
なぜなら、Linuxカーネルの奥深くにある情報構造が変わり、netstat だと巨大なネットワークの海から情報を引き出すのに時間がかかってしまうようになったからです。
そこで私たちが現在、現場で常用しているのが ss というコマンドです。「Socket Statistics」の略で、netstat の後継として生まれた超高速な次世代ツールです。
使い方は netstat とほとんど同じで、拍子抜けするほど簡単です。
# ssコマンドを使って、リスニング中のTCPポートをプロセス情報付きで爆速表示する
ss -tulpn
出力される結果の見やすさとスピードは、netstat を圧倒します。インフラエンジニアとしては、今日からぜひ ss コマンドの方をメインで使っていくことを強くお勧めします!
—
現場で役立つ!実践的なトラブルシューティングのシナリオ
では、実際に私たちがどんな場面でこの -p オプションを使うのか、リアルな現場のシチュエーションを覗いてみましょう。
シナリオ1:「Port already in use(ポートがすでに使われています)」の絶望
Webサーバー(例えばNginx)を起動しようとしたところ、こんなエラーが出て弾かれてしまいました。
> bind() to 0.0.0.0:80 failed (98: Address already in use)
「えっ、誰も動かしてないはずなのに、誰かがすでに80番の部屋を陣取っている…?」
そんなときは、慌てずに ss コマンドの出番です。
# 80番ポートを使っている犯人をプロセス情報つきで特定する
sudo ss -lntp '( sport = :80 )'
*解説:ここで sudo をつけているのがポイントです。自分以外のユーザーが動かしているプロセス名やPIDを覗き見するためには、管理者権限が必要になることが多いからです。*
実行すると、次のような結果がかえってきます。
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 *:80 *:* users:(("apache2",pid=1245,fd=4))
「犯人はお前か!Apacheがこっそり80番ポートを占有していたんだな!」と分かります。
あとは、そのApacheを止めるなり、設定を変えるなりして問題をスマートに解決できますね。
シナリオ2:怪しいバックドアや不正アクセスの検知
セキュリティインシデントの調査でも、この -p オプションは命綱になります。
「なんだかサーバーのCPU使用率が高いぞ。見知らぬ外部のIPアドレスと通信しているプロセスがある…」
そんなときは、現在確立されているすべてのコネクションを覗き見します。
# 現在確立されている全ての通信と、それを司るプロセスを一覧表示する
sudo ss -atnp
もし、見覚えのない不審なプログラム名や、聞いたこともないスクリプトが外の怪しいIPアドレスとつながっていたら……。背筋が凍る瞬間ですが、エンジニアとしての腕の見せ所です。
表示されたPID(例: pid=9999)を頼りに、そのプロセスの正体を突き止め、ネットワークから孤立させるといった初期対応をとることができます。
—
まとめ:一歩ずつ、確実に手を動かそう
今回は、netstat および ss コマンドにおける -p オプションの重要性と、プロセス名・PIDの紐付けによるトラブルシューティング手法について解説しました。
- ポートの裏側にいる「住人(プロセス)」を特定するには
-pオプションが不可欠。 - 権限エラーでプロセス名が出ないときは、
sudoを添えて実行する。 - 古い
netstatよりも、爆速で正確な現代のssコマンドを積極的に使っていく。
ネットワークの世界は、最初は目に見えなくて難しく感じるかもしれません。でも、今回紹介したようなコマンドを一つずつ実際にターミナルで叩いてみることで、まるで霧が晴れるように「サーバーの中で何が起きているのか」が手に取るように分かるようになります。
焦らず、一歩ずつ。あなたの手でパケットの裏側の真実を暴いていきましょう!
コメント