カイワレの大冒険 Third

技術的なことや他愛もないことをたまに書いてます

netstatのオプションを調べてみた

今春サーバを触っていくのにびくびくしてる人が1週間ですべき7のこと - カイワレの大冒険 Thirdで紹介したコマンドのなかにnetstatというコマンドがありますが、自分は「-na」ばかりで全然知らなかったので、ひと通り調べてみた。
(IPアドレスとかポートとか色々改変してます)

ひと通り調べた

とりあえず、まずはヘルプ。manでもよいかもしれない。

usage: netstat [-veenNcCF] [<Af>] -r         netstat {-V|--version|-h|--help}
       netstat [-vnNcaeol] [<Socket> ...]
       netstat { [-veenNac] -I[<Iface>] | [-veenNac] -i | [-cnNe] -M | -s } [delay]

        -r, --route                display routing table
        -I, --interfaces=<Iface>   display interface table for <Iface>
        -i, --interfaces           display interface table
        -g, --groups               display multicast group memberships
        -s, --statistics           display networking statistics (like SNMP)
        -M, --masquerade           display masqueraded connections

        -v, --verbose              be verbose
        -n, --numeric              don't resolve names
        --numeric-hosts            don't resolve host names
        --numeric-ports            don't resolve port names
        --numeric-users            don't resolve user names
        -N, --symbolic             resolve hardware names
        -e, --extend               display other/more information
        -p, --programs             display PID/Program name for sockets
        -c, --continuous           continuous listing

        -l, --listening            display listening server sockets
        -a, --all, --listening     display all sockets (default: connected)
        -o, --timers               display timers
        -F, --fib                  display Forwarding Information Base (default)
        -C, --cache                display routing cache instead of FIB
        -T, --notrim               stop trimming long addresses
        -Z, --context              display SELinux security context for sockets

  <Iface>: Name of interface to monitor/list.
  <Socket>={-t|--tcp} {-u|--udp} {-S|--sctp} {-w|--raw} {-x|--unix} --ax25 --ipx --netrom
  <AF>=Use '-A <af>' or '--<af>'; default: inet
  List of possible address families (which support routing):
    inet (DARPA Internet) inet6 (IPv6) ax25 (AMPR AX.25)
    netrom (AMPR NET/ROM) ipx (Novell IPX) ddp (Appletalk DDP)
    x25 (CCITT X.25)

バージョンも見てみる。

net-tools 1.60
netstat 1.42 (2001-04-15)
Fred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang and others
+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N
AF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE
HW:  +ETHER +ARC +SLIP +PPP +TUNNEL +TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB

んで、まず何もオプションつけずデフォルトで。
接続元(ローカル)と接続先(接続先)の情報が分かる。
プロトコルがTCPで、ssh使ってる有効な接続が一つあるという感じかな。

$ netstat
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 v-111-11-11-1.test:ssh test.test.co:4455666 ESTABLISHED

「-v, --verbose」少し詳細な情報を載せるバーボース。何が変わったのか分からないw

$ netstat -v
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 132 v-111.111-11-11.test:ssh test.test.co:23442530 ESTABLISHED

「-n, --numeric」名前解決しないで表示。全てIPアドレスで表示されているのが分かる。
「ssh」ではなくて、ポート番号(10022)になっていることも分かる。

$ netstat -n
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 68 ::ffff:111.111.11.11:10022 ::ffff:111.111.111.96:63530 ESTABLISHED

「-N, --symbolic」ハードウェアの名前解決をするというけれど、どこにハードウェアの情報載ってるんだ…

$ netstat -N
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 v-111-111-11-1.test:ssh test.test.co:63530 ESTABLISHED

「-c, --continuous」ずっと繰り返して表示。止まらないし、追いきれないのでどこまで使えるか分からない。

$ netstat -c
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 v-111-111-11-1.test:ssh test.test.co:63530 ESTABLISHED

「-a, --all」有効な接続以外も全て表示。空いてるポートを調べるときにこのオプションは有効だと思ってる。

$ netstat -a
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 *:smtps *:* LISTEN
tcp 0 0 *:smtp *:* LISTEN
tcp 0 0 *:pop3 *:* LISTEN
tcp 0 0 *:imap *:* LISTEN
tcp 0 0 *:http *:* LISTEN
tcp 0 0 *:ssh *:* LISTEN
tcp 0 0 *:https *:* LISTEN
tcp 0 0 *:imaps *:* LISTEN
tcp 0 0 *:pop3s *:* LISTEN
tcp 0 0 v-111-11-111-11.test:ssh test.test.co:63530 ESTABLISHED
udp 0 0 *:snmp *:*

「-e, --extend」拡張して表示。UserとかInodeの情報が追加されてる。

$ netstat -e
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State User Inode
tcp 0 0 v-111-111-11-1.test:ssh test.test.co:63530 ESTABLISHED user 001450

「-p, --programs」プログラムやPID、使用してるユーザ名などが分かる。psコマンドの情報が少し加わった感じかな。

$netstat -p
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 v-111-111-11-1.test:ssh test.test.co:63530 ESTABLISHED 14501/sshd: username

「-o, --timers」ネットワーキングタイマー追加される。状態がkeepaliveになっていることが分かる。ゾンビセッションとかいるとき有効かな。

$ netstat -o
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State Timer
tcp 0 0 v-111-111-11-11.test:ssh test.test.co:63530 ESTABLISHED keepalive (6903.82/0/0)

