Powered by SmartDoc

情報通信ネットワーク論[演習] (2005/10/18)
Ver. 1.1

2005年10月18日
栗野 俊一
kurino@math.cst.nihon-u.ac.jp
http://edu-gw2.math.cst.nihon-u.ac.jp/~kurino//home/kurino/sdoc/2005/ccna/ccna-ex/ccna-ex.html
情報通信ネットワーク論(演習)2005/10/24 の資料

目次

目的

この演習の目的はNetworkの状況を把握し、その挙動に関して、更に深い理解を得ることです。

telnetでServerと会話(新規)
TCP上のProtocolに、http/smtp/pop3等がある。これらは、通常、専用のClientソフトを使って、通信を行うが、telnetを利用して、簡単にこれらの機能が利用できることを示す。
tcpdumpの利用法(新規)
linuxで利用可能なtcpdumpというコマンドを利用することによって、Network内で、どのような情報(パケット)がやり取りされているかを観察する。
HubとSwitchの振る舞いの違い
HubとSwitchは、Network接続装置としては、ほぼ、同様な利用のされかたをするが、実際にどのような場面で振る舞いが異なるかをtcpdumpの出力をみて、理解する。
RouterとHub, Switchなどの振る舞いの違い

HubとSwitchがIP Network的に透明(1)ですが、Routerは、見えます(2)

このRouterによって、ブロードキャストドメインさえも分割されることを確認します。

  1. あってもなくても、IP Network的には単なる線と区別できないことを意味します。

    実際、二台のPCを繋ぐだけであれば、Cross Cableが一本あればよく、Hub/Switchは不要です。

    このため、通常「Networkの論理図」には、Hubや、Switchを明示しません(単に「線」として表すことが多い)。

  2. つまり、Routerには、IP Addressが振られ、IP Addressを使って、区別することが可能だということです。

    逆に、HubやSwitchには、IP Addressを付ける必要はありません(もちろん、Hub, Switch自身と通信をしたい場合[SNMPを利用するなど..の場合]は、IP Addressを設定する必要がありますが、設定しなくても、中継装置としては問題なく動きますし、そもそもIP Addressを設定できない[SNMPなどが利用できない] Hub/Switchもありますし.. )。

telnet による http/smtp/popt の利用法

telnetを利用することによって、TCP上に実現されている様々なProtocolの振舞いを理解することができます。

telnet で http

http Protocolは、Webで利用されているProtocolです。実は、http (の最初の版.. )は、protocolの中でも、最も簡単に実装されている物です。

telnetコマンドで、引数にweb server名( ip addressも可)と、httpで利用する標準的なport番号( http / 80でもOkey )を指定します。

そして、「GET」+「ファイル名」+「HTTP/1.0」の後に、改行を二回おすと、そのファイルが画面上に表示されます(もちろんhtml形式であることに注意してください)。なお、先頭の部分は、httpのheader部で、htmlファイルに関する、色々な情報が表示されます。実際のhtmlファイルの内容は、改行の後の内容となります。

telnet で http
# telnet edu-gw2.math.cst.nihon-u.ac.jp http
Trying 133.43.100.162...
Connected to edu-gw2.math.cst.nihon-u.ac.jp (133.43.100.162).
Escape character is '^]'.
GET /index.html HTTP/1.0

HTTP/1.1 200 OK
Date: Tue, 18 Oct 2005 03:06:26 GMT
Server: Apache/1.3.27 (Unix)  (Red-Hat/Linux) mod_perl/1.23
Last-Modified: Fri, 04 Apr 2003 05:48:31 GMT
ETag: "30826a-339-3e8d1caf"
Accept-Ranges: bytes
Content-Length: 825
Connection: close
Content-Type: text/html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
  <head>
<meta http-equiv="content-type" \
    content="text/html;charset=iso-2022-jp">
    <title>数学科演習室</title>
  </head>
  <body bgcolor="white"><h1>数学科演習室の利用について。</h1>
<p>このページからリンクされているページは、数学科の中のみからアクセス可
能なものと、理工学部の中からアクセス可能なものがあります。</p>

<ul>
      <li><a href="./announce/announce.html">管理者からのお知らせ。
      </a>(2001/10/12 更新)</li>
      <li><a href="./usage/how_to_use.html">サービスの利用方法。
      </a>(2/2 更新)</li>
      <li><a href="./admin.html">困ったときには。</a></li>
