【入門編】 netstatコマンドのレガシー仕様とプロセス間通信(UNIXドメイン)の確認 – トラブルシューティング&ネットワーク運用監視実践ガイド

こんにちは!大規模データセンターのネットワーク運用監視(NOC)の現場を長年駆け抜けてきたシニアエンジニアです。数え切れないほどの夜間障害や、冷房が唸るサーバー室での死闘をくぐり抜けてきました。

インフラの世界に飛び込んだばかりの頃って、黒い画面(CUI)に流れる文字を見るだけで「何かとんでもないミスをしてシステムを壊してしまうんじゃないか……」と、冷や汗が出てしまいますよね。

でも、安心してください。どんなに巨大で複雑に見えるネットワークやサーバーも、基本の原理は私たちの身の回りの仕組みと何ら変わりません。今回は、サーバーの中身を覗き見するための強力な相棒である netstat コマンド、そして少しマニアックだけど実務では超重要な「UNIXドメインソケット」について、一歩ずつ優しく紐解いていきましょう!

—

サーバーの中の「手紙のやり取り」を覗いてみよう

突然ですが、みなさんは遠く離れた友人に手紙を送るとき、どうしますか?
手紙を書いて封筒に入れ、宛先(住所と名前)を書き、ポストに投函しますよね。郵便配達員さんがそれを回収し、相手の家のポストまで届けてくれます。

サーバーの世界もこれとまったく同じです。
例えば、Webブラウザでホームページを見る時、あなたのパソコン(クライアント)はWebサーバーに対して「このページを見せてください!」という手紙(パケット)を送っています。

ここで疑問が湧きます。
「今、私のサーバーの中では、誰と誰が手紙のやり取りをしているんだろう?」
それを一目で教えてくれるのが、今回主役として取り上げる netstat というコマンドなんです。

netstat コマンドってどんなもの?

netstat(ネットワーク・ステータス)は、その名の通り「現在ネットワークがどういう状態になっているか」を表示してくれる、歴史ある診断ツールです。

実はこの netstat、インフラの世界ではちょっとした「レガシー(年季の入った)おじいちゃん」のような存在です。最近のLinuxサーバーでは、より新しくて高機能な ss というコマンドに主役の座を譲りつつあります。
しかし、世界中の膨大な数のレガシーシステムや、古くからある運用手順書の中では、今でも netstat が現役バリバリで活躍しています。だからこそ、その仕様を知っておくことは現場のエンジニアにとって大きな武器になるんです。

なぜレガシーと言われるの?(/proc/net の秘密)

古い netstat コマンドがどこから情報を集めてきているかご存知ですか?
それは、Linuxのカーネル内にある /proc/net/ という仮想的なディレクトリです。ここには、現在カーネルが把握しているTCPやUDPの通信状態がテキストファイルとしてズラリと書き込まれています。

netstat は、このファイルを毎秒のように覗き見して、人間が読みやすい形に整えて画面に表示してくれているんです。
しかし、現代の巨大なデータセンターのように、数万・数十万という猛烈な数の通信(コネクション)が同時に発生する環境では、このテキストファイルを毎回読み込む方式だと、サーバーの頭脳(CPU)に大きな負担がかかってしまいます。

そこで登場したのが、カーネルのメモリ空間から直接スマートに情報を引っ張り出す現代っ子の ss コマンドというわけですね。

—

TCP/UDPだけじゃない!「UNIXドメインソケット」の正体

さて、ここからが今回の本題です。
netstat を使うと、ネットワーク上の通信だけでなく、見慣れない種類の通信が表示されることに気付きます。それが UNIXドメインソケット です。

「TCPとかUDPは聞いたことあるけど、UNIXドメインソケットって何?」
そう思いますよね。これも身近な例で考えてみましょう。

  • TCP / UDPの通信:

インターネットという「公道」をバイクやトラックが走って、離れたビル(別のサーバーやプロセス)に荷物を届けるイメージです。

  • UNIXドメインソケットの通信:

同じビル(1台のサーバー)の中にある、隣の部屋の同僚に「内線電話」をかけたり、同じフロアで直接書類を手渡ししたりするイメージです。

つまり、UNIXドメインソケットとは、「同じサーバーの中で動いているプログラム同士が、ネットワークの仕組み(TCP/IP)を使わずに、OSの内部だけで高速に会話するための専用通路」 のことです。