「-l, --listening」今度は有効な接続を除いて、LISTEN状態になっているもの表示

$ netstat -l
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 *:smtps *:* LISTEN
tcp 0 0 *:smtp *:* LISTEN
tcp 0 0 *:pop3 *:* LISTEN
tcp 0 0 *:imap *:* LISTEN
tcp 0 0 *:http *:* LISTEN
tcp 0 0 *:ssh *:* LISTEN
tcp 0 0 *:https *:* LISTEN
tcp 0 0 *:imaps *:* LISTEN
tcp 0 0 *:pop3s *:* LISTEN

「-T, --notrim」長い情報をトリムせずに全部表示してくれる。どこまで活躍するかは未だ不明。

$ netstat -T
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 v-111-111-11-11.test.net:ssh 99.123.5.33.25.dynamicIP.test.net:22467 ESTABLISHED
tcp 0 0 v-111-111-11-11.test.net:ssh test.com:63530 ESTABLISHED
tcp 0 0 v-111-111-11-11..test.net:ssh 99.test-222-131-225.test.net:21078 TIME_WAIT


「-u|--udp」udpのみ表示。なければ何も表示せず。

$ netstat -u
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State


「-w|--raw」IP、ICMPとかの接続を表示。

$ netstat -w
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State

「-i, --interfaces」インターフェースの情報を表示。「RX-OK」は正常に受信したパケット。「TX-OK」は正常に送信したパケット。
今のところあまり使う機会ない…

$ netstat -i
Kernel Interface table

仮想サーバ
Iface MTU Met RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg
lo 16436 0 107287 0 0 0 107287 0 0 0 LRU
venet0 1500 0 402647 0 0 0 369962 0 0 0 BOPRU
venet0:0 1500 0 - no statistics available - BOPRU

------
実サーバ
Iface MTU Met RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg
eth0 1500 0 3644266 0 0 0 209457 0 0 0 BMRU
lo 16436 0 8531612 0 0 0 8531612 0 0 0 LRU

「-s, --statistics」統計表示。統計的に見る前に既にiptablesではじいたりしてるかもしれないし、
どこまで使えるか分からない…

$ netstat -s
Ip:
50000000 total packets received
0 forwarded
0 incoming packets discarded
500000 incoming packets delivered
50000 requests sent out
Icmp:
500 ICMP messages received
0 input ICMP message failed.
ICMP input histogram:
destination unreachable: 191
echo requests: 1000
echo replies: 40000
50940 ICMP messages sent
0 ICMP messages failed
ICMP output histogram:
destination unreachable: 2
echo request: 499992
echo replies: 12222
IcmpMsg:
InType0: 49222
InType3: 1444
InType8: 1444
OutType0: 1444
OutType3: 2
OutType8: 1111
Tcp:
11111 active connections openings
11111 passive connection openings
11111 failed connection attempts
1111 connection resets received
1 connections established
11111 segments received
11111 segments send out
112 segments retransmited
0 bad segments received.
2222 resets sent
Udp:
51444 packets received
6 packets to unknown port received.
0 packet receive errors
50000 packets sent

「-C, --cache display routing cache instead of FIB」ルーティング情報を得るというけれど、その情報が必要なときがまだない…

$ netstat -C
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 v-111-111-11-11.test:ssh test.test.co:6322 ESTABLISHED

「-F, --fib」Cオプションの対抗かな。こっちがデフォルト。netstatでキャッシュを追う状態に見舞われたことがないので、分からない… 無知…

$ netstat -F
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 v-111-111-11-11.test:ssh test.test.co:6322 ESTABLISHED

「-r, --route」ルーティングテーブルが分かる。routeコマンドやtracertコマンドもあるので、netstatを使う出番がどこまであるのか分からない…

$ netstat -r
Kernel IP routing table

仮想サーバ
Destination Gateway Genmask Flags MSS Window irtt Iface
192.168.1.0 * 255.255.255.0 U 0 0 0 venet0
169.254.0.0 * 255.255.0.0 U 0 0 0 venet0
default 192.168.1.1 0.0.0.0 UG 0 0 0 venet0

-------
実サーバ
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
192.168.1.0 * 255.255.255.0 U 0 0 0 eth0
169.254.0.0 * 255.255.0.0 U 0 0 0 eth0
default test.test.t 0.0.0.0 UG 0 0 0 eth0

プロトコルの種別で表示。「inet(IPv4)」のものを表示。

$ netstat -A inet
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address

これはIPv6のものを表示。netstatでこのレベルの切り分けが必要なときはいまだ出てこず…

$ netstat -A inet6
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 120 v-111-111-11-11.test:ssh test.test.co:635330 ESTABLISHED



終わりに

ひと通り使ってみたけど、netstatで知りたい情報って、空いてるポートだったり、どういう状態にあるかだったりするので、a, n, t, oあたりが自分はよく使う気がする。

つまり、ESTBLISHとLISTEN含めて名前解決せず表示させたり、TCPでkeepalivedもしくはそうではないセッションがどれだけあるか調べたいときなど。
grepさせて、wc -lすることで、セッション数も把握できるし、特にhttpd周りはセッションが増えるので、無駄にコネクションが増えてないか見たりするときに自分は使ってるかな。

ただ、他のオプションももっと活用できる気はするので、よかったら使いかた教えて頂けると助かったります!
かなーりざっくりした記事ですいませんが、何か参考になればとー!