ss コマンドの使い方・ポート開放確認とソケット調査|netstat代替・主要オプション解説

コマンドリファレンス

Linuxサーバーの運用やWeb開発において、「特定のポートが開放・リッスンされているか」「どのプロセスがポートを占有しているか」「現在のTCP接続数やソケット状態はどうなっているか」を確認する作業は日常茶飯事です。

従来は netstat コマンドが広く使われていましたが、現在は net-tools パッケージ自体のメンテナンスが停止し非推奨となっており、後継である ss(Socket Statistics)コマンド への移行が標準となっています。ss はカーネル空間から直接 Netlink 経由でソケット情報を取得するため、接続数が膨大な本番サーバーでも超高速かつ低負荷に動作します。

本記事では、実務で最も多用する鉄板コマンド ss -tulpn をはじめ、主要オプションの使い分け、出力結果(Recv-Q / Send-QState)の正確な読み方、強力なフィルタリング構文、そして「Address already in use(ポート競合)」発生時のトラブルシューティング実務レシピまでを徹底解説します。

【早見表】netstat から ss への移行・対応コマンド一覧

長年 netstat に慣れ親しんだ方のために、まずは主要なコマンドの置き換え対応表をまとめました。基本オプションの文字(-t, -u, -l, -p, -n, -a)は netstat とほぼ共通です。

確認したい内容従来の netstat推奨される ss コマンドポイント
LISTEN中の全ポートとプロセスnetstat -tulpnsudo ss -tulpn最重要コマンド。プロセス名(-p)表示には sudo 必須
TCPのLISTENポートのみnetstat -tlnss -tlnWebサーバーやDBの待ち受け確認
接続確立中(ESTABLISHED)のTCPnetstat -tnss -tn現在通信中のセッション一覧
TCP/UDP全ソケット(接続中+待ち受け)netstat -tuanss -tuanすべてのTCP/UDPソケットを一覧表示
ソケット全体の統計サマリnetstat -sss -sTCP/UDP/RAW等の総数やTIME_WAIT数
UNIXドメインソケットnetstat -xss -xPHP-FPMやMySQLのソケットファイル確認
特定ポート(80番など)の絞り込みnetstat -tln | grep :80ss -tln sport = :80ss 単体で高速な条件フィルタが可能

netstat/proc/net/ 配下の仮想ファイルを走査・パースするため、数万〜数十万のコネクションがある高負荷環境ではCPUやI/Oを激しく消費します。一方、ss はカーネルの Netlink インターフェースを利用するため、一瞬で結果が返ってきます。

ss コマンドの構文と主要オプション一覧

