ネットワークの状態を調べよう!

UNIXではネットワークの状態を調べるために様々なコマンドが用意されています。ここでは代表的なコマンドの使い方をいくつか紹介します。各コマンドの動作についてはFreeBSD 4.3-RELEASEとNetBSD 1.5.2で確認しています。

  1. ping
  2. netstat
  3. arp
  4. nslookup
  5. traceroute
  6. tcpdump/ethereal
  1. ping

    pingコマンドは、指定ホストまでの到達性を調べるユーティリティです。英語の発音としては<ピン>なのでしょうが、私の周りではみな<ピング>と読んでいます。

    このコマンドが実行されると、指定されたホストに対して ICMPECHO_REQUESTが発行されます。 ICMP ECHO_REQUESTを受けとったホストは送信元に対してICMP ECHO_RESPONSEを返します。

    以下に例を示します。

    % ping www.yahoo.co.jp
    PING www.yahoo.co.jp (210.81.150.166): 56 data bytes
    64 bytes from 210.81.150.166: icmp_seq=0 ttl=48 time=49.056 ms
    64 bytes from 210.81.150.166: icmp_seq=1 ttl=48 time=50.878 ms
    64 bytes from 210.81.150.166: icmp_seq=2 ttl=48 time=53.188 ms
    ^C
    --- www.yahoo.co.jp ping statistics ---
    3 packets transmitted, 3 packets received, 0% packet loss
    round-trip min/avg/max/stddev = 49.056/51.041/53.188/1.691 ms
    

    1行目では、pingwww.yahoo.co.jp(210.81.150.166)に行うこととそのデータ量が56byteであることを宣言?しています。

    次の行の最初、64byteというのは8byteICMPパケットヘッダと56byteのデータを合わせた値です。このICMPパケットが210.81.150.166から返ってきたということを示しています。

    icmp_seqというのはICMP ECHO_REQUESTを発行する際にパケットに付けられる順番です。混雑するネットワークだと、この順番が入れ替わることがあります。

    ttlはデフォルトでは255などに設定され、ルータはパケットが通過する際にこの値を一つ減らすことになっています。ICMPパケットが私のホストに返ってきた時には48だったということです。

    timeというのはRTT(Round Trip Time)を示します。例では大体50ms程度になっています。

    最後にはICMPのパケット統計とRTT統計が表示されます。

    pingの応答がない場合、pingの引数にFQDN(Fully Qualified Domain Name)を指定しているのであれば、該当ホストのIPアドレスを指定して再度実行してみましょう。それでも応答がない場合には、送信ホストから受信ホストまでの経路上に問題があることが考えられます。

  2. netstat

    netstatはネットワーク関連の情報を調べるコマンドです。いろいろなオプションがあり、多くの情報を表示させることができますが、私は主にルーティングテーブルの確認に使っています。以下に例を示します。

    % uname -sr
    FreeBSD 4.3-RELEASE
    % netstat -nr
    Routing tables
    
    Internet:
    Destination        Gateway            Flags     Refs     Use     Netif Expire
    default            192.168.0.1        UGSc        5        0      ed1
    127.0.0.1          127.0.0.1          UH          0        2      lo0
    192.168            link#8             UC          0        0      ed1 =>
    
    Internet6:
    Destination                       Gateway                       Flags      Netif Expire
    ::/96                             ::1                           UGRSc       lo0 =>
    default                           fe80::1%lo0                   Uc          lo0
    ::1                               ::1                           UH          lo0
    ::ffff:0.0.0.0/96                 ::1                           UGRSc       lo0
    fe80::/10                         ::1                           UGRSc       lo0
    fe80::%lo0/64                     fe80::1%lo0                   Uc          lo0
    fe80::%ed1/64                     link#8                        UC          ed1
    ff01::/32                         ::1                           U           lo0
    ff02::/16                         fe80::1%lo0                   UCS         lo0
    ff02::%lo0/32                     fe80::1%lo0                   UC          lo0
    ff02::%ed1/32                     link#8                        UC          ed1
    % 
    
    % uname -sr
    NetBSD 1.5.2
    % netstat -nr
    Routing tables
    
    Internet:
    Destination        Gateway            Flags     Refs     Use    Mtu  Interface
    default            192.168.0.1        UGS         0      228   1500  ne2
    127                127.0.0.1          UGRS        0        0  33228  lo0
    127.0.0.1          127.0.0.1          UH          1        0  33228  lo0
    192.168            link#11            UC          2        0   1500  ne2
    192.168.0.1        00:a0:de:09:35:2a  UHL         1        0   1500  ne2
    192.168.0.2        00:a0:b0:21:9f:ed  UHL         4     1274   1500  ne2
    
    XNS:
    Destination        Gateway            Flags     Refs     Use    Mtu  Interface
    
    ISO:
    Destination        Gateway            Flags     Refs     Use    Mtu  Interface
    
    X.25:
    Destination        Gateway            Flags     Refs     Use    Mtu  Interface
    
    Internet6:
    Destination                   Gateway                   Flags     Refs     Use    Mtu  Interface
    ::/104                        ::1                       UGRS        0        0  33228  lo0 =>
    ::/96                         ::1                       UGRS        0        0  33228  lo0
    ::1                           ::1                       UH         12        0  33228  lo0
    ::127.0.0.0/104               ::1                       UGRS        0        0  33228  lo0
    ::224.0.0.0/100               ::1                       UGRS        0        0  33228  lo0
    ::255.0.0.0/104               ::1                       UGRS        0        0  33228  lo0
    ::ffff:0.0.0.0/96             ::1                       UGRS        0        0  33228  lo0
    2002::/24                     ::1                       UGRS        0        0  33228  lo0
    2002:7f00::/24                ::1                       UGRS        0        0  33228  lo0
    2002:e000::/20                ::1                       UGRS        0        0  33228  lo0
    2002:ff00::/24                ::1                       UGRS        0        0  33228  lo0
    fe80::/10                     ::1                       UGRS        0        0  33228  lo0
    fe80::%lo0/64                 fe80::1%lo0               U           0        0  33228  lo0
    fe80::%ne2/64                 link#11                   UC          0        0   1500  ne2
    fec0::/10                     ::1                       UGRS        0        0  33228  lo0
    ff01::/32                     ::1                       U           0        0  33228  lo0
    ff02::%lo0/32                 fe80::1%lo0               UC          0        0  33228  lo0
    ff02::%ne2/32                 link#11                   UC          0        0   1500  ne2
    % 
    

    IPv4とIPv6の情報がそれぞれ表示されています。Destinationはパケットの送信先、Gatewayは次にパケットを送るホストです。Flagsにはその経路の状態が記号で示されています。詳細は以下の通りです。(FreeBSD 4.3-RELEASEのjman netstatより抜粋)

    1  ルーティングフラグ #1 にて特定されるプロトコル
    2  ルーティングフラグ #2 にて特定されるプロトコル
    3  ルーティングフラグ #3 にて特定されるプロトコル
    B  破棄されるパケット
    b  ブロードキャストアドレスを表現する経路
    C  新しい経路を生成する
    c  使用時に、プロトコル専用の新しい経路を生成する
    D  (リダイレクトによって) 動的に生成される
    G  ゲートウェイ等による中継を必要としている到達先
    H  ホストエントリ (これ以外はネットワーク)
    L  アドレス変換を連動させられる正当なアドレス
    M  (リダイレクトによって) 動的に変更される
    R  到達不可能なホストもしくはネットワーク
    S  手動で追加された
    U  使用可能経路
    W  クローンした結果として作成された経路
    X  外部の daemon がプロトコルからリンクアドレス変換を行なう
    
    Refsは使用されている経路の数を、Useはその経路を通って送られたパケット数を、Netif Expireはその経路に使われるネットワークインターフェースを示します。
  3. arp

    arpはIPアドレスからethernetアドレス(あるいはMACアドレス)への変換テーブルを表示するコマンドです。ネットワークインターフェースに割り当てられているIPアドレスが変更になった場合などには、ARPテーブルを変更する必要があります。

    以下の例はARPテーブルの情報を全て表示します。

    % arp -a
    foo (192.168.0.1) at 0:a0:de:9:35:2a [ethernet]
    bar (192.168.0.2) at 0:a0:b0:21:9f:ed [ethernet]
    % 
    

    以下の例はARPテーブルの全てのエントリを削除します。

    # arp -ad
    192.168.0.1 (192.168.0.1) deleted
    192.168.0.2 (192.168.0.2) deleted
    # 
    
  4. nslookup

    nslookupはDNS関連の情報を調べるコマンドです。引数なしで起動すると/etc/resolv.conf中のnameserverで指定されたネームサーバに問い合わせを行います。

    % nslookup
    Default Server:  xxx.xxx.xxx.0.168.192.in-addr.arpa
    Address:  192.168.0.2
    
    > www.yahoo.co.jp
    Server:  xxx.xxx.xxx.0.168.192.in-addr.arpa
    Address:  192.168.0.2
    
    Non-authoritative answer:
    Name:    www.yahoo.co.jp
    Addresses:  211.14.13.66, 210.81.150.166, 210.81.153.68, 210.81.153.69
              210.81.153.70, 210.152.236.111, 210.152.236.112, 210.152.236.113, 211.14.13.65
    
    > 210.81.153.69
    Server:  xxx.xxx.xxx.0.168.192.in-addr.arpa
    Address:  192.168.0.2
    
    Name:    w09.yahoo.co.jp
    Address:  210.81.153.69
    
    > 
    
  5. traceroute

    tracerouteは引数で指定されたホストまでの経路情報を表示します。

    % traceroute www.yahoo.co.jp
    traceroute to www.yahoo.co.jp (210.81.153.69), 30 hops max, 40 byte packets
     1  xxx.xxx.xxx (192.168.0.1)  1.744 ms  1.618 ms  1.678 ms
     2  211.127.123.18 (211.127.123.18)  30.787 ms  30.497 ms  30.219 ms
     3  211.127.123.249 (211.127.123.249)  33.739 ms  33.219 ms  33.983 ms
     4  CBCrk-01G3-0.nw.odn.ad.jp (143.90.139.195)  33.575 ms  34.849 ms  33.048 ms
     5  CBCrk-04P15-0.nw.odn.ad.jp (143.90.148.46)  34.099 ms  35.618 ms  33.555 ms
     6  143.90.143.105 (143.90.143.105)  34.830 ms  35.235 ms  34.153 ms
     7  KOTrk-04P2-0.nw.odn.ad.jp (143.90.148.18)  35.862 ms  34.699 ms  34.720 ms
     8  as703.nspixp2.wide.ad.jp (202.249.2.80)  35.248 ms  34.946 ms  34.715 ms
     9  305.HSSI4-0-0.GW1.YOT1.Alter.Net (210.80.6.114)  35.105 ms  34.553 ms  35.019 ms
    10  210.81.10.6 (210.81.10.6)  35.014 ms  35.647 ms  34.833 ms
    11  210.81.152.22 (210.81.152.22)  36.490 ms  35.565 ms  35.864 ms
    12  * * *
    13  * * *
    14  * * *
    15  *^C
    % 
    
  6. tcpdump/ethereal

    tcpdump/etherealはネットワークを流れるパケットをダンプするコマンドです。使いやすさから言ったらetherealですが、tcpdumpはデフォルトでインストールされている場合もあります。Solarisではsnoop、AIXではiptraceがパケットダンプのコマンドとしてインストールされています。

    以下の例では、パケットの内容をIPアドレスやポート番号を解決せずにそのまま出力します。

    # tcpdump -n
    tcpdump: listening on ed1
    16:29:29.426107 192.168.0.3.6000 > 192.168.0.2.2527: P 1859573999:1859574031(32) ack 1139834356 win 65535 (DF)
    16:29:29.426702 192.168.0.3.6000 > 192.168.0.2.2528: P 1165359875:1165359907(32) ack 1248334330 win 65535 (DF)
    16:29:29.427397 192.168.0.2.2528 > 192.168.0.3.6000: P 1:5(4) ack 32 win 65535 (DF)
        :
    64 packets received by filter
    0 packets dropped by kernel
    
    また、以下はetherealを起動した画面です。

    ethereal screen

    余談ですが、etherealは一般ユーザでも起動することはできますが、パケットをダンプすることはできません。もちろん、rootであれば起動することができるのですが、etherealを起動するためにわざわざsuするのは面倒です。ここで誰もが思いつくのはetherealにsetuidすることだと思います。私もやりましたが、そうやすやすとはいきませんでした。
    # ls -l ethereal
    -rwxr-xr-x  1 root  wheel  6013548  10/20 02:14 ethereal*
    # chmod u+s ethereal 
    # ls -l ethereal
    -rwsr-xr-x  1 root  wheel  6013548  10/20 02:14 ethereal*
    % ethereal
    
    Gtk-WARNING **: This process is currently running setuid or setgid.
    This is not a supported use of GTK+. You must create a helper
    program instead. For further details, see:
    
        http://www.gtk.org/setuid.html
    
    Refusing to initialize GTK+.
    % 
    
    という具合に、gtk+で引っかかってしまいました。そこで、私は以下のwrapperをethereal.shとして置いて使っています。
    #!/bin/sh
    
    kterm -e sudo /usr/local/bin/ethereal $@
    
    これを実行すると以下のウィンドウが起動します。ここでユーザのpasswordを入力するとetherealが起動します。sudoはとても便利でお勧めのユーティリティですよ!

    sudo screen


Copyright(C) 2001-2008 ykondou.org
webmaster@ykondou.org
Key fingerprint = 7721 FB0E 42CC 2BD3 DB09 5868 3EC7 B5D2 B75C 5DAA

Valid CSS! Valid HTML 4.01!