【入門編】 ssコマンドによる高速なソケット情報収集とnetstatからの移行理由 – トラブルシューティング&ネットワーク運用監視実践ガイド

こんにちは。国内外のデータセンターを渡り歩き、パケットの嵐の中で何度も夜を明かしてきたシニアエンジニアの私です。

皆さんは、サーバーの調子が悪い時や「今、どれくらい接続が来ているんだろう?」と思った時、どのコマンドを叩きますか? おそらく、多くの入門書や古い技術ブログで紹介されている netstat を思い浮かべる方が多いのではないでしょうか。

しかし、現場の最前線、特に秒間数万リクエストが飛び交うような大規模環境では、netstat を叩いた瞬間に「コマンドの応答が返ってこない……」という冷や汗モノの事態に陥ることがあります。

そこで今回、皆さんにぜひマスターしてほしいのが、現代の標準武装である ss コマンド です。「なぜ netstat ではなく ss なのか?」その理由を、郵便配達や街の仕組みに例えながら、優しく、かつ深く紐解いていきましょう。

—

1. ネットワークの「窓口」:ソケットってなに?

本題に入る前に、まずは「ソケット」という言葉を整理しておきましょう。ネットワークの世界を一つの大きな「役所」だと想像してみてください。

サーバーの中には、たくさんの「窓口(ポート番号)」があります。

  • 80番窓口:Webサイトの案内係(HTTP)
  • 443番窓口:セキュリティのしっかりした案内係(HTTPS)
  • 22番窓口:裏口の管理人(SSH)

この窓口ひとつひとつが、外部の世界とつながるための「ドア」の役割を果たしています。このドアのことを、専門用語で 「ソケット」 と呼びます。

ss や netstat というコマンドは、「今、どの窓口が開いているか?」「誰がどの窓口で話し中か?」という名簿をのぞき見するための道具 なのです。

—

2. netstat と ss の決定的な違い:情報の集め方

「名簿を見るだけなら、どっちのコマンドでも同じじゃないの?」と思うかもしれません。しかし、その「名簿の作り方」が全く違うのです。

netstat は「古い台帳を1ページずつめくる」

netstat は、Linuxカーネル(OSの心臓部)が書き出している /proc/net/tcp といったテキスト形式のファイルを読みに行きます。これは例えるなら、「全市民の住所録が書かれた分厚い紙のファイルを、1ページ目から最後までめくって確認する」 ようなものです。

接続数が100件程度なら問題ありません。しかし、これが10万件、20万件となったらどうでしょう? ファイルは巨大になり、読み終わる頃には情報が古くなっているかもしれません。

ss は「管理本部に直接電話して聞く」

一方で ss コマンドは、「Netlink(ネットリンク)」 という特別な仕組みを使います。これは、カーネルと直接会話ができる「専用の直通電話」のようなものです。

ss は「今の接続状況を教えて!」とカーネルの脳内に直接問いかけ、カーネルもバイナリ(コンピュータが理解しやすい形)でサッと答えてくれます。台帳をめくる手間がないため、接続数が膨大になっても一瞬で結果が返ってくる のです。

—

3. 実践! ssコマンドで現場の状況を覗いてみよう

それでは、実際に手を動かしてみましょう。まずはこれだけ覚えておけば現場で戦える、という基本のコマンドを紹介します。

「今、どの窓口が開いているか?」を確認する

サーバーがリクエストを受け付けられる状態(Listen状態)かどうかを確認する基本形です。

# -l: 待ち受け(Listen)状態のソケットだけを表示
# -t: TCP(一般的な通信)を表示
# -n: アドレスやポート番号を数字のまま表示(名前解決をしないので速い!)
ss -ltn

この -n オプションは非常に重要です。これがないと、IPアドレスを名前に変換しようとして時間がかかり、トラブルシューティング中にイライラすることになります。「現場では -n をつける」と覚えておきましょう!

「今、誰と誰が通信中か?」を詳しく見る

特定の通信が詰まっていないか、どのIPアドレスから接続が来ているかを確認する際に使います。

# -a: すべて(All)のソケットを表示(通信中も待ち受け中も全部!)
# -t: TCPを表示
# -p: どのプログラム(Process)がその窓口を使っているか表示(要sudo)
sudo ss -atp

これを実行すると、「どのアプリ(nginxやsshなど)が、どの相手と、どんな状態(ESTABなど)で通信しているか」が手に取るようにわかります。

—

4. 現場で役立つ「フィルタリング」の魔法

ss コマンドの真のパワーは、その「絞り込み能力」にあります。膨大なパケットの海から、目的の情報を釣り上げる方法です。

HTTP(80) や HTTPS(443) だけを狙い撃ちする

「Webサイトへのアクセスだけ見たいんだ!」という時はこう書きます。

# dport (宛先ポート) が 80 または 443 のものだけを表示
ss -atn '( dport = :80 or dport = :443 )'

接続が「詰まっている」ものを見つける

ネットワークのトラブルで多いのは、通信が終わりかけているのに居座っている接続(TIME-WAIT)や、接続が確立されたばかりのもの(ESTABLISHED)です。

# 通信が確立されている(おしゃべり中)ものだけを表示
ss -t state established

—

5. まとめ:なぜ今、ss への移行が必要なのか

最後に、なぜ私たちが netstat を卒業し、 ss を選ぶべきなのかを整理しましょう。

1. 圧倒的なスピード: Netlinkを利用するため、高負荷なサーバーでもシステムへの負担が極めて少ないです。
2. 詳細な情報: TCPの内部状態(再送回数やウィンドウサイズなど)といった、netstat では見えない深い情報まで取得できます。
3. 標準化: 多くの最新Linuxディストリビューションでは netstat を含む net-tools パッケージは非推奨(Deprecated)となり、ss を含む iproute2 パッケージが標準になっています。

「今まで netstat だったから……」という慣習は今日で終わりにしましょう。
新しい道具を手になじませるまでは少し違和感があるかもしれませんが、一度 ss の軽快さを知ってしまえば、もう元の重い台帳めくりには戻れなくなるはずです。

ネットワーク運用は、一歩ずつ、確実に理解を深めていくことが大切です。まずは自分の開発環境やテストサーバーで ss -tln と叩くところから始めてみてください。パケットの向こう側に見える景色が、少しずつ変わってくるはずですよ。

それでは、また次の現場でお会いしましょう!応援しています!

コメント

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