ssコマンドでソケット情報を確認する方法|LISTEN・ESTABの見方やポート確認も


図解60p「Linuxサーバー構築入門マニュアル」無料
登録10秒/自動返信でDL/合わなければ解除3秒
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Linuxtips > ssコマンドでソケット情報を確認する方法|LISTEN・ESTABの見方やポート確認も
「サーバーでどのポートが開いているか確認したいけど、netstatが使えない…」
「ssコマンドの出力が読めなくて、結局どのプロセスがどのポートを使っているか分からない…」

RHEL 7以降のLinuxでは、netstatに代わって ss がネットワーク確認の標準コマンドになりました。

この記事では、ssコマンドの実践的な使い方を解説します。
基本的な接続確認から、LISTENポートの一覧表示、特定ポートの絞り込み、プロセスの特定まで、現場で必要になる操作を網羅しています。

なぜnetstatではなくssコマンドなのか?

netstatは長年Linuxのネットワーク確認に使われてきましたが、RHEL 7/CentOS 7以降では net-tools パッケージに含まれる「非推奨」のコマンドという位置づけになりました。

ssコマンドは iproute2 パッケージに含まれ、カーネルから直接ソケット情報を取得します。そのため、netstatより動作が高速で、大量のコネクションがあるサーバーでも瞬時に結果が返ってきます。

netstat:/proc/net/tcpを解析するため、接続数が多いと遅くなる
ss:netlinkソケット経由でカーネルから直接取得するため、高速に動作する

新しいディストリビューション(RHEL 8/9、Ubuntu 20.04以降など)では、net-toolsがデフォルトでインストールされていないことも多いため、ssコマンドの使い方を身につけておくことが実務上必須です。

ssコマンドの基本的な使い方

1. 全ソケット情報を表示する

まずはオプションなしで実行してみましょう。

# すべてのソケット情報を表示する $ ss

オプションなしの場合、ESTAB(確立済み)状態のTCP接続のみが表示されます。UDPやLISTEN状態のソケットは表示されません。

2. LISTENポートを一覧表示する(ss -tlnp)

現場で最もよく使うのが、LISTENしているポートの一覧表示です。

# TCP LISTENポートをプロセス名付きで表示する $ ss -tlnp State Recv-Q Send-Q Local Address:Port Peer Address:Port Process LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=1234,fd=3)) LISTEN 0 128 0.0.0.0:80 0.0.0.0:* users:(("httpd",pid=5678,fd=4)) LISTEN 0 128 0.0.0.0:443 0.0.0.0:* users:(("httpd",pid=5678,fd=6))

各オプションの意味は以下のとおりです。

-t:TCPソケットのみ表示
-l:LISTEN状態のソケットのみ表示
-n:ポート番号を数値のまま表示(名前解決しない)
-p:ソケットを使用しているプロセスを表示

※ -p オプションでプロセス情報を表示するには root 権限が必要です。一般ユーザーで実行すると、自分のプロセスの情報しか表示されません。

3. ESTABLISHED(確立済み)接続を確認する

現在通信中のTCP接続を確認するには、-t オプションだけを付けます。

# 確立済みのTCP接続を表示する $ ss -tnp State Recv-Q Send-Q Local Address:Port Peer Address:Port Process ESTAB 0 0 192.168.1.10:22 192.168.1.100:54321 users:(("sshd",pid=2345,fd=3)) ESTAB 0 0 192.168.1.10:80 203.0.113.50:48765 users:(("httpd",pid=5678,fd=8))

-l を付けなければ、ESTAB状態(通信中)の接続が表示されます。「今このサーバーに誰が接続しているか」を確認するときに使ってください。

4. UDPソケットを確認する

DNSやNTP、syslogなどUDPを使うサービスの確認には -u オプションを使います。

# UDP LISTENポートをプロセス名付きで表示する $ ss -ulnp State Recv-Q Send-Q Local Address:Port Peer Address:Port Process UNCONN 0 0 0.0.0.0:68 0.0.0.0:* users:(("dhclient",pid=890,fd=6)) UNCONN 0 0 127.0.0.1:323 0.0.0.0:* users:(("chronyd",pid=678,fd=5))

UDPにはLISTENという状態がないため、UNCONN(未接続=待ち受け中)と表示されます。

5. TCP・UDPの両方をまとめて確認する

TCPとUDPを一度に確認したい場合は -tu を使います。

# TCP・UDP両方のLISTENポートをまとめて表示する $ ss -tulnp

この ss -tulnp は、サーバーの初期セットアップ時や、障害調査の最初の一手として非常によく使われます。まずこれを打って全体像を把握する、という流れを覚えておきましょう。

特定ポートやアドレスに絞り込む方法

1. 特定のポート番号で絞り込む

