UNIX/Linuxの部屋 netstatコマンドの使い方

TOP UNIX/Linuxの部屋 UNIX/Linuxコマンド一覧 用語集 新版 由来/読み方辞書 環境変数マニュアル Cシェル変数 システム設定ファイル システムコール・ライブラリ ネットワークプログラミングの基礎知識 クラウドサービス徹底比較・徹底解説




コマンド netstat ネットワークの使用状況を表示 このエントリーをはてなブックマークに追加

UNIX/Linux の netstat は、ネットワークインタフェース・ポート等の接続状況を表示ためのコマンドである。



ソケットの状態表示
UNIX で使われるプロトコルは、主にインターネットプロトコルファミリ (以下 PF_INET)、UNIX ドメインプロトコルファミリ (以下 PF_LOCAL。PF_UNIX とも言う) の2つがある。PF_INET とはいわゆるインターネットのことで、IP というプロトコルを利用する。一方、PF_LOCAL は、そのホスト内で閉じたネットワークのことで、X サーバや canna サーバ、syslogd などが使用する。

PF_INET は他のホストとも通信ができるという利点があるが、動作が遅い。PF_LOCAL は他のホストとは通信ができないが、動作は速い。

PF_INET にはポートという概念がある。PF_INET のサーバプロセスとは、特定のポートを見張っているものを指し、PF_INET のクライアントはそのポートに接続しているものを指す。一方 PF_LOCAL は、UNIX ドメインソケットという特殊なファイルを使って通信する。PF_LOCAL のサーバは UNIX ドメインソケットを作り、PF_LOCAL のクライアントは、その UNIX ドメインソケットに対して読み書きすることで通信が行われる。

さらに、PF_INET・PF_LOCAL にはそれぞれ TCP と UDP がある。TCP はコネクションを確立するので信頼性が高いが、速度が遅い。一方 UDP はコネクションを確立せず、信頼性は低い。例えばデータを送っても本当に届いたかどうかはわからないが、その分 速度は速い。

HTTP・SMTP・POP・FTP・telnet などは全て TCP/IP を利用している。一方、UDP/IP は DNS・NFS・syslog などが利用する。

以上の知識をふまえて、netstat の実行例を見てみよう。まずは -f inet を指定して、PF_INET のみを表示する。デフォルトでは、サーバが LISTEN しているソケットの情報は表示しないようになっているが、-a オプションを付加することで全ての state のソケット情報を取得できる。
% netstat -f inet -a
Active Internet connections (including servers)
Proto Recv-Q Send-Q  Local Address          Foreign Address        (state)
tcp4       0      0  192.168.1.12.http      192.168.1.11.4164      FIN_WAIT_2
tcp4       0      0  192.168.1.12.http      192.168.1.11.4163      FIN_WAIT_2
tcp4       0     20  192.168.1.12.ssh       192.168.1.11.3899      ESTABLISHED
tcp4       0      0  *.telnet               *.*                    LISTEN
tcp4       0      0  *.ftp                  *.*                    LISTEN
tcp4       0      0  *.canna                *.*                    LISTEN
tcp4       0      0  *.http                 *.*                    LISTEN
tcp4       0      0  *.submission           *.*                    LISTEN
tcp4       0      0  *.smtp                 *.*                    LISTEN
tcp4       0      0  *.ssh                  *.*                    LISTEN
udp4       0      0  *.6000                 *.*
udp4       0      0  X68000.ntp             *.*
udp4       0      0  192.168.1.12.ntp       *.*
udp4       0      0  *.ntp                  *.*
udp4       0      0  *.syslog               *.*
例えば
tcp4 0 0 *.telnet *.* LISTEN
は、telnet 用のポートを意味が LISTEN していることを意味する。この「telnet」という文字列は、実際に使用されているポート番号を /etc/services で検索し、対応するサービス名に置き換えたものである。例えば
% grep telnet /etc/services
telnet 23/tcp
となるので、ポート番号は 23 番であることがわかる。この「ポート番号→サービス名」の変換を抑止したい場合は -n オプションを使うとよい。