<li><a href="~kurino/help/20030404/20030404.html">2003 \
    年度の講習会資料</a></li>
    </ul>
</body>
</html>
Connection closed by foreign host.
# 

telnet で smtp

telnetを利用して、mailを出してみましょう。実験の為に、実験の為のsmtp server (ip address 192.168.3.49)がありますので、それを利用します。

まず、telnetで接続したら、HELOコマンドで、こちらのHost名を指定します。以下の例では、x22.kurino.homeという名前になっています。

次に、差出人の名前( e-mail address )を、MAIL From:コマンドで指定します。そして、送り先の名前をRCPT To:で指定します。

これらが正しく指定される、Mail Serverは、Recipient okを返しますので、DATAコマンドで、実際のmailの内容を入力します。

なお、mailの内容の最後には'.' (ピリオド)だけの行を入れ、Enterをおします。

mailを送りおえたら、最後に、quitで終了します。

telnet で smtp
# telnet 192.168.3.49 smtp
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 h49.private.media.cst.nihon-u.ac.jp ESMTP Sendmail \
    8.11.6/8.11.6; Tue, 18 Oct 2005 11:45:23 +0900
HELO x22.kurino.home
250 h49.private.media.cst.nihon-u.ac.jp Hello \
    IDENT:Hwr1+htKa+s49wqm+uxYozGbIplfMN72@localhost [127.0.0.1], \
    pleased to meet you
MAIL From: kurino@math.cst.nihon-u.ac.jp
250 2.1.0 kurino@math.cst.nihon-u.ac.jp... Sender ok
RCPT To: poptest
250 2.1.5 poptest... Recipient ok
DATA
354 Enter mail, end with "." on a line by itself
Hello, I'm KURINO. How do you do
.
250 2.0.0 j9I2kEg13047 Message accepted for delivery
quit
221 2.0.0 h49.private.media.cst.nihon-u.ac.jp closing connection
Connection closed by foreign host.
#

telnet で pop3

mailを送ったら、今度は、mailの受け取り方です。それにはpop3を利用します。ここでは、話を簡単にするために、パスワード(3)を暗号化せずに、入力しています。

POPを利用するには、まずuserコマンドで、Login ID (ここでは、予めpoptestという名前のAccountが、実習用に準備されています)を指定します。

次にpassコマンドで、パスワードを入力します。

これで、認証が通れば、様々なコマンドが実行できます。例えば、listで、届いているe-mail数とidが得られます。retrコマンドで、idを指定すれば、e-mailの内容が表示されます。

deleコマンドで、読みおえたe-mailを削除できます。

内容を確認しおわったら、最後に、quitで終了します。

telnet で pop3
# telnet 192.168.3.49 pop-3
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
+OK POP3 localhost v2000.70rh server ready
user poptest
+OK User name accepted, password please
pass XXXXXXXX
+OK Mailbox open, 3 messages
list
+OK Mailbox scan listing follows
1 500
2 501
3 472
.
RETR 3
+OK 472 octets
Return-Path: <kurino@math.cst.nihon-u.ac.jp>
Received: from x22.kurino.home \
    (IDENT:Hwr1+htKa+s49wqm+uxYozGbIplfMN72@localhost \
    [127.0.0.1])
by h49.private.media.cst.nihon-u.ac.jp (8.11.6/8.11.6) with SMTP \
    id j9I2kEg13047
        for poptest; Tue, 18 Oct 2005 11:46:26 +0900
Date: Tue, 18 Oct 2005 11:46:26 +0900
From: kurino@math.cst.nihon-u.ac.jp
Message-Id: \
    <200510180246.j9I2kEg13047@h49.private.media.cst.nihon-u.ac.jp>
Status:

Hello, I'm KURINO. How do you do
.
quit
+OK Sayonara
Connection closed by foreign host.
#
  1. 下の内容で、パスワードの部分はXXXXXXXXとなっていますが、実際のパスワードは勿論、これではありません。実際のパスワードは演習中にお知らせします。

実習

参考資料

  1. telnetでWebサーバに接続してみよう
  2. HTTP(Hyper Text Transfer Protocol)〜前編
  3. SMTP(Simple Mail Transfer Protocol)〜前編
  4. POP3 (Post Office Protocol version 3)

