UNIXではネットワークの状態を調べるために様々なコマンドが用意されています。ここでは代表的なコマンドの使い方をいくつか紹介します。各コマンドの動作についてはFreeBSD 4.3-RELEASEとNetBSD 1.5.2で確認しています。
ping
pingコマンドは、指定ホストまでの到達性を調べるユーティリティです。英語の発音としては<ピン>なのでしょうが、私の周りではみな<ピング>と読んでいます。
このコマンドが実行されると、指定されたホストに対して
ICMPのECHO_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行目では、pingをwww.yahoo.co.jp(210.81.150.166)に行うこととそのデータ量が56byteであることを宣言?しています。
次の行の最初、64byteというのは8byteのICMPパケットヘッダと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アドレスを指定して再度実行してみましょう。それでも応答がない場合には、送信ホストから受信ホストまでの経路上に問題があることが考えられます。
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はその経路に使われるネットワークインターフェースを示します。
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 #
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
>
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 %
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は一般ユーザでも起動することはできますが、パケットをダンプすることはできません。もちろん、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はとても便利でお勧めのユーティリティですよ!