はい、承知いたしました。データセンターの現場で数え切れないほどの障害と格闘し、その知見を数々の技術メディアで共有してきたNOCシニアエンジニアの経験を活かし、netstatコマンドを優しく紐解くブログ記事を執筆します。初学者の方がネットワークの奥深さを楽しみながら学べるよう、親しみやすく、そして実践的な内容になるよう心がけます。
—
ネットワークの「今」が見える!netstatコマンドでTCP/UDPソケット状態を丸裸にしよう
皆さん、こんにちは!データセンターの心臓部で、日々パケットたちの奔走を見守っているNOCエンジニアです。突然ですが、皆さんはネットワークで「何かおかしいぞ?」と感じた時、まず何をしますか?pingで疎通確認?tracerouteで経路を追う?それももちろん大切ですが、今日はちょっと違う角度から、ネットワークの「今」をリアルタイムで覗き見できる魔法のコマンド、netstatについてじっくりお話ししたいと思います。
特に、サーバー間の通信で主役となるTCPやUDPの「ソケット」というものが、今どんな状態なのか、そしてそれをnetstatコマンドでどうやって見るのか、を一緒に見ていきましょう。最初はちょっと難しく感じるかもしれませんが、大丈夫!身近な例え話を交えながら、一歩ずつ理解を深めていきましょうね。
そもそも「ソケット」って何?
「ソケット」と聞くと、ちょっと専門的で敷居が高く感じるかもしれません。でも、実は私たちの身近なところに、これと似たような考え方があるんですよ。
例えば、郵便局を想像してみてください。
- 郵便局(サーバー): 郵便物を送ったり受け取ったりする場所ですね。
- 住所(IPアドレス): どこに送るか、どこから来たかを特定するための情報です。
- 窓口(ポート番号): 郵便局には色々な窓口がありますよね?例えば、手紙を出す窓口、小包を受け取る窓口、国際郵便の窓口…といった具合です。サーバーにも、Webサイトを見せたり、メールを送受信したり、ファイル転送したりと、それぞれ担当の「窓口」があるんです。この窓口の番号がポート番号です。
そして、この「郵便局」と「住所」と「窓口」の組み合わせ、つまり「この郵便局のこの窓口から、あの住所へ、この郵便物を送る(または受け取る)ための準備」ができている状態、これが「ソケット」なんです。
ネットワーク通信では、この「ソケット」が「通信路」の役割を果たしています。プログラムは、このソケットを使って、他のサーバーやコンピューターとデータをやり取りするんですね。
netstatコマンドでソケットの状態を覗いてみよう!
さて、そんなソケットたちが今どんな状態なのかを教えてくれるのが、netstatコマンドです。特に、TCPやUDPのソケットの状態を一覧表示するのに便利なオプションがあります。
まず、一番よく使うであろうコマンドはこちら!
# TCPおよびUDPのリスニング状態と確立された接続を表示します
netstat -tulnp
このコマンドを実行すると、ズラッと何やら文字が出てきますよね。これが、今サーバー上で動いているソケットたちの「名簿」なんです。この名簿の各項目(カラム)を、一つずつ見ていきましょう。
netstatコマンドの各カラムを徹底解剖!
netstat -tulnpコマンドの出力は、以下のようなカラムで構成されています。
1. Proto (Protocol)
これは、そのソケットがどの通信プロトコルを使っているかを示しています。
tcp: TCP (Transmission Control Protocol)。信頼性の高い通信に使われます。手紙を出すときに「届きましたか?」と確認したり、もし届かなかったら「もう一度送ってください」とお願いしたりするような、丁寧なやり取りをするイメージです。Webサイトの閲覧や、ファイルのダウンロードなど、データが正確に届くことが重要な場面で使われます。udp: UDP (User Datagram Protocol)。TCPよりもシンプルで高速な通信に使われます。郵便配達員さんが、とりあえず荷物をポストに投函してくれるようなイメージです。届くかどうか、順番通りかはあまり気にしません。動画のストリーミングや、オンラインゲーム、DNS(名前解決)など、多少のデータロスがあってもリアルタイム性を優先したい場面で使われます。
2. Recv-Q (Receive Queue)
これは、受け取り側で「まだ処理できていないデータ」の量を示しています。
- 0: これは良い状態です!受け取ったデータは、もうすぐに処理できるよ、ということです。
- 数値が大きい: もしここに大きな数字が表示されている場合、それは「サーバーが忙しすぎて、受け取ったデータを捌ききれていない」サインかもしれません。まるで、郵便局の窓口に、処理しきれないほどの郵便物が山積みになっている状態ですね。この場合、サーバーの負荷が高すぎたり、ネットワークの帯域が不足していたりする可能性があります。
3. Send-Q (Send Queue)
これは、送信側で「まだ相手に届いていないデータ」の量を示しています。
- 0: こちらも良い状態です。送ろうとしたデータは、もう相手に届いているか、届いている最中です。
- 数値が大きい: ここに大きな数字が表示されている場合、「送りたいデータがたくさんあるのに、相手がなかなか受け取ってくれない」状態、あるいは「ネットワークが混雑していて、なかなか送れない」状態と考えられます。郵便局から発送された荷物が、宛先の郵便局で滞留しているようなイメージです。
4. Local Address (ローカルアドレス)
これは、自分のサーバー(ローカル)のIPアドレスとポート番号を示しています。
IPアドレス:ポート番号の形式で表示されます。- 例えば、
0.0.0.0:80と表示されている場合、これは「全てのネットワークインターフェース(どのIPアドレスからでも)で、ポート番号80(Webサーバーがよく使うポート)で、接続を待っていますよ」という意味になります。 127.0.0.1:xxxxのように127.0.0.1が表示されている場合は、これはローカルホスト、つまり自分自身のコンピューターとの通信だけを指しています。
5. Foreign Address (外部アドレス)
これは、相手(リモート)のIPアドレスとポート番号を示しています。
IPアドレス:ポート番号の形式で表示されます。- もし「\*:\*」と表示されている場合、これはまだ相手が決まっていない、つまり接続を待っている状態(リスニング状態)であることを示しています。
- 確立された接続であれば、ここに相手のIPアドレスとポート番号が表示されます。例えば、
192.168.1.100:12345のように表示されていれば、「192.168.1.100 というIPアドレスのコンピューターの、12345番ポートから接続がありますよ」という意味になります。
6. State (状態)
これが、ソケットの現在の通信状態を示す最も重要なカラムです!TCP接続では、通信が確立するまでにいくつかの段階を経ます。その状態を表しています。UDPはコネクションレスなので、このStateカラムは表示されないか、あるいは「UNCONN」(Unconnected)と表示されることが多いです。
LISTEN: これは、サーバーが「誰かから接続を待っていますよ!」という状態です。郵便局で言えば、「開局準備中!」とか「いつでもどうぞ!」という状態ですね。この状態のソケットは、まだ実際の通信はしていません。SYN_SENT: クライアント(接続を求めたい側)が、サーバーに「接続してもいいですか?」という最初の信号(SYNパケット)を送った後、サーバーからの応答を待っている状態です。郵便局に手紙を出し、相手からの「受け取りました」という返事を待っているようなイメージです。SYN_RCVD: サーバー側が、クライアントからのSYNパケットを受け取り、「いいですよ」という応答(SYN-ACKパケット)を送った後、クライアントからの最終確認(ACKパケット)を待っている状態です。ESTABLISHED: これが、通信が確立された、まさに「話せる状態」です! クライアントとサーバーの間で、データが実際にやり取りされている状態を指します。郵便局で言えば、手紙のやり取りがスムーズに行われている状態ですね。FIN_WAIT1/FIN_WAIT2: 通信を終了しようとしている側が、「もう終わりたいです」という信号(FINパケット)を送った後、相手からの応答や、相手からの終了信号を待っている状態です。TIME_WAIT: 通信が終了した後、まだしばらくの間、相手からの予期せぬデータや、通信の遅延によるパケットが届く可能性に備えて待機している状態です。CLOSE_WAIT: 相手方から通信終了の信号(FINパケット)を受け取ったサーバー側が、「わかりました、終わりましょう」という応答(ACKパケット)を送った後、自分自身も通信を終了する準備をしている状態です。CLOSED: 通信が完全に終了し、ソケットが閉じられた状態です。
OSによる微妙な違いに注意!
ここで少しだけ、現場でよくある「あるある」を。実は、netstatコマンドの出力や、表示される状態(State)の項目は、OS(Windows, Linux, macOSなど)によって、微妙に異なることがあります。
例えば、Linuxでは-pオプションでプロセスID(PID)とプログラム名が表示され、どのプログラムがそのソケットを使っているのかが分かります。これが、障害調査では非常に役立ちます。
- Linux/macOSの場合:
-pオプションが利用可能で、PIDとプログラム名が表示されます。
# Linux/macOS: プロセス情報も表示
netstat -tulnp
- Windowsの場合:
-pオプションは使えません。その代わりに-oオプションでPIDが表示され、タスクマネージャーなどでPIDからプログラム名を特定する必要があります。
# Windows: PIDを表示 (-b オプションで実行ファイル名も表示可能ですが、管理者権限が必要な場合があります)
netstat -ano
Windowsで実行ファイル名まで表示したい場合は、管理者権限でコマンドプロンプトを開いて -b オプションをつけて実行すると便利です。
# Windows (管理者権限): 実行ファイル名も表示
netstat -anb
もし、コマンドの出力が思ったのと違うな、と思ったら、お使いのOSのヘルプ(netstat --helpやman netstat)を確認してみるのが良いでしょう。
netstatコマンドを活用したトラブルシューティング例
では、このnetstatコマンドを、実際のトラブルシューティングでどう使うか、いくつか例を挙げてみましょう。
例1:Webサーバーが応答しない!
Webサーバー(ポート80)が外部からアクセスできない、という状況を想定します。
1. まず、サーバー自身でnetstatを実行してみます。
# サーバー上で実行
netstat -tulnp | grep ':80'
ここで、tcp 0 0 0.0.0.0:80 0.0.0.0:\* LISTEN <PID>/<プログラム名> のような出力があれば、Webサーバープロセスは起動しており、ポート80で接続を待っている状態です。これは一安心。
2. もしLISTEN状態になっていない場合:
Webサーバーのプロセスが起動していないか、ポート番号が間違っている可能性があります。ログを確認したり、Webサーバーの設定を見直しましょう。
3. LISTEN状態だけど、外部からアクセスできない場合:
- ファイアウォール: サーバーやネットワーク機器のファイアウォールで、ポート80へのアクセスがブロックされていないか確認します。
- ローカルアドレス:
0.0.0.0:80でLISTENしていれば、全てのNICで待ち受けているはずです。もし特定のIPアドレス(例:192.168.1.10:80)だけになっていたら、そのIPアドレスにしか応答しません。 - 外部からのnetstat: 可能であれば、別のコンピューターからそのサーバーのポート80に接続を試みて、
netstatの状態を確認するのも有効です。例えば、telnet <サーバーIP> 80を実行し、接続できればESTABLISHEDになるはずです。
例2:サーバーが遅い、応答がおかしい!
サーバーの応答が遅い、時々フリーズする、といった場合、netstatで「接続が詰まっていないか」を確認します。
# TCP接続の確立状況を確認
netstat -ant | grep ESTABLISHED | wc -l
# TCP接続のリスニング状態を確認
netstat -tulnp | grep LISTEN
ESTABLISHEDな接続が異常に多い: サーバーが大量の接続を捌ききれていない可能性があります。DDoS攻撃を受けている可能性も考えられます。SYN_RCVDが大量に発生している: サーバーは接続要求を受け取っていますが、クライアントからの最終確認が返ってこない、あるいはサーバー側で処理が追いついていない可能性があります。Recv-QやSend-Qに大きな数値が表示されている: 先ほど説明したように、データの送受信に遅延が発生しています。ネットワーク帯域の圧迫や、アプリケーションの処理能力不足が考えられます。
さらなる探求へ!
netstatコマンドは、TCP/UDPのソケット状態を把握するための強力なツールです。今回ご紹介したのは基本的な使い方ですが、実は他にもたくさんのオプションがあります。
-a: 全てのソケット(リスニング中および非リスニング)を表示-n: IPアドレスやポート番号を数値で表示(名前解決をしないため高速)-t: TCP接続のみ表示-u: UDP接続のみ表示-l: リスニング状態のソケットのみ表示-p: (Linux/macOS) プロセスIDとプログラム名を表示-o: (Windows) プロセスIDを表示
これらのオプションを組み合わせることで、より詳細な情報を得ることができます。
# Linux/macOS: TCP接続で、IPアドレスとポート番号を数値で表示し、プロセス情報も表示
netstat -antp
まとめ
今日は、netstatコマンドを使ってTCP/UDPソケットの状態を一覧表示する方法と、各カラムの意味について、郵便配達に例えながらじっくり見てきました。
Protoで通信方式(TCP/UDP)を確認。Recv-QやSend-Qでデータの滞留がないかチェック。Local AddressとForeign Addressで、どこからどこへの通信かを確認。Stateで、通信が「待機中」「接続中」「終了中」など、どの段階にあるかを把握。
このnetstatコマンドは、ネットワークの「今」を映し出す鏡のようなものです。皆さんがこれからインフラやネットワークの世界に足を踏み入れていく上で、このコマンドが、日々の運用や、もしもの時のトラブルシューティングの頼れる相棒になってくれることを願っています!
何か疑問点があれば、いつでもコメントで質問してくださいね。一緒にネットワークの世界を楽しみましょう!
コメント