Linux で netstat を使用する方法

  • netstat コマンドは、ネットワーク接続、使用中のポート、それらを使用しているプロセスに関する情報を提供します。
  • Netsat は引数を受け取り、不要な情報を除外して、探している特定の詳細のみを表示できます。
  • sudo netstat -i を実行してネットワークインターフェースを一覧表示します。

Linux の netstat コマンドは、ネットワーク接続、使用中のポート、それらを使用しているプロセスに関する膨大な情報を提供します。その使用方法を学びましょう。

ポート、プロセス、プロトコル

ネットワークソケットは、接続済みまたは接続待ちのいずれかになります。接続では、トランスポート制御プロトコル (TCP) やユーザーデータグラムプロトコル UDP などのネットワークプロトコルを使用します。インターネットプロトコルアドレスとネットワークポートを使用して接続を確立します。

ソケットという単語は、リード線やケーブルの物理的な接続ポイントを思い起こさせるかもしれませんが、このコンテキストでは、ソケットはネットワークデータ接続の片側を処理するために使用されるソフトウェア構造です。

ソケットには 2 つの主要な状態があります。接続されて進行中のネットワーク通信を促進しているか、着信接続を待機して接続しています。リモートデバイスで接続を確立している途中の状態など、他の状態もありますが、一時的な状態は別として、ソケットは接続されているか待機している (多くの場合、リスニングと呼ばれます) と考えることができます。

リスニングソケットはサーバーと呼ばれ、リスニングソケットとの接続を要求するソケットはクライアントと呼ばれます。これらの名前は、ハードウェアやコンピューターの役割とは関係ありません。接続の各端にある各ソケットの役割を定義するだけです。

netstat コマンドを使用すると、どのソケットが接続され、どのソケットがリスニングしているかを調べることができます。つまり、どのポートが使用中で、どのプロセスがそれらを使用しているかがわかります。ルーティングテーブルとネットワークインターフェースやマルチキャスト接続に関する統計情報を表示できます。

netstat の機能は、時間の経過とともに ip や ss などのさまざまな Linux ユーティリティで複製されてきました。すべてのネットワーク分析コマンドの祖先であるこのコマンドは、すべての Linux および Unix 系オペレーティングシステム、さらには Windows や Mac でも使用できるため、知っておく価値があります。

例のコマンドとともに、その使用方法を次に示します。

netstat を使用してすべてのソケットを一覧表示する

-a (すべて) オプションを指定すると、netstat は接続済みソケットと待機ソケットのすべてを表示します。このコマンドは長いリストを作成する可能性があるため、less にパイプします。

netstat -a | less

リストには、TCP (IP)、TCP6 (IPv6)、UDP ソケットが含まれます。

ターミナルウィンドウの折り返しにより、何が起こっているのかがわかりにくくなっています。そのリストからいくつかのセクションを次に示します。

アクティブなインターネット接続 (サーバーと確立済み)

プロト

受信キュー

送信キュー

ローカルアドレス

外部アドレス

状態

TCP

0

0

localhost: ドメイン

0.0.0.0:*

LISTEN

TCP

0

0

0.0.0.0:ssh

0.0.0.0:*

LISTEN

TCP

0

0

localhost:ipp

0.0.0.0:*

LISTEN

TCP

0

0

localhost:smtp

0.0.0.0:*

LISTEN

TCP6

0

0

[::]:ssh

[::]:*

LISTEN

TCP6

0

0

ip6-localhost:ipp

[::]:*

LISTEN

アクティブな UNIX ドメインソケット (サーバーと確立済み)

プロト

参照カウント

フラグ

タイプ

状態

I-ノード

パス

unix

24

[ ]

DGRAM

12831

/run/systemd/journal/dev-log

unix

2

[ ACC ]

STREAM

LISTENING

24747

@/tmp/dbus-zH6clYmvw8

unix

2

[ ]

DGRAM

26372

/run/user/1000/system/notify

unix

2

[ ]

DGRAM

23382

/run/user/121/system/notify

unix

2

[ ACC ]

SEQPACKET

LISTENING

12839

/run/udev/control