tcpdump の利用法

tcpdumpには、色々な利用法がありますが、今回は、その触りだけを紹介します。それだけでも、Networkの挙動に関する、様々な情報が得られます。

参考資料

参考資料として、以下のURLを乗せておきましょう。

なお、tcpdumpは、単純に言えば「Networkの盗聴機」と同じようなtoolです。Network管理には、便利で、欠かせないと言って良いほど、強力なtoolですが、興味本位で、他の人の通信内容を覗き込む(4)ような使い方は厳禁ですので、心に銘記して置いてください。

  1. Manpage of TCPDUMP
  2. TCPDUMPの出力を見てみよう
  1. tcpdumpの使い方を教わると、怖くてtelnetや、単純なpopなんか使えなくなってしまいます。Webだってもちょっと..

    このためにあるのが、「暗号技術」です。telnetの代わりにssh, popの代わりにapop, webでもhttpでなくhttpsを使えば、ちょっと安心かもしれません。

実験1: tcpdump を使ってみよう

実験1 の Network

一つの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

tcpdump の実行

Linux側で、次のようにしてtcpdumpを実行する。

tcpdump の実行
[root@Linux-X /root]# tcpdump -n -i eth0

ここで、tcpdumpのオプションの詳細に関しては、Manpage of TCPDUMPを参照してもらうとして、ここでは、利用しているオプションに関してのみ説明する。

時間があったら、様々なオプション(5)を試してみよう。

-n

TCP Dump中に現れるIP Addressを逆引き( Name Serverを参照)して、Host Nameに変更することをしない。

このNetworkには、Name Serverが設置されていないので、-nを付けず、標準的な振る舞いをさせると、存在しないName Serverに問い合わせをして、時間が無駄になるので、これを避けるためである。

これは、linuxのtracerouteコマンドや、pingコマンドの-nオプションと同じである(6)

-i eth0

どのInterfaceを通過するパケットをtcpdumpが監視するかを指定するオプション-iにInterface名であるeth0をつけている。

つまり、このコマンドを実行した結果eth0でやり取りされるパケットに関してのみ、tcpdumpが出力を行う。

これは、付けなくても、普通は、eth0を探してくれる(7)のだが、念のためにおこなっている。

  1. tcpdumpの対象となるNetworkには、様々なパケットが流れている。tcpdumpを(オプションを付けずに.. )そのまま利用すると、大量の情報が出力されてしまう。

    tcpdumpでは、オプションを上手に指定することにより、目的としているパケットのみを捕らえ、出力することが可能になっている。

  2. linuxでname serverが指定されている( /etc/resolv.confがある)状態でかつ、そこへの通信ができないとlinuxは、IP Addressの名前を逆引するため、通信のできないName Serverいつまでも問い合わせるので、結果の表示が極端に遅くなる。

    特に、default gatewayがないうちは、通信できないことが直に判定できるが、default gatewayを設定すると、とりあえず、通信しようとするために、gatewayを設定した瞬間に遅くなるという現象が生じたら、これが原因である。

  3. Linux PCで、routerを作った場合は、Interfaceが複数あるので、この-iオプションが重要になる。

実験 1: 他方からの通信とtcpdump の出力の観察

もう一台のHost (Linux-Y)から、Linux PC (Linux-X)に対して、色々なNetworkコマンドを実行し、パケットを送ってみよう。

もし、もう一方のHost (Linux-Y)のOSもLinuxであれば、次のようなコマンド(8)を実行して、パケットを送ってみるとよい。

ping
他方から、tcpdumpを実行しているHostに対し、pingしてみる。
ping の実行
[root@Linux-Y /root]# ping -n 192.168.1.1
traceroute
他方から、tcpdumpを実行しているHostに対し、tracerouteしてみる。
traceroute の実行
[root@Linux-Y /root]# traceroute -n 192.168.1.1
telnet
他方から、tcpdumpを実行しているHostに対し、telnetしてみる。
telnet の実行
[root@Linux-Y /root]# telnet 192.168.1.1
routed
routedを実行して、RIPで、どのようなアナウンスが行われる(9)かを確認する。
routed の実行
[root@Linux-Y /root]# /etc/rc.d/init.d/routed start