TCP で LISTEN しているのは 7 プロセス。telnet サーバ・ftp サーバ・canna サーバ・HTTP サーバ・ SMTP サーバ・SSH サーバであることがわかる。一方、UDP は ntp・syslog サーバが起動している。
UDP には状態が存在しないので、「state」の欄は何も表示されていない。

該当ポートを使用しているプロセスを特定するには、FreeBSD なら sockstat を、Linux なら fuser を、Solaris なら… (忘れた) を使う。標準コマンドではないが、lsof をインストールする手もある。

% netstat -f unix -a -n
Active UNIX domain sockets
Address  Type   Recv-Q Send-Q    Inode     Conn     Refs  Nextref Addr
c2ed28c0 stream      0      0        0 c2ed2a64        0        0
c2ed2a64 stream      0      0        0 c2ed28c0        0        0
c2ed2348 stream      0      0 c3422104        0        0        0 /tmp/ssh-BbnNCH0M/agent.2932
c2ed2460 stream      0      0 c316da28        0        0        0 /tmp/ssh-pGeomhlL/agent.600
c2ed2b7c stream      0      0 c2f60820        0        0        0 /tmp/.iroha_unix/IROHA
c2ed2c08 dgram       0      0        0 c2ed3000        0 c2ed2c94
c2ed2c94 dgram       0      0        0 c2ed3000        0 c2ed2d20
c2ed2d20 dgram       0      0        0 c2ed3000        0 c2ed2ec4
c2ed2ec4 dgram       0      0        0 c2ed3000        0        0
c2ed3000 dgram       0      0 c2ecd30c        0 c2ed2c08        0 /var/run/log

インタフェース情報表示
netstat -i で、インタフェースの一覧を表示できる。
% netstat  -i
Name    Mtu Network       Address              Ipkts Ierrs    Opkts Oerrs  Coll
fxp0   1500 <Link#1>      00:a0:c9:ab:fb:8a    72980     0    67575     0     0
fxp0   1500 192.168.1     192.168.1.12         71968     -    67518     -     -
fxp0   1500 fe80:1::2a0:c fe80:1::2a0:c9ff:        0     -        4     -     -
plip0  1500 <Link#2>                               0     0        0     0     0
lo0   16384 <Link#3>                              76     0       76     0     0
lo0   16384 your-net      X68000                  48     -       48     -     -
lo0   16384 localhost     ::1                      0     -        0     -     -
lo0   16384 fe80:3::1     fe80:3::1                0     -        0     -     -

netstat コマンドのオプション
-a サーバプロセスが利用している PF_INET ソケットも表示する。
デフォルトでは、サーバが listen している PF_INET ソケットの情報は表示しないようになっているが、これを表示するようのが -a オプションである。
-f 指定したプロトコルの情報のみを表示
% netstat -f inet (インターネットプロトコルのみ表示)
% netstat -f unix (UNIX ドメインプロトコルのみ表示)
-i 指定したネットワークインタフェースの情報のみ表示。tun0 や ppp、ed1 など。
-p 指定したプロトコルのみを表示。
ここでのプロトコルというのは、インターネットプロトコルや UNIX ドメインプロトコルではなく、HTTP・FTP・telnet などのことである。/etc/services に書いてあるプロトコルから選択するとよい。
-n ホスト名・サービス名を表示しない。
デフォルトでは、IP アドレスはホスト名に (DNS サーバに問い合わせる)、ポート番号はサービス名に (/etc/services を使う) 変換されて表示される。しかし、逆引き (IP アドレスからホスト名への変換) に時間がかかるホストがあると、そこで netstat の表示がしばらく止まってしまう。-n オプションを付けると、IP アドレスの逆引きを行わなくなるので、このような IP アドレスがあってもすぐに表示される。
-s ネットワークの統計情報を表示する
>> Linuxオンラインマニュアル(man) Linux netstat(8)
>> FreeBSDオンラインマニュアル(man) FreeBSD netstat(1)