【ちょっと座学】ネットワークの話
先の記事でpingの通信をWiresharkでキャプチャしていろいろ説明していますが、ARPとか、アドレス解決とか、キーワードを説明していないので、たぶん消化不良ですよね。パケットの世界で何が起きているのかを理解するには、ネットワークについて学習する必要があります。ちょっと座学しましょう。
ネットワーク
ネットワークという言葉はいろんなシーンで使われますが、実はTPOにあわせて少しずつニュアンスが違います。基本的にコンピューターの世界でネットワークという言葉は規模の大小にかかわらず、コンピューターとコンピューターを通信でつなぐことを指します。
- 大きなスケールだと、世界中に張り巡らされたインターネットはネットワークです。
- 中小のスケールだと、企業や家庭などの組織内のLANもネットワークです。
- 企業の拠点のLAN同士(東京~大阪など)を接続するために通信キャリアが提供するものはWANと呼ばれますが、これもネットワークです。
- PCとルーターの間を無線LANで接続する場合、これもネットワークです。
- PCとPCをLANケーブルで直接接続した場合、このLANケーブルはネットワークです。
最小構成のネットワーク
PCとPCをLANケーブル(クロスケーブル)で接続した場合、最小構成のネットワークができます。ポイント・ツー・ポイントでつなぐだけでもネットワークと呼んでかまいません。
メディア
LANケーブルは銅線です(ここではそう解釈します)。コンピューターはこの銅線に電気信号を流して他のコンピューターに信号を伝えます。
- 銅線は電気信号を伝えるメディア(媒体)です。
- 同様に、光ファイバーは光信号を伝えるメディアです。
- 同様に、空間は電波信号を伝えるメディアです。
Media Access Control(MAC)
メディアを介してコンピューター間の相互アクセスを実現する制御のことをMedia Access Control(MAC)と呼びます。具体的には、メディアにどんな信号を流せばどういう意味になるのかを定めたルール(プロトコル)や、それを実装したものです。
MACアドレス
メディアに接続されたLANアダプタを識別するために使用する48ビットの識別情報をMACアドレスと呼びます。MACアドレスはLANアダプタに対して重複しないように一意に割り当てられます。
MACアドレスを重複させないため、IEEEという団体が番号を管理しています。上位の24ビットを企業(メーカー)に割り当てます。割り当てられた企業は自分の製品で重複しないように下位の24ビットを決定します。
Ethernet
メジャーなLANの規格です。もともとは同軸ケーブル(太い銅線みたいなもの)に複数のコンピューターを繋いで通信するバス型のネットワークです。バス型なので複数のコンピューターがたまたま同時に喋ろうとすると信号の衝突(コリジョン)が発生します。
リピータハブ
同軸ケーブルは扱いにくいので、各コンピューターとハブ状に接続できるようにした、電気信号をリピートする機器(リピータ)をリピータハブといいます。リピータハブは後述のスイッチングハブのように賢くないので、バカハブとも呼ばれます。物理的にはスター型のネットワークですが、論理的には前述の同軸ケーブルを使用したEthernetと同じバス型のネットワークです。
スイッチングハブ
リピータハブでは、あるコンピューターが流した電気信号はリピータハブに接続されているすべてのコンピューターに伝わってしまう(ブロードキャストされてしまう)ので、ネットワークの使い方が非効率です。本来データを送信したい宛先のMACアドレス以外には電気信号を伝えないようにしてスイッチのように振る舞うのがスイッチングハブです。
フレーム(MACフレーム)
Ethernet上でやりとりするデータの単位はフレーム(MACフレーム)と呼びます。
以下の記事を参考に理解を深めてください。(リンクさせていただきます)
Ethernet LAN - イーサネットフレームのフォーマットとMACアドレス
フレームのタイプには0x0800(IPv4)や0x0806(ARP)が指定できます。MACフレームの上でIPv4やARPのプロトコルは実現されます。
Media Access Controlの限界
EthernetのようにMedia Access Controlによってコンピューターを接続するネットワークは、そこにつなぐことができるコンピューターの台数に制限があります。電気信号や電波が効率よく伝わる距離には限界があるため、世界中のコンピューターを一つのメディアに接続して通信することはできません。また、バス型のネットワークでは接続するコンピューターの台数が増えると、ネットワークが混雑して通信速度が低下するという問題もあります。つまり、一つの大きなEthernetを用意して、世界中のみんながそこにつなぐという方法は機能しません。ネットワークの規模を大きくするには複数のEthernetに分割してそれらを相互に接続する技術(インターネットワーキング)が必要になります。
ルーター(ゲートウェイ)
EthernetとEthernetを接続する機器がルーターです。 正確に言うと、接続されるネットワークは違う規格のものでも構わないので、Ethernetと光回線でも、無線LANでもかまいません。ここでは話を単純にするため、すべてEthernetとします。
ルーターを導入する場合、1つ1つのEhternetはセグメントと呼ばれます。ネットワーク全体をみたとき、分割されたものの一部という意味です。ルーターはセグメントの出入り口の役割を果たすのでゲートウェイという呼び方もされます。デフォルトゲートウェイでおなじみですね。
セグメントの数を増やしてルーター間をネットワークで相互に接続すれば、ネットワークの規模を拡大することができます。
EthernetのようなMedia Access Controlではメディアにブロードキャストして通信相手にフレームを送信しますが、ルーターの接続によって拡大されたネットワークでブロードキャストしてしまうと、ネットワークはすぐに飽和してまともに機能しなくなります。したがって、ブロードキャスト以外の方法でルーター間で効率よくデータを転送する仕組みが必要になります。IP(Internet Protocol)のようなネットワーク層のプロトコルがこの問題を解決します。
IP(Internet Protocol)
ネットワーク間でパケットを中継する仕組みを提供するプロトコルです。現在のインターネットのような世界規模の巨大なネットワークが実現できているのは、IPが貢献するところが大きいです。IPv4とIPv6のバージョンがありますが、ここではIPv4で話を進めます。
パケット
Ethernet上でやりとりするデータの単位はフレーム(MACフレーム)でしたが、Internet Protocol上でやりとりするデータの単位はパケットと呼びます。パケットはサイズが大きい場合、複数のフレームに分割され送信されます。逆に受信側はフレームを組み立ててパケットを復元します。
IPアドレス
Internet Protocolでは、IPアドレスという、MACアドレスとは別のアドレス体系を使用します。IPアドレスはネットワーク部とホスト部で構成されています。つまり、IPアドレスはネットワークを識別することができるようになっています。この点はMACアドレスとの大きな違いです。
詳細は以下のサイトを参考にして理解を深めてください。(リンクさせていただきます)
ただし、クラスAとかクラスBといったIPアドレスのクラスは現在では重要ではないので、さらっと読み飛ばしてください。現在はアドレスクラスではなくCIDRという仕組みを使います。以下のサイトを参考にしてください。(リンクさせていただきます)
ルーティング
IPアドレスを導入することでネットワークを識別できるようになったので、ルーターは受信したパケットのIPアドレスのネットワーク部をもとに、パケットをどのネットワークに中継すればよいのかを判別できます。ルーターに直接つながっているネットワーク宛のパケットならば、そのネットワークのセグメントにパケットを流します。セグメント内で特定のコンピューターにフレームを届けるのは、従来通りEthernetのようなMedia Access Controlの役割です。
IPアドレスとMACアドレス
前述のように、ルーターをまたがって宛先ネットワークへパケットを届けるためにはIPアドレスを使用します。Ethernetのセグメント内でフレームを届けるにはMACアドレスを使用します。LANアダプターは製造時にMACアドレスが割り振られます。IPアドレスは組織内のネットワークの管理者がMACアドレスに対して割り当てます。
アドレス解決
同じEthernetにつながっているコンピューター間でIPで通信するケースを考えましょう。IPでパケットの送信を開始する際、宛先IPアドレスは事前に何らかの方法で分かっているものとします。パケットを分割してフレームにする際、宛先のMACアドレスが必要となります。IPアドレスから対応するMACアドレスを決定することを「アドレスを解決する」という言い方をします。アドレスを解決するには、IPアドレスとMACアドレスの対応テーブルを保持し、それを利用することで実現します。この対応テーブルは静的に設定する方法と、動的に問い合わせを行って設定する方法があります。後者を実現するプロトコルがARP(Address Resolution Protocol)です。また、この対応テーブルをARPテーブルと呼びます。
詳細については以下のサイトを参考にしてください。(リンクさせていただきます)
コンピューターネットワークがどういうものなのかという、わりと壮大な回り道をして、最後はアドレス解決の話に戻ってきました。なんとなく理解したところで、前回のパケットキャプチャの内容を読み返してみてください。
Windows Serverへのpingのトラブルシューティング
トラブルシューティング
先の手順ではpingは失敗してしまいます。一体何が問題なのでしょうか?Wiresharkでパケットを覗いてみましょう。
1行目
ARP(Adress Resolution Protocol)のrequestメッセージがnetowork1にブロードキャストされています。Info欄に要約が示されているように、10.0.1.1(server1)が10.0.1.2(server2)のMACアドレスを問い合わせています。
2行目
10.0.1.2のIPアドレスに対応するMACアドレスは08:00:27:27:56:ffですよというARPのreplyメッセージが返ってきています。これで、10.0.1.2のIPアドレスの宛先にパケットを送信するためのMACアドレスが解決できました。
3行目
10.0.1.2のIPアドレスに対応するMACアドレスを宛先に設定し、network1にパケットを送信しています。しかし、応答は返ってきませんでした。([No response seen])
これらのことから以下のことがわかります。
- IPアドレスからMACアドレスの解決は問題なし(10.0.1.2のアドレスが割当たっているネットワークアダプターのコンピューターがネットワーク上に存在している)
- pingのrequestメッセージは送信されている
- pingのresponseメッセージが返ってこない
こうなると、どこかでパケットがフィルターされているのではないかという疑いが出てきます。実は、Windows Serverはデフォルトでpingが使用するICMPv4のメッセージをWindowsファイアーウォールが許可していません(フィルターしています)。これは最初はみんなハマります。WindowsファイアーウォールでICMPv4を許可しましょう。
WindowsファイアーウォールでICMPv4を許可する
- Windowsファイアーウォールを開きます。
- [受信の規則]で[新しい規則]をクリックします。
- カスタムを選択します。
- すべてのプログラムを選択します。
- ICMPv4を選択します。
- 任意のアドレスを選択します。
-
接続を許可するを指定します。
-
すべてチェックします。
-
任意の識別しやすい名前をつけます。
-
上記の手順でserver1とserver2とも設定します。
- 10.0.1.1(server1)から10.0.1.2(server2)にIPアドレス指定でpingが通ることを確認します。今度は成功します。パケットをキャプチャするとICMPのreplyメッセージが返っていることがわかります。
- 10.0.1.2(server2)から10.0.1.1(server1)にIPアドレス指定でpingが通ることを確認します。今度は成功します。
以上でserver1とserver2の間でpingによる疎通確認ができるようになりました。
環境構築(ネットワーク)
内部ネットワークの設定(server1, server2)
VirtualBoxのネットワークアダプターの内部ネットワークを使用し、仮想マシン間でのみ通信可能なクローズドなネットワークを作成します。
以下の設定をserver1とserver2に対して実施してください。
- 仮想マシンをシャットダウンしておきます。
- 仮想マシンのネットワーク設定を開きます。アダプター1で、NATを無効化します。
- アダプター2で内部ネットワークを設定します。名前はnetwork1とします。プロミスキャスモードはWiresharkでキャプチャするために必要なのですべて許可とします。
- 仮想マシンを起動してログインします。
- ネットワーク接続を開きます。アダプターの名前をnetwork1に変更します。ダブルクリックします。
- プロパティをクリックします。
- 演習で使用しないのでTCP/IPv6はオフにします。
- TCP/IPv4をダブルクリックします。固定IPアドレスを設定します。server1の場合は10.0.1.1、server2の場合は10.0.1.2とします。この時点ではデフォルトゲートウェイとDNSは未設定とします。
- コマンドプロンプトを起動し、ipconfigを実行します。アドレスとサブネットマスクが正しく設定されていることを確認します。
- 自分のアドレスにpingを実行して正常に応答があることを確認します。
- server1、server2について上記の設定を行ってください。
疎通確認
server1からserver2へ、server2からserver1へpingが通るようにします。
確認
pingは成功しましたか?
Wiresharkでネットワークに流れるデータを確認してみる
演習用ネットワークを構築する前に、ホストOSがつながっているネットワークにどのようなデータが流れているのかちょっと見てみましょう。
- ホストOSにWiresharkをインストールし、起動してください。
- ネットワークアダプターが検出されるので、ダブルクリックしてキャプチャを開始してください。
- 何も操作しなくてもネットワークに滝のようにデータが流れていくのがわかります。
職場のネットワークは多くのネットワーク機器が様々なデータを頻繁にやりとりしており、特定の通信のみをトレースして勉強するのには少しノイズが多いです。演習ではクローズドなネットワークを構築して特定のノード間での通信の振る舞いを観察します。
仮想環境へのツール類のインストール
以下のツールをサーバー、クライアントの各OSにインストールしてください。
Wireshark
ネットワークアナライザです。LANを流れるパケットを観察してTCP/IPに対する理解を深めるために使用します。
Stable Release の Windows Installer (64-bit) をインストールして下さい。インストール後は再起動が必要です。
Fiddler
プロキシ型のWebデバッグツールです。WiresharkはLANに流れるすべてのパケットを対象に解析することができますが、こちらはHTTP/HTTPSに特化しています。Web開発で便利な様々な機能を利用できます。
Download Fiddler Web Debugging Tool for Free by Telerik
emailアドレスを入力するとダウンロードが始まります。
サクラエディタ
とてもメジャーな国産エディタです。メモ帳ではできないことをいろいろできます。
Sakura Editor download | SourceForge.net