このようなNetwork関係のコマンドを実行した結果、tcpdumpとして、どのような出力が得られるかを確認しましょう。

  1. OSがWindowsのPCや、CISCO Routerの場合は、過去の資料を参照してみましょう。
  2. RIPのアナウンスは、ブロードキャストなので、他のコマンド(ping/traceroute等)と異なり、特に宛先を指定しなくても、パケットがLinux-Xに届くので、そのパケットを観測することができる。

    なお、ブロードキャストなので、SwitchとHubの違いが出ない例であることにも注意しよう。

実験2: Hub の挙動

実験2 の Network

実験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)

実験2 の内容

tcpdumpを行うHost ( Linux-X )で、次のコマンドを実行する(10)

promisc mode の設定
[root@Linux-X /root]# ifconfig eth0 promisc

実験1と同様に、Linux-Xで、tcpdumpを実行し、今度は、Linux-YからLinux-Zへ、様々な通信コマンドを実行してみる。

実験1と実験2の差はどのようなものか?

  1. 詳しくは、ifconfigのマニュアルページを参照して欲しいのですが、これによって、このinterfaceは、promisc mode、すなわち、無差別受信状態に変わります。

    一般に、unicastで投げられたフレームも、Hubを経由して、Interfaceに受信されますが、そのあて先が自分のMAC addressに該当しないかぎり、Interfaceは、そのフレームを破棄し、CPUに負担をかけない仕組みになっています(したがって、通常は、この状態)。

    しかし、今回の応用( tcpdumpで、他のHost間の通信を監視する)では、この機能が働くと、他のHost間の通信を得ることができないので、このような特別な処置が必要になります。

実験3: Switch の挙動

実験3 の Network

実験2のNetworkに対して、Hubの代わりに、Switchをいれる。


		(tcpdump)
		Linux-X				Linux-Y		Linux-Z
		[192.168.1.1]			[192.168.1.2]	[192.168.1.3]
		|				|		|
	>-------+-------------------------------+---------------+-------<
							(Switch)

実験3 の内容

実験2と全く同じ実験を行う。

実験2と実験3の差はどのようなものか?

Router と Switch/Hub との違い

実験 4 : Router によるブロードキャストドメインの分割

実験 4 の Network

Router 1台( Linux-R : Linux-PCにEthernet Cardを二枚挿して作る)に二台のHubを接続して、二つのNetworkを作る。

一方のHubに、tcpdump可能なLinx-Xと、もう一台Host (Linux-Y) (11)を付け、他方の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

  1. Hostは、Windowsでも構わない。

tcpdump の実行

Linux-X側で、次のようにしてtcpdumpを実行する。

tcpdump の実行
[root@Linux-X /root]# tcpdump -n -i eth0

実験 4 : 他方からの通信とtcpdump の出力の観察

tcpdumpと反対側にあるHost (Linux-A)から、他のHost ( Linux-B, Linux-Y )に対してNetworkコマンドを実行し、パケットを送ってみよう。

また、Linux-Aで、routedを起動し、RIPのブロードキャストが、tcpdumpの出力に現れないことを確認しよう。

実験のまとめ

この実験の結果、次の様な表を、正しく埋めることができるようになればその実験は成功である。


  \ Hub  |           |
    \    | Broadcast | Unicast
Switch\  | RIP/ARP   | ping/telnet
----------+-----------+--------------
          |  \   ○  |  \   ○
発信元    |    \     |    \
          |  ○  \   |  ×  \
----------+-----------+--------------
          |  \   ×  |  \   ○
その他    |    \     |    \
          |  ×  \   |  ×  \

おまけ

実習用の古い linux での tcpdump

最新のtcpdump ( version 3.8.x )の場合は、tcpdump -i eth0 -X -s 1024 -vvv port 110などとすればよいのですが、実習で利用しているlinuxはversionが古くて3.4です。

この場合は、tcpdump -p -i eth0 -x -s 1024 port 110とすることにより、hex dumpまでは取れるのですが、ascii表示がなされません。

このascii表示の機能を補うために、perl script pを作りました。

note-pcで、このpを利用するには、次のようにします。

このpを使って、tcpdumpをするには、次のようにします。

tcpdump -p -i eth0 -x -s 1024 port 110 -l | perl p

これで、hex dumpの後に、ascii表示が追加されます。