「アクティブなインターネット」セクションには、接続された外部接続とリモート接続要求を待機しているローカルソケットが一覧表示されます。つまり、外部デバイスに確立されている (または確立される) ネットワーク接続が一覧表示されます。

「UNIX ドメイン」セクションには、接続済みおよびリスニング中の内部接続が一覧表示されます。言い換えると、コンピューター内にあるさまざまなアプリケーション、プロセス、オペレーティングシステムの要素間で確立された接続が一覧表示されます。

「アクティブなインターネット」列は次のとおりです。

  • プロト:このソケットで使用されるプロトコル (TCP または UDP など)。
  • 受信キュー:受信キュー。これらは受信され、バッファリングされた着信バイトであり、この接続を使用しているローカルプロセスが読み取って消費するのを待っています。
  • 送信キュー:送信キュー。これは、送信キューから送信できるバイトを示しています。
  • ローカルアドレス:接続のローカル側のアドレスの詳細。デフォルトでは、netstat はアドレスのローカルホスト名とポートのサービス名を表示します。
  • 外部アドレス:接続のリモート側のアドレスとポート番号。
  • 状態:ローカルソケットの状態。UDP ソケットの場合、これは通常空白です。以下の状態表を参照してください。

TCP 接続の場合、状態値は次のいずれかになります。

  • LISTEN:サーバー側のみ。ソケットは接続要求を待機しています。
  • SYN-SENT:クライアント側のみ。このソケットは接続要求を行い、それが承認されるかどうかを待機しています。
  • SYN-RECEIVED:サーバー側のみ。このソケットは接続要求を承認した後に接続確認を待機しています。
  • ESTABLISHED:サーバーとクライアント。サーバーとクライアントの間に正常に接続が確立されており、2 つの間でデータを転送できます。
  • FIN-WAIT-1:サーバーとクライアント。このソケットはリモートソケットからの接続終了要求、またはこのソケットから以前に送信された接続終了要求の確認を待機しています。
  • FIN-WAIT-2:サーバーとクライアント。このソケットはリモートソケットからの接続終了要求を待機しています。
  • CLOSE-WAIT:サーバーとクライアント。このソケットはローカルユーザーからの接続終了要求を待機しています。
  • CLOSING:サーバーとクライアント。このソケットはリモートソケットからの接続終了要求の確認を待機しています。
  • LAST-ACK:サーバーとクライアント。このソケットはリモートソケットに送信した接続終了要求の確認を待機しています。
  • TIME-WAIT:サーバーとクライアント。このソケットはリモートソケットにリモートソケットの終了要求を受信したことを知らせるために確認を送信しました。現在は、確認が受信されたことを確認するために待機しています。
  • CLOSED:接続がないため、ソケットが終了しました。

「Unix ドメイン」列は次のとおりです。

  • プロト:このソケットで使用されるプロトコル。これは「unix」になります。
  • 参照カウント:このソケットに接続された添付プロセスの数。
  • フラグ:通常は SO_ACCEPTON を表す ACC に設定され、ソケットが接続要求を待機していることを意味します。W として表示される SO_WAITDATA は、読み取りを待機しているデータがあることを意味します。N として表示される SO_NOSPACE は、ソケットにデータを書き込むためのスペースがないことを意味します (つまり、送信バッファがいっぱいです).
  • タイプ:ソケットタイプ。以下のタイプ表を参照してください。
  • 状態:ソケットの状態。以下の状態表を参照してください。
  • I-ノード:このソケットに関連付けられたファイルシステムの I ノード。
  • パス:ソケットへのファイルシステムのパス。

Unix ドメインソケットのタイプは次のいずれかになります。

  • DGRAM:ソケットはデータグラムモードで使用されており、固定長のメッセージを使用しています。データグラムは、信頼性、シーケンス、重複なしのいずれも保証されません。
  • STREAM:このソケットはストリームソケットです。これは一般的な「通常の」タイプのソケット接続です。これらのソケットは、信頼性のあるシーケンス (順序どおり) のパケット配信を提供するように設計されています。
  • RAW:このソケットは、ローソケットとして使用されています。ローソケットは OSI モデルのネットワークレベルで動作し、トランスポートレベルの TCP および UDP ヘッダーを参照しません。
  • RDM:このソケットは、確実に配信されたメッセージ接続の片側にあります。
  • SEQPACKET:このソケットは、シーケンシャルパケットソケットとして動作しています。これは、信頼性、シーケンス、重複なしのパケット配信を提供するもう 1 つの手段です。
  • PACKET:ローインターフェイスアクセスソケット。パケットソケットは、OSI モデルのデバイスドライバ (つまり、データリンク層) レベルでローパケットを受信または送信するために使用されます。

Unix ドメインソケットの状態は、次のいずれかになります。

  • FREE:このソケットは未割り当てです。
  • LISTENING:このソケットは着信接続要求を待機しています。
  • CONNECTING:このソケットは接続中です。
  • CONNECTED:接続が確立され、ソケットはデータを受信および送信できます。
  • DISCONNECTING:接続は終了処理中です。

わあ、なんてたくさんの情報でしょう!netstat オプションの多くは、何らかの方法で結果を絞り込みますが、コンテンツをあまりにも多く変更することはありません。見てみましょう。

netstat コマンドを使用してタイプ別にソケットを一覧表示する

netstat -a コマンドは、必要な情報よりも多くの情報を提供する可能性があります。TCP ソケットのみを表示する必要がある場合、または表示する必要がある場合は、-t (TCP) オプションを使用して、TCP ソケットのみを表示するように表示を制限できます。

netstat -at | less

表示は大幅に削減されます。リストされているソケットはすべて TCP ソケットです。

-u (UDP) オプションと -x (UNIX) オプションは同様の動作をし、結果をコマンドラインで指定されたソケットのタイプに制限します。使用中の -u (UDP) オプションを次に示します。

netstat -au | less

UDP ソケットのみがリストされます。

状態別にソケットを一覧表示する

リスニングまたは待機状態にあるソケットを表示するには、-l (リスニング) オプションを使用します。

netstat -l | less

リストされているソケットはリスニング状態にあるソケットです。

これは、-t (TCP、-u (UDP)、および -x (UNIX) オプションと組み合わせて、対象のソケットをさらに絞り込むことができます。リスニング TCP ソケットを探してみましょう。

netstat -lt | less

これで、TCP リスニングソケットのみが表示されます。

プロトコル別のネットワーク統計

プロトコルの統計を表示するには、-s (統計) オプションを使用して、-t (TCP)、-u (UDP)、または -x (UNIX) オプションを渡します。-s (統計) オプションのみを単独で使用すると、すべてのプロトコルの統計が表示されます。TCP プロトコルの統計を確認してみましょう。

netstat -st | less

TCP 接続の統計情報のコレクションが less に表示されます。

プロセス名と PID の表示

ソケットを使用しているプロセスのプロセス ID (PID) と、そのプロセスの名前を一緒に表示すると便利です。-p (プログラム) オプションはまさにそれを行います。リスニング状態にある TCP ソケットを使用しているプロセスの PID とプロセス名を確認してみましょう。sudo を使用して、通常は root 権限を必要とする情報を含む、使用可能なすべての情報を受信するようにします。

sudo netstat -p -at

フォーマットされた表でその出力を示します。

アクティブなインターネット接続 (サーバーと確立済み)

プロト

受信キュー

送信キュー

ローカルアドレス

外部アドレス

状態

PID/プログラム名

tcp

0

0

localhost: ドメイン

0.0.0.0:*

LISTEN

6927/systemd-resolv

tcp

0

0

0.0.0.0:ssh

0.0.0.0:*

LISTEN

751/sshd

tcp

0

0

localhost:ipp

0.0.0.0:*

LISTEN

7687/cupsd

tcp

0

0

localhost:smtp

0.0.0.0:*

LISTEN

1176/master

tcp6

0

0

[::]:ssh

[::]:*

LISTEN

751/sshd

tcp6

0

0

ip6-localhost:ipp

[::]:*

LISTEN

7687/cupsd

tcp6

0

0

ip6-localhost:smtp

[::]:*

LISTEN

1176/master

「PID/プログラム名」という追加の列があります。この列には、各ソケットを使用しているプロセスの PID と名前が一覧表示されています。

数値アドレスを一覧表示する

曖昧さを解消するためにできるもう 1 つの方法は、ローカルアドレスとリモートアドレスを解決されたドメインとホスト名ではなく、IP アドレスとして表示することです。-n (数値) オプションを使用すると、IPv4 アドレスはドット付き 10 進表記で表示されます。

sudo netstat -an | less

IP アドレスは数値として表示されます。ポート番号も表示され、IP アドレスからコロン「:」で区切られます。

127.0.0.1 の IP アドレスは、ソケットがローカルコンピュータのループバックアドレスにバインドされていることを示しています。0.0.0.0 の IP アドレスは、ローカルアドレスの「デフォルトルート」、外部アドレスの「任意の IP アドレス」を意味すると考えることができます。「::」と表示される IPv6 アドレスもすべてゼロアドレスです。

リストされているポートは、簡単に確認して通常の目的を確認できます。

  • 22:これはセキュアシェル (SSH) リスニングポートです。
  • 25:これは簡易メール転送プロトコル (SMTP) リスニングポートです。
  • 53:これはドメインネームシステム (DNS) リスニングポートです。
  • 68:これは動的ホスト構成プロトコル (DHCP) リスニングポートです。
  • 631:これは Common UNIX Printing System (CUPS) リスニングポートです。

ルーティングテーブルの表示

-r (ルート) オプションは、カーネルルーティングテーブルを表示します。

sudo netstat -r

きれいに整えられた表でその出力を示します。

カーネル IP ルーティングテーブル

宛先

ゲートウェイ

Genmask

フラグ

MSS

ウィンドウ

irtt

Iface

default

Vigor.router

0.0.0.0

UG

0

0

0

enp0s3

link-local

0.0.0.0

255.255.0.0

U

0

0

0

enp0s3

192.168.4.0

0.0.0.0

255.255.255.0

U

0

0

0

enp0s3

列の意味を次に示します。

  • 宛先:宛先ネットワークまたは宛先ホストデバイス (宛先がネットワークでない場合)。
  • ゲートウェイ:ゲートウェイアドレス。ゲートウェイアドレスが設定されていない場合は、アスタリスク「*」が表示されます。
  • Genmask:ルートのサブネットマスク。
  • フラグ:以下のフラグ表を参照してください。
  • MSS:このルートを介した TCP 接続のデフォルトの最大セグメントサイズ。これは、1 つの TCP セグメントで受信できるデータの最大量です。
  • ウィンドウ:このルートを介した TCP 接続のデフォルトのウィンドウサイズ。受信バッファがいっぱいになる前に転送および受信できるパケットの数を示します。実際には、パケットは受信アプリケーションによって消費されます。
  • irtt:初期ラウンドトリップタイム。この値は、応答が遅いリモート接続の TCP パラメータを動的に調整するためにカーネルによって参照されます。
  • Iface:このルートを介して送信されるパケットが送信されるネットワークインターフェース。

フラグの値は次のいずれかになります。

  • U:ルートは稼働中です。
  • H:ターゲットはホストであり、このルートで可能な唯一の宛先です。
  • G:ゲートウェイを使用します。
  • R:動的ルーティングのルートを再設定します。
  • D:ルーティングデーモンによって動的にインストールされました。
  • M:ルーティングデーモンがインターネット制御メッセージプロトコル (ICMP) パケットを受信したときに変更されました。
  • A:addrconfによってインストールされました。これは、自動化された DNS および DHCP 設定ファイルジェネレータです。
  • C:キャッシュエントリ。
  • !:ルートを拒否します。

プロセスによって使用されているポートを見つける

netstat の出力を grep にパイプすると、名前でプロセスを検索して、使用されているポートを特定できます。以前に使用した -a (すべて)、-n (数値)、-p (プログラム) オプションを使用し、「sshd」を検索します。

sudo netstat -anp | grep "sshd"

grep がターゲット文字列を見つけると、sshd デーモンがポート 22 を使用していることがわかります。

もちろん、逆に行うこともできます。":22" を検索すると、そのポートを使用しているプロセス (存在する場合) を見つけることができます。

sudo netstat -anp | grep ":22"

今回は grep が ":22" ターゲット文字列を見つけ、このポートを使用しているプロセスが sshd デーモン、プロセス ID 751 であることがわかります。

ネットワークインターフェースを一覧表示する

-i (インターフェース) オプションは、netstat が検出できるネットワークインターフェースの表を表示します。

sudo netstat -i

より読みやすい形式で出力を示します。

カーネルインターフェーステーブル

Iface

MTU

RX-OK

RX-ERR

RX-DRP

RX-OVR

TX-OK

TX-ERR

TX-DRP

TX-OVR

Flg

enp0s3

1500

4520671

0

0

0

4779773

0

0

0

BMRU

lo

65536

30175

0

0

0

30175

0

0

0

LRU

列の意味を次に示します。

  • Iface:インターフェースの名前。enp0s3 インターフェースは外部世界へのネットワークインターフェースであり、lo インターフェースはループバックインターフェースです。ループバックインターフェースにより、コンピュータがネットワークに接続されていなくても、プロセスはネットワークプロトコルを使用してコンピュータ内で相互に通信できるようになります。
  • MTU:最大伝送単位 (MTU)。送信できる最大の「パケット」です。ルーティングフラグとプロトコルフラグを含むヘッダー、その他のメタデータ、および実際に転送されているデータで構成されます。
  • RX-OK:エラーなしで受信したパケット数。
  • RX-ERR:エラーが発生して受信したパケット数。これは可能な限り低くする必要があります。
  • RX-DRP:ドロップ (つまり、失われた) パケットの数。これも可能な限り低くする必要があります。
  • RX-OVR:受信時にオーバーフローにより失われたパケットの数。これは通常、受信バッファがいっぱいになってこれ以上データを受け入れることができなかったが、さらに多くのデータを受信して破棄する必要があったことを意味します。この数値が低いほど良く、ゼロが完璧です。
  • TX-OK:エラーなしで送信されたパケット数。
  • RX-ERR:エラーが発生して送信されたパケット数。これはゼロにする必要があります。
  • RX-DRP:送信中にドロップされたパケット数。理想的には、これはゼロである必要があります。
  • RX-OVR:送信時にオーバーフローにより失われたパケットの数。これは通常、送信バッファがいっぱいになってこれ以上データを受け入れることができなかったが、さらに多くのデータが送信される準備ができていて破棄する必要があったことを意味します。
  • Flg:フラグ。以下のフラグ表を参照してください。

フラグは次のものを表します。

  • B:ブロードキャストアドレスが使用されています。
  • L:このインターフェースはループバックデバイスです。
  • M:すべてのパケットが受信されています (つまり、プロミスキャスモードで)。何もフィルタリングまたは破棄されていません。
  • O:このインターフェースのアドレス解決プロトコル (ARP) はオフになっています。
  • P:これはポイントツーポイント (PPP) 接続です。
  • R:インターフェースが実行されています。
  • U:インターフェースが稼働中です。

マルチキャストグループメンバーシップを一覧表示する

簡単に言うと、マルチキャスト伝送により、受信者の数に関係なく、パケットを 1 回だけ送信できるようになります。たとえば、ビデオストリーミングなどのサービスの場合、これにより送信者の観点から効率が大幅に向上します。

-g (グループ) オプションにより、netstat は各インターフェース上のソケットのマルチキャストグループメンバーシップを一覧表示します。

sudo netstat -g

列は非常にシンプルです。

  • インターフェース:ソケットが送信しているインターフェースの名前。
  • RefCnt:参照カウント。これは、ソケットに接続されているプロセスの数です。
  • グループ:マルチキャストグループの名前または識別子。

ブロックの新しい子供たち

route、ip、ifconfig、および ss コマンドは、netstat で表示できるものの多くを提供できます。それらはすべて素晴らしいコマンドであり、チェックする価値があります。

netstat に注目したのは、使用している Unix 系オペレーティングシステムに関係なく、たとえあいまいなものであっても、どこでも使用できるからです。