コマンド
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 ネットワークの統計情報を表示する