サーバでどのプロセスがどのポートをリッスンしているか、まとめて確認したい場合がある。ssコマンドに-tlnpオプションを付けると、TCPのLISTEN状態のソケットをポート番号とプロセス情報つきで一覧表示できる。
ssコマンドはデフォルトで接続済みソケットを表示する
オプションなしのssは、ESTABLISHEDなどの接続済みソケットを表示対象とする。LISTEN状態のソケットは含まれないため、リッスンポートを確認する目的には向かない。
$ ss
Netid State Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
リッスン中のポートを確認するには、状態を絞り込むオプションが必要である。
-tでTCPソケットに絞る
-t(--tcp)オプションを付けると、TCPソケットだけに絞り込める。
$ ss -t
State Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
TCPソケットに絞っても、まだLISTEN状態のソケットは表示されない。
-lでLISTEN状態のソケットに絞る
-l(--listening)オプションを追加すると、LISTEN状態のソケットだけに絞り込める。
$ ss -tl
State Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
LISTEN 0 1 0.0.0.0:postgresql 0.0.0.0:*
LISTEN 0 5 0.0.0.0:http 0.0.0.0:*
リッスン中のポートが表示された。ただしLocal Address:Portのポート部分は、/etc/servicesに登録があるとpostgresqlやhttpのようにサービス名で表示される。
-nでポート番号を数値のまま表示する
-n(--numeric)オプションを付けると、サービス名への解決をスキップし、ポート番号を数値のまま表示する。
$ ss -tln
State Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
LISTEN 0 1 0.0.0.0:5432 0.0.0.0:*
LISTEN 0 5 0.0.0.0:80 0.0.0.0:*
postgresqlが5432、httpが80と数値表示に変わった。ポート番号でgrepしたい場合や、サービス名を知らないポートを確認する場合は-nを付けた方が扱いやすい。
-pでプロセス情報を表示する
-p(--processes)オプションを付けると、そのポートをリッスンしているプロセス名・PID・ファイルディスクリプタが表示される。
$ sudo ss -tlnp
State Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
LISTEN 0 1 0.0.0.0:5432 0.0.0.0:* users:(("python3",pid=3250,fd=3))
LISTEN 0 5 0.0.0.0:80 0.0.0.0:* users:(("python3",pid=3244,fd=3))
これで「どのポートを」「どのプロセスが」リッスンしているかが1コマンドで分かる。
プロセス情報の取得には権限が必要である。一般ユーザーで実行した場合、自分が所有していないプロセスの情報は空欄になる。
$ ss -tlnp
State Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
LISTEN 0 1 0.0.0.0:5432 0.0.0.0:*
LISTEN 0 5 0.0.0.0:80 0.0.0.0:*
他のユーザーが起動したプロセスの情報まで確認したい場合は、sudoを付けて実行する。
出力の見方
ss -tlnpの出力の各列は以下の通り。
| 列 | 内容 |
|---|---|
| State | ソケットの状態(LISTENなど) |
| Recv-Q | 受信キューにあるバイト数(LISTEN時はバックログのキュー長) |
| Send-Q | 送信キューにあるバイト数(LISTEN時は許容する最大バックログ数) |
| Local Address:Port | リッスンしているアドレスとポート番号 |
| Peer Address:Port | 接続先のアドレスとポート番号(LISTEN時は*) |
| Process | users:(("プロセス名",pid=PID,fd=FD))形式のプロセス情報 |
Local Address:Portが0.0.0.0の場合は全てのネットワークインターフェースで、127.0.0.1の場合はローカルホストからの接続のみでリッスンしている。
特定のポートだけ確認したい場合
ポート数が多い場合は、grepで絞り込むと見やすい。
$ sudo ss -tlnp | grep :80
LISTEN 0 5 0.0.0.0:80 0.0.0.0:* users:(("python3",pid=3244,fd=3))
UDPも含めて確認したい場合
-tの代わりに、あるいは-tと併用して-u(--udp)オプションを付けると、UDPソケットも確認対象に含められる。UDPも含めたポート確認は特定ポートの使用状況を確認する(lsof, ss, netstat)
を参照。
