【Linux】ss・netstatでポートと接続を確認する方法|-tlnpでLISTEN確認・netstatは非推奨

【Linux】ss・netstatでポートと接続を確認する方法|-tlnpでLISTEN確認・netstatは非推奨 Linux

ssnetstatは、ネットワークのポートや接続の状態を確認するコマンドです。「どのポートで、どのプログラムが待ち受けているか」「今どこと接続しているか」を調べられます。「ポートが既に使われている(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)かを、プロセス名とともに一覧します。サーバーが正しく起動してポートを開いているかの確認に、まずこれを使います。

ss -tlnp の基本
# リッスン中の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 -tulnTCP/UDP両方のリッスンポートが数値表示され、ss -s接続数のサマリー(Total 87、TCP estab 0など)が確認できました。-n(数値表示)を付けると、ポート番号をhttpsshといった名前に変換せず、そのまま数字で表示します。名前解決の待ち時間が無く速いうえ、「実際のポート番号」がそのまま見えるので、トラブル調査では-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 → 今の 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)の読み方

ssState列には、接続の状態が表示されます。主なものを知っておくと、通信の状況を正しく読み取れます。

状態 意味
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のみで待ち受けていると外部から繋がりません。待ち受けアドレスを確認します。

よくある質問

Qどのポートが使われているか調べるには?
Ass -tlnpが定番です。リッスン中(待ち受け中)のTCPポートと、それを使っているプロセス名・PIDが一覧表示されます。特定のポートだけ見たいならss -tlnp | grep :80のようにgrepで絞り込みます。実機でも、開いたポートとプロセスが正しく検出できることを確認しています。
Qnetstatとssはどちらを使うべきですか?
A現在はssが推奨されます。netstatは非推奨(deprecated)となり、最近のLinuxには最初から入っていないことも増えています(実機の検証環境にもnetstatは無く、ssのみでした)。ssのほうが高速で情報も豊富です。netstat -tlnpss -tlnpにそのまま置き換えられます。
Q「Address already in use」の原因を調べるには?
Ass -tlnp | grep :ポート番号で、そのポートを使っているプロセスの名前とPIDを特定できます。たとえば3000番ならss -tlnp | grep :3000です。判明したプロセスをkillで終了すれば、ポートを解放できます。プロセスが表示されない場合はsudoを付けてください。
Qssのオプションの意味を教えてください。
A-tがTCP、-uがUDP、-lがLISTEN(待ち受け中)のみ、-nが名前解決せず数値表示、-pがプロセス表示、-aが全状態です。最頻出はss -tlnp(TCP・LISTEN・数値・プロセス)とss -tuln(TCP/UDP・LISTEN・数値)の2つです。
Q今どこと接続しているか確認するには?
Ass -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(ポート・接続)を使い分ければ、ネットワークトラブルの切り分けが的確にできるようになります。