この演習の目的はNetworkの状況を把握し、その挙動に関して、更に深い理解を得ることです。
HubとSwitchがIP Network的に透明(1)ですが、Routerは、見えます(2)。
このRouterによって、ブロードキャストドメインさえも分割されることを確認します。
あってもなくても、IP Network的には単なる線と区別できないことを意味します。
実際、二台のPCを繋ぐだけであれば、Cross Cableが一本あればよく、Hub/Switchは不要です。
このため、通常「Networkの論理図」には、Hubや、Switchを明示しません(単に「線」として表すことが多い)。
つまり、Routerには、IP Addressが振られ、IP Addressを使って、区別することが可能だということです。
逆に、HubやSwitchには、IP Addressを付ける必要はありません(もちろん、Hub, Switch自身と通信をしたい場合[SNMPを利用するなど..の場合]は、IP Addressを設定する必要がありますが、設定しなくても、中継装置としては問題なく動きますし、そもそもIP Addressを設定できない[SNMPなどが利用できない] Hub/Switchもありますし.. )。
tcpdumpには、色々な利用法がありますが、今回は、その触りだけを紹介します。それだけでも、Networkの挙動に関する、様々な情報が得られます。
参考資料として、以下のURLを乗せておきましょう。
なお、tcpdumpは、単純に言えば「Networkの盗聴機」と同じようなtoolです。Network管理には、便利で、欠かせないと言って良いほど、強力なtoolですが、興味本位で、他の人の通信内容を覗き込む(3)ような使い方は厳禁ですので、心に銘記して置いてください。
tcpdumpの使い方を教わると、怖くてtelnetや、単純なpopなんか使えなくなってしまいます。Webだってもちょっと..
このためにあるのが、「暗号技術」です。telnetの代わりにssh, popの代わりにapop, webでもhttpでなくhttpsを使えば、ちょっと安心かもしれません。
一つのHub ( Switchも可だがHubが望ましい)に1台をLinux-PC ( tcpdumpを利用するため,以下では、Linux-Xとする)として、もう一台Host ( WindowsでもLinuxでもCISCOでも可だが、ここでは、Linuxとし、Linux-Yとする)として、二台接続する。
IP addressは、通信ができれば、なんでも構わないが、迷うのであれば、Network 192.168.1.0/24を利用し、一方( linux-X [tcpdump]側)は192.168.1.1、他方( Linux-Y側)は、192.168.1.2を利用すればよい。
(tcpdump) Linux-X Linux-Y [192.168.1.1] [192.168.1.2] | | >-------+-------------------------------+-----------------------< 192.168.1.0/24
Linux側で、次のようにしてtcpdumpを実行する。
[root@Linux-X /root]# tcpdump -n -i eth0
ここで、tcpdumpのオプションの詳細に関しては、Manpage of TCPDUMPを参照してもらうとして、ここでは、利用しているオプションに関してのみ説明する。
時間があったら、様々なオプション(4)を試してみよう。
TCP Dump中に現れるIP Addressを逆引き( Name Serverを参照)して、Host Nameに変更することをしない。
このNetworkには、Name Serverが設置されていないので、-nを付けず、標準的な振る舞いをさせると、存在しないName Serverに問い合わせをして、時間が無駄になるので、これを避けるためである。
これは、linuxのtracerouteコマンドや、pingコマンドの-nオプションと同じである。
どのInterfaceを通過するパケットをtcpdumpが監視するかを指定するオプション-iにInterface名であるeth0をつけている。
つまり、このコマンドを実行した結果eth0でやり取りされるパケットに関してのみ、tcpdumpが出力を行う。
これは、付けなくても、普通は、eth0を探してくれる(5)のだが、念のためにおこなっている。
tcpdumpの対象となるNetworkには、様々なパケットが流れている。tcpdumpを(オプションを付けずに.. )そのまま利用すると、大量の情報が出力されてしまう。
tcpdumpでは、オプションを上手に指定することにより、目的としているパケットのみを捕らえ、出力することが可能になっている。
もう一台のHost (Linux-Y)から、Linux PC (Linux-X)に対して、色々なNetworkコマンドを実行し、パケットを送ってみよう。
もし、もう一方のHost (Linux-Y)のOSもLinuxであれば、次のようなコマンド(6)を実行して、パケットを送ってみるとよい。
[root@Linux-Y /root]# ping -n 192.168.1.1
[root@Linux-Y /root]# traceroute -n 192.168.1.1
[root@Linux-Y /root]# telnet 192.168.1.1
[root@Linux-Y /root]# /etc/rc.d/init.d/routed start
このようなNetwork関係のコマンドを実行した結果、tcpdumpとして、どのような出力が得られるかを確認しましょう。
RIPのアナウンスは、ブロードキャストなので、他のコマンド(ping/traceroute等)と異なり、特に宛先を指定しなくても、パケットがLinux-Xに届くので、そのパケットを観測することができる。
なお、ブロードキャストなので、SwitchとHubの違いが出ない例であることにも注意しよう。
実験1のNetworkに対して、もう一台Host ( Linux-Z 192.168.1.3とするがもちろん、WindowsでもCISCOでも構わない)を追加する。ただし、接続機器は、Hubでなければならない。
(tcpdump) Linux-X Linux-Y Linux-Z [192.168.1.1] [192.168.1.2] [192.168.1.3] | | | >-------+-------------------------------+---------------+-------< (Hub)
tcpdumpを行うHost ( Linux-X )で、次のコマンドを実行する(8)。
[root@Linux-X /root]# ifconfig eth0 promisc
実験1と同様に、Linux-Xで、tcpdumpを実行し、今度は、Linux-YからLinux-Zへ、様々な通信コマンドを実行してみる。
実験1と実験2の差はどのようなものか?
詳しくは、ifconfigのマニュアルページを参照して欲しいのですが、これによって、このinterfaceは、promisc mode、すなわち、無差別受信状態に変わります。
一般に、unicastで投げられたフレームも、Hubを経由して、Interfaceに受信されますが、そのあて先が自分のMAC addressに該当しないかぎり、Interfaceは、そのフレームを破棄し、CPUに負担をかけない仕組みになっています(したがって、通常は、この状態)。
しかし、今回の応用( tcpdumpで、他のHost間の通信を監視する)では、この機能が働くと、他のHost間の通信を得ることができないので、このような特別な処置が必要になります。
実験2のNetworkに対して、Hubの代わりに、Switchをいれる。
(tcpdump) Linux-X Linux-Y Linux-Z [192.168.1.1] [192.168.1.2] [192.168.1.3] | | | >-------+-------------------------------+---------------+-------< (Switch)
実験2と全く同じ実験を行う。
実験2と実験3の差はどのようなものか?
Router 1台( Linux-R : Linux-PCにEthernet Cardを二枚挿して作る)に二台のHubを接続して、二つのNetworkを作る。
一方のHubに、tcpdump可能なLinx-Xと、もう一台Host (Linux-Y) (9)を付け、他方のHubにも二台のHost ( Linux-A, Linux-B )を付ける。
(tcpdump) Linux-X Linux-Y [192.168.1.1] [192.168.1.2] | | >-------+------------+------------------+-----------------------< | 192.168.1.0/24 [192.168.1.253] Linux-R [192.168.2.253] | >-------+------------+------------------+-----------------------< | | 192.168.2.0/24 [192.168.2.1] [192.168.2.2] Linux-A Linux-B
Linux-X側で、次のようにしてtcpdumpを実行する。
[root@Linux-X /root]# tcpdump -n -i eth0
tcpdumpと反対側にあるHost (Linux-A)から、他のHost ( Linux-B, Linux-Y )に対してNetworkコマンドを実行し、パケットを送ってみよう。
また、Linux-Aで、routedを起動し、RIPのブロードキャストが、tcpdumpの出力に現れないことを確認しよう。