ss [オプション] [フィルタ条件]
オプション名称・対象解説と実務での用途
-tTCPTCPソケットのみを対象にする
-uUDPUDPソケットのみを対象にする(DNS, NTP, VPN等)
-xUNIXUNIXドメインソケットのみを対象にする
-lListeningLISTEN(待ち受け)状態のソケットのみ表示(デフォルトは接続確立中のみ)
-aAllLISTEN状態と接続確立中の両方を含む全ソケットを表示
-pProcessソケットを開いているプロセス名・PID・FD番号を表示(要root権限)
-nNumericポート番号やIPアドレスを名前解決(DNS逆引きやサービス名変換)せず数値のまま表示(高速化のため実務では必須推奨
-rResolveIPアドレスやポートを名前解決してホスト名・サービス名で表示
-sSummaryプロトコル別(TCP, UDP, RAW, UNIX)のソケット接続統計サマリを表示
-4 / -6IPv4 / IPv6IPv4ソケット、またはIPv6ソケットのみに限定して表示
-eExtendedソケットの詳細情報(uid, ino, skcookie 等)を表示
-iInternalTCP内部情報(RTT, cwnd, MSS, 再送情報等)を表示

【実務の定番】ss -tulpn でリッスン中のポートとプロセスを確認する

サーバーで新しいサービス(Nginx, Apache, MySQL, PostgreSQL, Docker等)を起動した際や、ポート開放状況を確認したいときは、以下のコマンドを実行するのが最も標準的です。

sudo ss -tulpn

出力例:

Netid  State   Recv-Q  Send-Q   Local Address:Port   Peer Address:Port  Process
tcp    LISTEN  0       511            0.0.0.0:80          0.0.0.0:*      users:(("nginx",pid=1234,fd=6),("nginx",pid=1235,fd=6))
tcp    LISTEN  0       511            0.0.0.0:443         0.0.0.0:*      users:(("nginx",pid=1234,fd=7),("nginx",pid=1235,fd=7))
tcp    LISTEN  0       128            0.0.0.0:22          0.0.0.0:*      users:(("sshd",pid=890,fd=3))
tcp    LISTEN  0       128          127.0.0.1:3306        0.0.0.0:*      users:(("mysqld",pid=1520,fd=33))
tcp    LISTEN  0       128               [::]:22             [::]:*      users:(("sshd",pid=890,fd=4))
udp    UNCONN  0       0              0.0.0.0:53          0.0.0.0:*      users:(("named",pid=950,fd=512))
udp    UNCONN  0       0            127.0.0.1:323         0.0.0.0:*      users:(("chronyd",pid=720,fd=5))

-tulpn の組み合わせ(TCP + UDP + LISTEN + Process + Numeric)を覚えておくことで、システム上で「誰が」「どのIP・ポートで待ち受けているか」が一目瞭然になります。

なぜ sudo が必要なのか?

一般ユーザー権限で ss -tulpn を実行した場合、ソケットの一覧自体は表示されますが、Process カラム(プロセス名やPID)が空白になります。セキュリティ上、他のユーザー(rootやシステムアカウント)が実行しているプロセスのファイルディスクリプタ情報を参照するには管理者権限が必要となるため、プロセス特定時は必ず sudo を付与してください

出力結果(各カラム・ステータス)の完全な読み解き方

ss コマンドの出力結果には、トラブルシューティングに直結する重要なパラメータが含まれています。

1. State(ソケット状態)の意味

ステータス状態の意味と解説
LISTEN接続要求(SYN)を待ち受けている状態。サーバープログラムが正常起動中
ESTAB(ESTABLISHED)3ウェイハンドシェイクが完了し、正常にTCP通信が確立している状態
SYN-SENT / SYN-RECV接続開始処理中。大量に滞留している場合はSYN Flood攻撃やネットワーク障害の疑い
TIME-WAIT通信終了後にパケットの遅延到達を待つ待機状態(OSが一定時間保持)
CLOSE-WAITリモート側から切断要求(FIN)を受け、ローカル側のクローズ完了を待っている状態。大量滞留時はアプリのコネクション解放漏れ(バグ)の兆候
UNCONNUDPソケットの待ち受け状態。UDPはコネクションレスのため「未接続」と表示される

※ UDPの疎通確認や仕組みの詳細は TCPとUDPの違いを実測で解説|パケット数・ヘッダ・確認コマンド をご参照ください。

2. Recv-Q と Send-Q(受信・送信キュー)の注意点

Recv-QSend-Q は、ソケットが LISTEN 状態か ESTABLISHED 状態かで意味が全く異なる ため注意が必要です。

状態Recv-Q の意味Send-Q の意味
LISTEN 状態時現在バックログキューに入っている接続数(accept待ちの接続数)バックログキューの最大許容サイズ(listen() のバックログ設定値)
ESTABLISHED 状態時受信バッファに入っているがアプリがまだ読み取っていないバイト数送信バッファに入っているが相手先からACKが届いていないバイト数

LISTEN状態で Recv-Q の値が Send-Q に迫っている(または一致している)場合、WebサーバーやDBの処理能力が追いつかず、接続リクエストを取りこぼし(ドロップ)している危険な状態 を意味します。

3. Local Address:Port(バインド範囲)の識別

  • 0.0.0.0:80 : サーバー上のすべてのIPv4ネットワークインターフェースからアクセス可能(外部公開)。
  • 127.0.0.1:3306 : ローカルループバック(localhost)からのみ接続可能。外部からのアクセスは拒否される安全な設定。
  • [::]:22 : すべてのIPv6インターフェース(デュアルスタック設定時はIPv4も含む)で待ち受け。
  • 192.168.1.10:8080 : 指定した特定の内部IPアドレスでのみ待ち受け。

ss 独自の強力なフィルタリング構文(grep不要)

ss コマンドの大きな特徴は、grepawk にパイプで渡すことなく、コマンド単体で高度な条件絞り込み(ポート・IP・状態・プロトコル)ができる点 です。

1. 特定のポート番号・サービス名で絞り込む

sport(送信元ポート / Source Port)や dport(宛先ポート / Destination Port)を指定します。

# 80番ポートでリッスンしているソケットを表示
ss -tln sport = :80

# 443番(HTTPS)または 80番(HTTP)のどちらかに一致するソケットを表示
ss -tln '( sport = :443 or sport = :80 )'

# 1024番以上の非特権ポートのみを表示
ss -tln sport > :1024

2. ソケットの通信状態で絞り込む(state フィルタ)

# 接続確立中(ESTABLISHED)のTCPセッションのみ表示
ss -t state established

# TIME_WAIT 状態のコネクションを一覧表示
ss -t state time-wait

# 接続確立中以外のすべての状態(connected / listening等)
ss -t state all

3. 宛先IPアドレスやCIDR範囲で絞り込む

# 特定の宛先IPへの接続のみ表示
ss -t dst 192.168.1.50

# 特定のサブネット(CIDR)への接続を抽出
ss -t dst 10.0.0.0/16

実務で役立つトラブルシューティング・実践レシピ

レシピ1: ポート競合(Address already in use)のプロセスを特定して終了する

サーバーアプリを起動した際に「ポートが既に使用されています」とエラーが出た場合、該当ポートを掴んでいるPIDを特定して停止します。

# 例: 8080番ポートを掴んでいるプロセスを特定
sudo ss -tulpn sport = :8080

出力例:

Netid  State   Recv-Q  Send-Q  Local Address:Port  Peer Address:Port  Process
tcp    LISTEN  0       128           0.0.0.0:8080        0.0.0.0:*      users:(("node",pid=4567,fd=19))

PIDが 4567 と判明したら、プロセスの素性を確認した上で安全に停止・終了します。

# プロセスの詳細を確認
ps -fp 4567

# 安全に通常終了(SIGTERM)
kill 4567

# 応答しない場合のみ強制終了(SIGKILL)
kill -9 4567

※ ポート競合解消の網羅的な手順は Linuxのポート確認方法とポート競合の解消手順|netstat・lsof・ss完全ガイド もあわせてご覧ください。

レシピ2: ソケット統計サマリ(ss -s)でサーバーの詰まりを検知する

サーバー高負荷時やネットワーク遅延時に、システム全体のコネクション数と状態サマリを瞬時に確認できます。

ss -s

出力例:

Total: 842
TCP:   1250 (estab 320, closed 850, orphaned 0, timewait 780)

Transport Total     IP        IPv6
RAW	  1         1         0        
UDP	  8         5         3        
TCP	  400       350       50       
INET	  409       356       53       
FRAG	  0         0         0        

timewaitclosed の数が異常に跳ね上がっていないかをチェックすることで、Keep-Alive設定の見直しや短時間接続の頻発を検知できます。

レシピ3: UNIXドメインソケット(PHP-FPMやMySQL)の確認

Nginx と PHP-FPM / MySQL 間を .sock ファイルで通信させている場合、-x オプションで確認します。

sudo ss -xlnp | grep -E 'php|mysql'

出力例:

u_str LISTEN 0 511 /run/php/php8.3-fpm.sock 12345 * 0 users:(("php-fpm8.3",pid=2300,fd=7))
u_str LISTEN 0 128 /var/run/mysqld/mysqld.sock 67890 * 0 users:(("mysqld",pid=1520,fd=34))

まとめ・日常運用での使い分け

  • ポート開放・リッスン中のプロセス確認: sudo ss -tulpn を使うのが鉄板。
  • 特定のポート調査: ss -tln sport = :80 のように直接条件指定すると高速。
  • システム全体のコネクション数把握: ss -s でサマリを一発表示。
  • netstat からの完全移行: 非推奨となった netstat から ss へスクリプトや運用手順を更新しましょう。

関連コマンド・参考リンク

Bash玄

はじめまして!Bash玄です。

エンジニアとしてシステム運用に携わる中で、手作業の多さに限界を感じ、Bashスクリプトを活用して業務を効率化したのがきっかけで、この道に入りました。「手作業は負け」「スクリプトはシンプルに」をモットーに、誰でも実践できるBashスクリプトの書き方を発信しています。

このサイトでは、Bashの基礎から実践的なスクリプト作成まで、初心者でもわかりやすく解説しています。少しでも「Bashって便利だな」と思ってもらえたら嬉しいです!

# 好きなこと
- シンプルなコードを書くこと
- コマンドラインを快適にカスタマイズすること
- 自動化で時間を生み出すこと

# このサイトを読んでほしい人
- Bashに興味があるけど、何から始めればいいかわからない人
- 定型業務を自動化したい人
- 効率よくターミナルを使いこなしたい人

Bashの世界に一歩踏み出して、一緒に「Bash道」を極めていきましょう!

Bash玄をフォローする

コメント