例えば、Webサーバー(Nginxなど)とデータベース(MySQLやPHP-FPMなど)が同じ1台のサーバー上で同居しているとき、わざわざネットワークカードを経由して通信するのはガソリンの無駄ですよね。そんな時、このUNIXドメインソケットが使われます。

—

実際にコマンドを叩いて確認してみよう!

百聞は一見にしかず。実際に手元のLinux環境で netstat を動かしてみましょう。
実務で一番よく使う、TCP、UDP、そしてUNIXドメインソケットをまとめてリスト表示するコマンドはこれです。

# 全てのソケット(TCP, UDP, UNIXドメイン)を、名前解決せずに数値で一覧表示する
$ netstat -a -n -p

ここで使っているオプション(スイッチ)の意味を優しく分解してみましょう。

  • -a (all): 接続待ち(LISTEN)の状態のものも含めて、すべての通信を表示してね。
  • -n (numeric): IPアドレスやポート番号を、無理に「google.com」のような名前に変換せず、素の数字(192.168.1.10:80 など)のままで高速に表示してね(名前解決でモタつくのを防ぐプロの技です!)。
  • -p (programs): 「今、その通信はどのプログラム(プロセス)が使っているの?」という犯人(PIDとプログラム名)を表示してね。

実行結果の読み解き方

このコマンドを実行すると、以下のような画面がターミナルに広がります。

Active Internet connections (servers and established)
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  
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      2345/mysqld         

Active UNIX domain sockets (servers and established)
Proto RefCnt Flags       Type       State         I-Node   PID/Program name    Path
unix_g 2      [ ]         DGRAM      CONNECTED     14221    456/systemd         /run/systemd/notify
unix   2      [ ]         STREAM     CONNECTED     18392    1234/nginx: worker  /var/run/php/php-fpm.sock

前半の Active Internet connections がおなじみのTCP/UDPの世界です。
そして後半の Active UNIX domain sockets に注目してください!
Path という欄に /var/run/php/php-fpm.sock のようなファイルパスが表示されていますよね。

そう、UNIXドメインソケットの正体は、ファイルシステム上に存在する「ソケットファイル」という特殊なファイルなんです。プログラム同士はこのファイルを介して、まるで普通のファイルを読み書きするかのように高速なデータ交換を行っています。

—

現場で役立つ!トラブルシューティングの極意

NOCの現場で障害対応をしていると、「Webサイトが突然真っ白になった(502 Bad Gatewayエラー)」というトラブルに頻繁に遭遇します。

そんな時、私たちシニアエンジニアが真っ先に疑うポイントの一つが、「WebサーバーとPHP(あるいはDB)の間のUNIXドメインソケットが途切れていないか」です。

もし、設定ミスやリソース枯渇でPHP-FPMが落ちていたりすると、いくらWebサーバーが「手紙を渡そう!」とソケットファイルを叩いても、宛先が留守のため通信エラーになってしまいます。

そんな時は、慌てずに以下のように grep コマンドを組み合わせて、お目当てのソケットやポートがちゃんと「待ち受け(LISTEN)状態」にあるかを確認します。

# NginxやPHP-FPMなどの特定のキーワードで稼働状況を絞り込む
$ netstat -anp | grep -E "nginx|php"

もしここで期待通りのプロセスが LISTEN(お仕事スタンバイ中)になっていなければ、プロセスが死んでいるか、設定ファイルのパスが間違っている証拠です。原因が一発で特定できますよね。

—

まとめ:レガシーを知ることは、現代を知ること

今回は、少しレガシーな netstat コマンドの仕様と、サーバー内部の裏方である「UNIXドメインソケット」について解説しました。

  • netstat は /proc/net から情報を集める歴史あるコマンド。
  • 通信にはネットワークを跨ぐものだけでなく、サーバー内完結の「UNIXドメインソケット」がある。
  • UNIXドメインソケットの実体はファイルであり、同じサーバー内のプロセス間通信を高速に行うために使われている。

新しいツール(ss や ip コマンドなど)を使いこなすことも大切ですが、その下で長年支え続けてきたレガシーな仕組みのバックグラウンドを知ることで、トラブルに直面したときの「勘所」が劇的に磨かれます。

インフラの世界は、一歩ずつ構造を紐解いていけば決して怖くありません。
これからも一緒に、楽しく泥臭く、ネットワークの深淵を覗いていきましょう!それでは、次の現場でお会いしましょう!

コメント

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