ssとnetstatは、ネットワークのポートや接続の状態を確認するコマンドです。「どのポートで、どのプログラムが待ち受けているか」「今どこと接続しているか」を調べられます。「ポートが既に使われている(Address already in use)」というエラーの原因調査や、サーバーが正しくポートを開いているかの確認に欠かせません。
重要な前提として、現在はnetstatは非推奨(deprecated)となり、後継のssが標準になっています。実際、最近のLinuxにはnetstatが最初から入っていないことも珍しくありません(当記事の検証環境にもnetstatは入っておらず、ssのみでした)。この記事では、実機のLinux(WSLのDebian)で実際にポートを開いてssで検出しながら、ポート・接続確認の基本と、netstatからの移行方法を整理します。
ss -tlnpが最頻出。リッスン中のTCPポートとプロセスを一覧します。- オプション:
-t=TCP・-u=UDP・-l=待ち受け中・-n=数値表示・-p=プロセス・-a=全状態。 - 特定ポートは
ss -tlnp | grep :ポート番号で絞り込めます。 - 確立済みの接続は
ss -tn state establishedで確認できます。 - 現在は
netstatは非推奨で、ssが標準です(netstatが無い環境も多い)。 - プロセス名まで見るにはroot権限(
sudo)が必要なことがあります。
ポートを使うプロセスの操作はps・kill、疎通確認はping、HTTP確認はcurlもあわせて参考になります。
ssの基本:リッスン中のポートを調べる
最もよく使うのがss -tlnpです。今どのポートでプログラムが待ち受けている(LISTEN)かを、プロセス名とともに一覧します。サーバーが正しく起動してポートを開いているかの確認に、まずこれを使います。
# リッスン中のTCPポートとプロセスを一覧
ss -tlnp
# LISTEN 0 1 127.0.0.1:18080 0.0.0.0:* users:(("nc",pid=85,fd=3))
# ↑状態 ↑待ち受けアドレス:ポート ↑プロセス名とPID
# オプションの意味:
# -t = TCP
# -l = LISTEN(待ち受け中)だけ
# -n = 名前解決せず数値のまま(速い・見やすい)
# -p = プロセス名・PIDを表示(要権限)
実機で、テスト用にポート18080を開いてss -tlnpを実行したところ、LISTEN ... 127.0.0.1:18080 ... users:(("nc",pid=85,fd=3))と表示され、「18080番ポートを、ncというプロセス(PID 85)が待ち受けている」ことが正確に分かりました。待ち受けアドレスが127.0.0.1(localhost)なら自分のマシンからのみ、0.0.0.0なら外部からも接続可能という違いも読み取れます。-pでプロセス名まで見るにはroot権限が必要な場合があるため、他人のプロセスも含めて見たいときはsudo ss -tlnpとします。
オプションの組み合わせ(-t / -u / -l / -n / -a)
ssのオプションは組み合わせて使います。-t(TCP)・-u(UDP)・-l(LISTEN中のみ)・-n(数値表示)・-a(全状態)を目的に応じて選びます。
# TCP と UDP 両方のリッスンポート(数値表示) ss -tuln # 待ち受け中も接続中も、すべての状態を表示 ss -tan # -a で全状態、-n で数値 # UDP のリッスンポートだけ ss -uln # サマリー統計(接続数の概要) ss -s # Total: 87 # TCP: 2 (estab 0, closed 1, ...)
実機でも、ss -tulnでTCP/UDP両方のリッスンポートが数値表示され、ss -sで接続数のサマリー(Total 87、TCP estab 0など)が確認できました。-n(数値表示)を付けると、ポート番号をhttpやsshといった名前に変換せず、そのまま数字で表示します。名前解決の待ち時間が無く速いうえ、「実際のポート番号」がそのまま見えるので、トラブル調査では-nを付けるのが定番です。「-tuln(TCP/UDP・LISTEN・数値)」と「-tlnp(TCP・LISTEN・数値・プロセス)」の2つを覚えておけば、日常の確認はほぼ足ります。
特定ポート・確立済み接続を確認する
「特定のポートが使われているか」を調べるにはgrepで絞り込むのが手軽です。また、今どこと通信しているか(確立済みの接続)はstate establishedで確認できます。
# 特定ポート(例:80)が使われているか ss -tlnp | grep :80 # ポート番号でフィルタ(ss の構文) ss -tln '( sport = :18080 )' # 今「確立している」接続を確認 ss -tn state established # 127.0.0.1:18080 127.0.0.1:48162 ← サーバー側 # 127.0.0.1:48162 127.0.0.1:18080 ← クライアント側 # 「ポートが使用中」エラーの原因調査 ss -tlnp | grep :3000 # 3000番を誰が掴んでいるか
実機で、ポート18080のサーバーに実際に接続してからss -tn state establishedを実行したところ、127.0.0.1:18080 ↔ 127.0.0.1:48162という確立済みの接続が、サーバー側・クライアント側の両方向で表示されました。ssの便利さが最も光るのが、「Address already in use(ポートが既に使われている)」エラーの原因調査です。開発サーバーを起動しようとして「3000番が使用中」と言われたとき、ss -tlnp | grep :3000を実行すれば、そのポートを掴んでいるプロセスの名前とPIDが判明します。あとはkillでそのプロセスを終了すれば、ポートを解放できます。「ポートが使えない→ssで犯人特定→killで解放」という流れは、開発者が頻繁に使う実務パターンです。-pでプロセスが表示されないときはsudoを付けてください。
【重要】netstatは非推奨、ssが標準
昔はnetstatが定番でしたが、現在は非推奨(deprecated)となり、後継のssが標準です。ssはより高速で情報も豊富で、最近のLinuxディストリビューションではそもそもnetstatが入っていないことも増えています。
# 昔の netstat → 今の ss # リッスン中のポート一覧 netstat -tlnp → ss -tlnp # 全接続の表示 netstat -an → ss -an # 統計サマリー netstat -s → ss -s # netstat は net-tools パッケージ。無ければ: # Debian/Ubuntu: apt install net-tools # ただし新規に覚えるなら ss を使うのが推奨
実機の検証環境でも、netstatコマンドは最初から入っておらず、ssだけが利用可能でした。これはnetstatが非推奨になった流れを象徴しています。netstatのオプションはssとほぼ対応しており、netstat -tlnpはそのままss -tlnpに置き換えられます。古い記事や書籍ではnetstatが使われていますが、これから覚えるならssにしておくのが確実です。どうしてもnetstatが必要な場合はnet-toolsパッケージで導入できますが、多くの場面でssが代替になります。
接続状態(State)の読み方
ssのState列には、接続の状態が表示されます。主なものを知っておくと、通信の状況を正しく読み取れます。
| 状態 | 意味 |
|---|---|
LISTEN |
接続を待ち受けている(サーバー側) |
ESTABLISHED |
接続が確立し通信中 |
TIME-WAIT |
接続終了後の待機(すぐ消える) |
CLOSE-WAIT |
相手が切断、こちらの終了待ち |
SYN-SENT |
接続を試みている途中 |
LISTENは「サーバーが待ち受けている」正常な状態、ESTABLISHEDは「通信中」です。TIME-WAITが大量にあるのは通常正常な挙動ですが、CLOSE-WAITが大量に溜まっている場合はアプリケーションが接続を正しく閉じていない可能性があります。
よくある失敗
netstatが無いと言われる
非推奨のため入っていないことが増えています。ssを使うかnet-toolsを導入します。
プロセス名が表示されない
他人のプロセスを見るにはroot権限が必要です。sudo ss -tlnpを使います。
ポート番号がサービス名で表示されて分かりにくい
-nを付けると数値のまま表示され、実際のポート番号が分かります。
ポート使用中の原因が分からない
ss -tlnp | grep :ポートで掴んでいるプロセスを特定し、killします。
LISTENが見えず接続できない
サーバーが127.0.0.1のみで待ち受けていると外部から繋がりません。待ち受けアドレスを確認します。
よくある質問
ss -tlnpが定番です。リッスン中(待ち受け中)のTCPポートと、それを使っているプロセス名・PIDが一覧表示されます。特定のポートだけ見たいならss -tlnp | grep :80のようにgrepで絞り込みます。実機でも、開いたポートとプロセスが正しく検出できることを確認しています。ssが推奨されます。netstatは非推奨(deprecated)となり、最近のLinuxには最初から入っていないことも増えています(実機の検証環境にもnetstatは無く、ssのみでした)。ssのほうが高速で情報も豊富です。netstat -tlnpはss -tlnpにそのまま置き換えられます。ss -tlnp | grep :ポート番号で、そのポートを使っているプロセスの名前とPIDを特定できます。たとえば3000番ならss -tlnp | grep :3000です。判明したプロセスをkillで終了すれば、ポートを解放できます。プロセスが表示されない場合はsudoを付けてください。-tがTCP、-uがUDP、-lがLISTEN(待ち受け中)のみ、-nが名前解決せず数値表示、-pがプロセス表示、-aが全状態です。最頻出はss -tlnp(TCP・LISTEN・数値・プロセス)とss -tuln(TCP/UDP・LISTEN・数値)の2つです。ss -tn state establishedで、確立済み(ESTABLISHED)の接続を確認できます。ローカルとリモートのアドレス・ポートが表示されます。実機でも、実際に接続を張った状態で、サーバー側とクライアント側の両方向の接続が表示されることを確認しています。まとめ
ss -tlnpでリッスン中のポートとプロセスを一覧(最頻出)。- オプションは
-t(TCP)・-u(UDP)・-l(LISTEN)・-n(数値)・-p(プロセス)・-a(全状態)。 - 特定ポートは
grepで絞り込み、「ポート使用中」の犯人を特定できます。 - 確立済み接続は
ss -tn state established。 netstatは非推奨、これからはssが標準です。
ssは、ネットワークの「今の状態」を映し出す道具です。「ポートが使えない」「サーバーに繋がらない」といったトラブルで、ss -tlnpを打てば原因の多くが見えてきます。ping(疎通)・dig(名前解決)・ss(ポート・接続)を使い分ければ、ネットワークトラブルの切り分けが的確にできるようになります。
- grep(文字列検索)
- find(ファイル検索)
- sed(置換・行編集)
- awk(列抽出・集計)
- cut(列の切り出し)
- chmod(パーミッション)
- tar(圧縮・解凍)
- リダイレクトとパイプ
- echo・printf(文字列出力)
- ps・kill(プロセス管理)
- 環境変数とPATH
- which・type(コマンドの正体)
- ln(シンボリックリンク)
- cp・mv・rm(コピー/移動/削除)
- touch・mkdir(ファイル/フォルダ作成)
- basename・dirname(パス分解)
- history(コマンド履歴)
- curl(HTTP通信・API)
- ping(疎通確認)
- dig・nslookup(DNS調査)
- ss・netstat(ポート確認)
- jq(JSON処理)
- vim(基本操作・終了方法)
- cron・crontab(定期実行)
- test・[ ](条件判定)
- read(入力の読み取り)
- date(日付・時刻)
- sort・uniq・wc(並べ替え/集計)
- xargs(一括処理)
- chown・chgrp(所有者/グループ変更)
- diff(ファイル比較)
- du・df(ディスク使用量)
- head・tail(先頭/末尾・ログ監視)
- cat・less(ファイル表示)
- alias(コマンドの別名)
- nohup(SSH切断対策)
- tmux(セッション管理)
- よく使うコマンドまとめ
- cd(ディレクトリ移動)