ssコマンドにはフィルタ構文があり、特定のポートに絞った表示ができます。

# ポート80を使っているソケットを表示する $ ss -tlnp sport = :80 # ポート443を使っているソケットを表示する $ ss -tlnp sport = :443 # ポート番号の範囲で絞り込む(1024未満のウェルノウンポート) $ ss -tlnp sport lt :1024

sport はソース(ローカル)ポート、dport は宛先(リモート)ポートを意味します。

2. 特定のIPアドレスで絞り込む

# 特定のリモートIPからの接続を表示する $ ss -tnp dst 203.0.113.50 # 特定のローカルIPのソケットを表示する $ ss -tlnp src 192.168.1.10

「特定のクライアントからの接続だけを確認したい」というときに役立ちます。

3. 状態で絞り込む

# ESTABLISHED状態のTCP接続のみ表示する $ ss -tn state established # TIME-WAIT状態の接続を表示する $ ss -tn state time-wait # CLOSE-WAIT状態の接続を表示する(相手が切断したが自分側が閉じていない) $ ss -tn state close-wait

TIME-WAITが大量に表示される場合は、短時間に多くの接続・切断が繰り返されている可能性があります。CLOSE-WAITが残り続ける場合は、アプリケーション側のバグ(ソケットを閉じていない)を疑ってください。

実務で使えるTips

ssの出力をgrepで絞り込む

フィルタ構文を覚えるのが面倒な場合は、grep との組み合わせでも十分です。

# httpdプロセスのソケットだけ表示する $ ss -tlnp | grep httpd # ポート3306(MySQL)を使っているソケットを確認する $ ss -tlnp | grep 3306

接続数をカウントする

Webサーバーの同時接続数を確認するときに使えるワンライナーです。

# ポート80のESTABLISHED接続数をカウントする $ ss -tn state established sport = :80 | wc -l # 接続元IPごとの接続数を集計する $ ss -tn state established sport = :80 | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn | head

特定のIPから異常に多い接続がある場合は、DoS攻撃やクローラーの可能性があります。

ssとlsofの使い分け

ポートを使っているプロセスを調べるにはlsofコマンドも使えます。使い分けの目安は以下のとおりです。

ss -tlnp:ソケット全体を俯瞰したいとき(高速)
lsof -i :ポート番号:特定ポートのプロセスをファイルディスクリプタレベルで確認したいとき

どちらもroot権限で実行すると、すべてのプロセスの情報が表示されます。

「ss: command not found」が出た時の対処法

ssコマンドが見つからない場合は、iproute2パッケージがインストールされていない可能性があります。

# RHEL/CentOS系の場合 $ sudo yum install iproute # Ubuntu/Debian系の場合 $ sudo apt install iproute2

ほとんどのディストリビューションではデフォルトでインストールされていますが、最小インストール(minimal install)を選択した場合に不足していることがあります。

「permission denied」でプロセス情報が表示されない場合

ss -p を一般ユーザーで実行すると、Process列が空欄になる場合があります。

# 一般ユーザーで実行した場合(プロセス情報が表示されない) $ ss -tlnp State Recv-Q Send-Q Local Address:Port Peer Address:Port Process LISTEN 0 128 0.0.0.0:22 0.0.0.0:* # root権限で実行する $ sudo ss -tlnp State Recv-Q Send-Q Local Address:Port Peer Address:Port Process LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=1234,fd=3))

他のユーザーが起動したプロセスのソケット情報を見るには、root権限(sudo)が必要です。これはセキュリティ上の仕様なので、障害調査時は必ず sudo を付けて実行してください。

本記事のまとめ

やりたいこと コマンド
TCP LISTENポートを一覧表示する ss -tlnp
ESTABLISHED接続を確認する ss -tnp
UDP LISTENポートを確認する ss -ulnp
TCP・UDPの両方をまとめて確認する ss -tulnp
特定ポートのソケットを表示する ss -tlnp sport = :80
特定IPからの接続を表示する ss -tnp dst 203.0.113.50
特定の状態の接続を表示する ss -tn state established
接続数をカウントする ss -tn state established sport = :80 | wc -l

ssコマンドの出力を「読める」だけで終わっていませんか?

ポートの確認やプロセスの特定は、サーバー管理の基本中の基本です。
ネットの切れ端の情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。

「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。



無料プレゼント
図解60p「Linuxサーバー構築入門マニュアル」
独学で詰まる前に、“型(手順書)”で最初の環境構築をサクッと終わらせましょう。
登録10秒/自動返信でDL/合わなければ解除3秒
無料で受け取る ※メールアドレスだけでもOK(必須項目は最小限)

宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として15年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

図解60pのLinux無料マニュアル
登録10秒/自動返信でDL
無料で受け取る