2026年5月24日
2026年5月24日
ssコマンドとnetstatで接続状態・待ち受けポートを確認する方法
サーバーの調査では、「どのポートで待ち受けているか」「どのプロセスがそのポートを使っているか」「どこから何本接続されているか」をよく確認します。Linux でこれを調べるコマンドが ss(socket statistics)と、昔からある netstat です。
現在の主なディストリビューションでは、ss が入っている iproute2 パッケージが標準で、netstat を含む net-tools パッケージは最小構成では入っていないことがあります。この記事では ss を中心に、よく使う確認方法を説明します。コマンドと出力は 2026年10月時点の Debian 12(iproute2 6.1.0)で確認しています。
ssとnetstatのインストール
ss が見つからない場合は、iproute2 を入れます。netstat を使いたい場合は net-tools を入れます。
# Debian / Ubuntu
sudo apt install iproute2 # ss
sudo apt install net-tools # netstat
# RHEL / AlmaLinux / Rocky Linux
sudo dnf install iproute # ss
sudo dnf install net-tools # netstat
よく使うオプション
| オプション | 意味 |
|---|---|
-t |
TCP を表示する |
-u |
UDP を表示する |
-l |
待ち受け中(LISTEN)のソケットだけ表示する |
-a |
待ち受け中と接続中の両方を表示する |
-n |
ポート番号やアドレスを名前に変換せず、数字のまま表示する(速い) |
-p |
ソケットを使っているプロセスを表示する |
-s |
集計(サマリー)を表示する |
-H |
見出しの行を表示しない(集計するときに便利) |
-4 / -6 |
IPv4 / IPv6 だけ表示する |
待ち受け中のポートとプロセスを確認する
いちばんよく使うのが ss -tulnp です。TCP と UDP の待ち受け中のポートを、使っているプロセスと一緒に表示します。
sudo ss -tulnp
出力例:
Netid State Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
udp UNCONN 0 0 0.0.0.0:5353 0.0.0.0:* users:(("nc",pid=365,fd=3))
tcp LISTEN 0 1 0.0.0.0:8443 0.0.0.0:* users:(("nc",pid=364,fd=3))
tcp LISTEN 1 1 0.0.0.0:8080 0.0.0.0:* users:(("nc",pid=363,fd=3))
Local Address:Portが待ち受けているアドレスとポートです。0.0.0.0はすべての IPv4 アドレス、127.0.0.1は自分自身からの接続だけを受け付けることを表します。IPv6 では[::]や*と表示されますProcess欄のusers:(("プロセス名",pid=番号,fd=番号))が、そのポートを使っているプロセスです-pで他のユーザーのプロセスまで表示するには root 権限が必要です。sudoを付けないと、自分のプロセス以外はProcess欄が空になります
特定のポートだけ見たい場合は、フィルターでポートを指定します。
# 443番ポートで待ち受けているプロセス
sudo ss -tlnp 'sport = :443'
# プロセス名で絞り込む(例: nginx)
sudo ss -tlnp | grep nginx
lsof を使う方法もあります。
sudo lsof -nP -iTCP -sTCP:LISTEN
確立済みの接続を確認する
state フィルターで、接続の状態を指定して表示できます。
ss -tn state established
出力例:
Recv-Q Send-Q Local Address:Port Peer Address:Port Process
0 0 127.0.0.1:60984 127.0.0.1:8080
0 0 127.0.0.1:8080 127.0.0.1:60984
state を指定すると State の列が表示されなくなり、列の位置が1つずつ前にずれます。接続相手(Peer Address:Port)は4列目です。
自分のサーバーの特定のポート(例: 443)に来ている接続だけを見るには、sport(自分側のポート)で絞り込みます。自分から外部の特定ポートへの接続を見るときは dport(相手側のポート)を使います。
# 自分の443番ポートに来ている接続
ss -tn state established '( sport = :443 )'
# 外部の3306番ポート(MySQL)への接続
ss -tn state established '( dport = :3306 )'
# ポートの範囲で絞り込む
ss -tn 'dport >= :8000 and dport <= :9000'
接続元IPごとの接続数を数える
アクセスが集中しているときに、どの IP アドレスから多く接続されているかを数えます。-H で見出しを消し、4列目(接続相手)からポート番号を取り除いて数えます。
ss -Htn state established '( sport = :443 )' \
| awk '{print $4}' | sed -E 's/:[0-9]+$//' \
| sort | uniq -c | sort -rn | head
出力は「接続数 IPアドレス」の形で、多い順に並びます。IPv6 のアドレスは [2001:db8::1] のように角かっこ付きで表示されます。sed で最後の :ポート番号 だけを消しているので、IPv6 のアドレスも途中で切れません。
状態ごとの接続数を数える
ss -Htan | awk '{print $1}' | sort | uniq -c
出力例:
4 ESTAB
2 LISTEN
2 TIME-WAIT
ss では状態の名前が ESTAB・TIME-WAIT のように表示されます(netstat では ESTABLISHED・TIME_WAIT)。
全体の集計だけなら ss -s が手軽です。
ss -s
Total: 13
TCP: 46 (estab 4, closed 40, orphaned 0, timewait 2)
TIME-WAITの数を確認する
TIME-WAIT は、先に接続を閉じた側に一定時間残る状態です。Web サーバーやリバースプロキシのように短い接続を大量に扱うサーバーでは、ある程度残っているのは普通の動きです。数だけを確認するには、見出しを消して行数を数えます。
ss -Htan state time-wait | wc -l
-H を付けないと見出しの1行も数えてしまうので注意してください。
netstatとの対応
古い手順書に netstat が書かれている場合は、次のように読み替えます。
| 目的 | netstat | ss / ip |
|---|---|---|
| 待ち受けポートとプロセス | netstat -tulnp |
ss -tulnp |
| すべての TCP 接続 | netstat -tan |
ss -tan |
| 確立済みの接続だけ | netstat -tn の出力を grep ESTABLISHED で絞り込む |
ss -tn state established |
| ルーティングテーブル | netstat -rn |
ip route |
| ネットワークインターフェースの統計 | netstat -i |
ip -s link |
netstat -tulnp と ss -tulnp はオプションの意味が同じで、表示する内容もほぼ同じです。ただし、-l も -a も付けないときの表示は違います。netstat -tn は TIME_WAIT なども含めた待ち受け以外の接続を表示し、ss -tn は TIME-WAIT を表示しません。列の並びや状態の名前も違うので、awk などで列を取り出すスクリプトはそのままでは流用できません。
注意点
-nを付けないと、IP アドレスやポートを名前に変換しようとして表示が遅くなることがあります。調査では-nを付けるのが基本です-pでプロセスを表示するにはsudoが必要です- コンテナの中で動いているプロセスの接続は、コンテナのネットワークの中でしか見えないことがあります。Docker では、コンテナに入って確認するか、ホストの
ssで公開ポートを確認します - 待ち受けているポートが分かったら、外部に公開する必要がないポートはファイアウォールで閉じるか、
127.0.0.1だけで待ち受けるように設定を変えます
まとめ
- 待ち受けポートとプロセスの確認は
sudo ss -tulnp - 確立済みの接続は
ss -tn state established。stateを指定するとState列が消え、接続相手は4列目になる - 集計するときは
-Hで見出しを消してからawk・sort・uniq -cで数える - 全体の集計は
ss -s netstatは net-tools パッケージを入れれば使えるが、新しく手順を作るならssとipを使う
関連記事: