netstatコマンドはRHEL 7などで非推奨となり、代替コマンドが用意されています。ただし、ssコマンドはまだ不十分な点が多いとの報告もあるため、個別にnetstatコマンドを導入して利用する方が利便性が高い場合も少なくないようです。
本連載では、ネットワーク管理の基本コマンドを順を追って紹介していきます。基本書式と用法、主要なオプション、用例サンプルを示しますので、manやhelp代わりに通読し、各コマンドでできることを順次おさらいしてみてください。今回は、ネットワークに関する情報を取得する際によく用いられる「netstat」コマンドです。
CentOS 7およびRed Hat Enterprise Linux(RHEL) 7以降、ネットワークに関連した一部のコマンドは非推奨となり、デフォルトではインストールされなくなりました。netstatコマンドも非推奨となりましたが、代替の「ss」コマンドは挙動が異なる点が多い上に、不具合も報告されており、netstatコマンドを必要とする場面は多そうです。
デフォルトインストールされない場合は、明示的に導入する必要があります。RHEL環境であればnet-toolsパッケージからyumコマンドで導入します。
# yum install net-tools
netstatコマンドの概要 | 書式 | 書式解説 | オプション一覧
「ネットワーク・コマンドでトラブル解決(5):ホストのネット接続は正しく行われているか〜netstatによるネットワーク設定の確認〜」
「現場から学ぶWebアプリ開発のトラブルハック(7):【トラブル大捜査線】失われたコネクションを追え!」
名称の由来とされる「Network statistics」の意味の通り、ネットワーク接続やルーティングの状況、ネットワークインターフェース(NIC)の状態を報告するコマンドです。Linuxの場合、現在は非推奨扱いとされている「net-tools」に収録されているため、利用するディストリビューションによっては同パッケージの追加インストールが必要になります。
netstatコマンドは、TCPおよびUDPプロトコルを対象に統計情報を表示します。TCPソケットを表示する「-t」、UDPソケットを表示する「-u」オプションと、多数用意されているオプションを組み合わせることが基本的な書式となります。不要なポートを絞り込みセキュリティを高めたい、管理しているサーバーにTIME_WAITやCLOSE_WAITのソケットが多く残るので原因を調べたい、といった場面で利用されます。
オプション | 意味 |
---|---|
-A | 接続状態を表示するアドレスファミリを指定する |
-I | 指定したNICの情報のみ表示する(ex. -Ieth0) |
-a | 全てのアクティブなソケットを表示する |
-c | 1秒ごとに更新しつつ表示する |
-e | 詳細情報を表示する |
-g | IPv4とIPv6のマルチキャストグループメンバーシップ情報を表示する |
-i | 全てのNICの状態テーブルを表示する |
-l | 接続待ち(LISTEN)状態にあるソケットのみ表示する |
-n | ホストやユーザーの名前解決を行わず数字のまま出力する |
-o | ネットワーキングタイマーの情報を出力する |
-p | ソケットが属すプログラムのPIDとプロセス名を表示する |
-r | ルーティングテーブルを表示する |
-s | 各プロトコルの統計情報を表示する |
-t | TCPソケットを表示する |
-u | UDPソケットを表示する |
-v | 詳細な情報を表示する |
上記、コマンドオプションのうち、「-i」オプションでは、インターフェースの状態を示す記号と数値の組み合わせで状態が返されます。下記の表はそれぞれの意味一覧です。
記号 | 意味 |
---|---|
Iface | 対象となるネットワークインタフェース名 |
MTU | MTU値 |
RX-OK | 正常に受信したパケットの数 |
RX-ERR | 受信時にエラーとなったパケットの数 |
RX-DRP | 受信時に破棄したパケットの数 |
RX-OVR | 受信時にオーバーロードしたパケットの数 |
TX-OK | 正常に送信できたパケットの数 |
TX-ERR | 送信時にエラーとなったパケットの数 |
TX-DRP | 送信時に破棄したパケットの数 |
TX-OVR | 送信時にオーバーロードしたパケットの数 |
Flg | フラグ |
TCPプロトコルで通信を行う単位(ソケット)は、いくつかの通信の状態が存在します。そのうち待ち受け状態のソケット(LISTEN)を調べる場合は、オプションに「l」とTCPプロトコルに絞り込む「t」の2つを指定します。
$ netstat -lt Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 localhost:smtp 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:36287 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:sunrpc 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 tcp6 0 0 localhost:smtp [::]:* LISTEN tcp6 0 0 [::]:53319 [::]:* LISTEN tcp6 0 0 [::]:sunrpc [::]:* LISTEN tcp6 0 0 [::]:ssh [::]:* LISTEN tcp6 0 0 localhost:ipp [::]:* LISTEN
サーバーに複数のNICが搭載されている場合、「-i」オプションを指定するとNICごとの通信状況を集計できます(オプション一覧を参照)。特定のNICのみ表示する場合は「-I」オプションを利用し、「-Ieth0」(デバイス名「eth0」)の要領で指定します。
$ netstat -Ieth0 Kernel Interface table Iface MTU RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg eth0 1500 106980 0 0 0 44130 0 0 0 BMRU
netstatコマンドに「-p」オプションを付けて実行すると、各ソケットを利用しているプログラムのプロセスIDを表示できます。多数のプロセス/サービスが稼働しているサーバーを対象にする場合は、grepにパイプすれば表示するソケットを絞り込むことができます。
以下の実行例では、名称に「printer」(大文字/小文字を区別しない)を含むプロセスのみ表示しています。
$ netstat -p | grep -i printer unix 3 [ ] STREAM CONNECTED 25854 2915/gsd-printer unix 3 [ ] STREAM CONNECTED 25860 2915/gsd-printer
Copyright © ITmedia, Inc. All Rights Reserved.