こんにちは。大規模データセンターの片隅で、今日もパケットの波に揉まれているシニアエンジニアです。
皆さんは、運用中のサーバーで「なんだか接続が重いな?」「特定の場所から大量にアクセスが来ている気がする……」と感じたことはありませんか? そんな時、ベテランエンジニアが魔法のように黒い画面(CLI)を叩いて、一瞬で原因を特定する姿を見たことがあるかもしれません。
かつては netstat というコマンドがその役割を担っていましたが、現代のLinuxインフラにおいて、より高速で、より強力な武器となるのが ss (Socket Statistics)コマンドです。
「オプションがいっぱいあって難しそう……」と敬遠されがちですが、実はコツさえ掴めば、郵便局の仕分け作業のように直感的に使いこなせるんですよ。今回は、ネットワークの迷宮を解き明かす「ssコマンドのフィルタリング術」を、一歩ずつ丁寧に紐解いていきましょう!
—
1. サーバーは「巨大なアパート」である
まずはイメージを膨らませてみましょう。
ネットワークに繋がったサーバーは、数万もの部屋がある「巨大なアパート」のようなものです。
- IPアドレス:アパートの住所そのもの
- ポート番号:各部屋の番号(80号室、443号室など)
- ソケット(Socket):部屋の中で誰かが誰かと会話している「通話状態」
ss コマンドは、このアパートの管理人さんが持っている「入居者名簿」のようなものです。「今、どの部屋で、誰が、どんな状況で話をしているか?」を瞬時にリストアップしてくれます。
—
2. まずは基本の「キ」:すべてを表示する
フィルタリングを学ぶ前に、まずは全体を見る魔法の合言葉を覚えましょう。
# 全てのTCP接続(t)を、数字形式(n)で、詳しく表示(a)します
ss -tan
これだけでも情報は出ますが、接続数が多いサーバーだと画面が文字で埋め尽くされてしまいます。そこで、「フィルタリング(絞り込み)」の出番です!
—
3. 「状態(State)」で絞り込む:今、何をしている?
ネットワークの接続には「フェーズ」があります。電話に例えるとわかりやすいですよ。
LISTEN:電話が鳴るのを待っている状態(受付中)ESTABLISHED:通話中の状態(データ通信中)TIME-WAIT:通話が終わって、受話器を置いた直後の余韻(終了処理中)
例えば、「今まさに通信しているセッションだけ見たい!」という時は、こう書きます。
# 通信が確立(established)しているものだけを表示
ss -t state established
# 逆に、外部からの接続を待ち受けている(listening)ポートだけを確認
ss -t state listening
「一歩ずつ理解していきましょう!」
この state 指定を覚えるだけで、ノイズ(不要な情報)がグッと減って、今起きていることが見えやすくなります。
—
4. 「ポート番号」で絞り込む:どの部屋の出来事?
次に、「特定の部屋(ポート)」に注目してみましょう。
ここで使うのが sport (Source Port / 送信元) と dport (Destination Port / 送信先) です。
サーバーが提供しているサービスを確認する(dport)
例えば、「Webサイト(80番や443番)へのアクセスだけを見たい」という場合です。
# 宛先ポート(dport)が 80(HTTP)の接続を表示
ss -t dport = :80
# HTTPS(443)も見たい場合は、このように書けます
ss -t '( dport = :http or dport = :https )'
ここで出てくる :http という書き方は、/etc/services というファイルに定義された名前を使っています。もちろん :80 と数字で書いても大丈夫です。
自分のサーバーから外への通信を確認する(sport)
逆に、「自分のサーバーが外のデータベースに繋ぎに行っている様子」を見たい時は、自分の部屋番号である sport を意識します。
—
5. 「住所(CIDR)」で絞り込む:どこの誰からの接続?
トラブルシューティングの現場では、「特定のネットワーク拠点(例えば支店や特定のクラウド)からの接続だけを調査したい」という場面がよくあります。
そんな時は、IPアドレスの範囲を指定する dst (Destination) や src (Source) を使います。
# 192.168.1.0〜255 の範囲(24ビットマスク)からの接続を調べる
ss -t src 192.168.1.0/24
これは郵便配達員さんが「この町内会からの手紙だけをピックアップしよう」と仕分けするのと全く同じ感覚です。
—
6. 【実践編】これぞプロの技! 組み合わせの妙
さて、ここまでの知識を組み合わせて、現場で即戦力になる「複合クエリ」を作ってみましょう。
「ある特定のIPアドレスから、こちらのWebサイト(80番)に、現在進行形で繋がっているセッション」を探し出すコマンドです。
# src: 相手のIP
# dport: こちらの待ち受けポート
# state established: 通信中
ss -t src 203.0.113.50 dport = :80 state established
どうでしょう? 複雑に見えたネットワークの濁流が、まるで透明になったかのように整理されて見えてきませんか?
—
まとめ:道具を使いこなす楽しさ
ネットワークの運用監視は、目に見えない電気信号の流れを追いかける、非常にクリエイティブな仕事です。
今回ご紹介した ss コマンドのフィルタリングは、いわば「高性能な顕微鏡」のピントを合わせる作業のようなもの。最初は ss -at だけで全体を眺めるだけでも十分です。慣れてきたら「今日は state で絞ってみよう」「次は dport を使ってみよう」と、少しずつ新しいレンズを試してみてください。
トラブルの真っ只中で、自分がおこなった ss コマンドの結果から「原因はこれだ!」と特定できた時の快感は、何物にも代えがたいものがあります。
一歩ずつ、パケットの気持ちがわかるエンジニアを目指していきましょう。あなたの挑戦を、いつでも応援しています!
—
*執筆:NOCシニアエンジニア 兼 技術メディア主筆*
*現場の泥臭い経験を、明日の運用に活かす知恵に変えて。*
コメント