1 ARPとは?
メールサーバーSMTPポートを外部公開すると、
毎日毎日不正アクセスを試みるヤツラが多いことに気づきます。
ヤツラが何を企んでいるのか、流れるパケットをWiresharkで監視してみると、
よく分からないプロトコルの通信がたくさん流れています。
それで、2022年現在いろいろな通信プロトコルについて調べている最中です。
本記事は、調べた結果であり、自分の備忘録として残しておくものです。
探せば同様の記事はすぐに見つかりますが、
こうして自分で記録を作ることによって、より理解が深まったのではないかと思っています。
今回は、ARP編です。
ARP(Address Resolution Protocol:アドレス解決プロトコル)とは、
IPv4アドレスからOSI参照モデルのデータリンク層で使用するMACアドレスを
取得するためのプロトコルです。
LANに接続されたコンピューター間で通信するためには、
IPパケットは下位のレイヤでL2ヘッダーが付加された上で伝送されることから、
MACアドレスの情報が必要となります。
ARPはIPv4の時に使用されるプロトコルです。
IPv6を使用したIPアドレスの場合は、
ICMPv6の近隣探索プロトコル(NDP)によりARPの機能が提供されています。
2 ARPの動作
ARP(Address Resolution Protocol)の仕組みは、非常にシンプルです。
「ARPリクエスト」と「ARPリプライ」と呼ばれる2種類のパケットを使用して、
IPアドレスからMACアドレスを取得します。
本章では、「ARPリクエスト」と「ARPリプライ」のパケットの流れを例示します。
2.1 ARPリクエスト
図2.1-1において、コンピューターAがコンピューターBと通信したいとします。
その時は、先ずコンピューターAから同じセグメントの全ての端末に送信するために、
ARPリクエストをブロードキャストします。
このARPリクエストのパケットの中には、
MACアドレスを知りたいノードのIPアドレス情報が入っています。
2.2 ARPリプライ
ARPリクエストはブロードキャストされるので、全ノードがこのパケットを受信します。
ARPパケットの中身を見て探索しているIPアドレスが自分(192.168.0.2)と分かった
コンピューターBは、コンピューターBのMACアドレス情報を
コンピューターAに伝えるためにARPリプライのパケットをコンピューターAだけに送ります。
これでコンピューターAはBのMACアドレスを知ることができるので、
LAN上での通信ができるようになります。
3 ARPパケット
3.1 イーサネットフレーム
ARPもICMPも、TCPやUDP、IPなどが動作するための補助的なプロトコルですが、
いずれもIPプロトコルの上位に存在するものではありません。
どちらかというと、(OSI参照モデルでいうと)IPと同じようなところに位置する
補助的なプロトコルです。
そのため、パケットの構造などもやや変則的です。
イーサネットフレーム上のプロトコル・タイプは、
イーサネットの上位に位置するプロトコルの種類を表す数値であり、
IPプロトコルならば「0x0800」となります。
これ以外に、「0x0806」のARPと、「0x8035」のRARPも使われます。
3.2 ARPパケット
ARPパケットの構造は図3.2-1に示すように非常に単純であり、
このパケットを送信元とあて先コンピューターとの間で1回やりとりします。
ARPパケットの構造は、
利用するネットワーク媒体(MACアドレスの長さ)によって長さが変わる可能性があります。
ですが、イーサネット(およびその互換技術)が広く普及した現在では、
図3.2-1に示すような構造のARPパケットがほとんどです。
- ■ハードウェア種別(0x0001)
-
ネットワークの物理的な媒体の種類を表す、16bit幅の数値である。
イーサネットではその値は「0x0001」であり、
ほかにもフレーム・リレーは0x000f、HDLCは0x0011などいくつか決まっているが
(定義はRFC1700「Assingned Numbers」などに記載)、あまり深い意味は持たない。
- ■プロトコル(0x0800)
-
ARPプロトコルで取り扱う上位のプロトコルの種類を表す。
0x0800はTCP/IPプロトコルを表す
(これはイーサネットフレーム中にある、TCP/IPプロトコルを表すタイプと同じである)。
- ■HLEN(0x06)
-
「HLEN(hardware address length)」は、MACアドレスの長さを表す。
イーサネットの場合は「6」となっており、
MACアドレスは6bytes(48bit)であることを示している。
- ■PLEN(0x04)
-
「PLEN(protocol address length)」は、
上位のプロトコルで利用されるアドレス情報の長さを表す。
Version 4のTCP/IPプロトコルではIPアドレスは4bytes(32bit)であるので、
このフィールドの値は「4」となっている。
- ■動作(ARP/RARP)
-
ARPの動作の種類を表すためのコードが入っている。
ARPプロトコルを使う場合は、最初にARPリクエストを送信し、
該当するコンピューターがARPリプライを返すというふうに動作する。
リクエストとそのリプライを区別するために2つのコードが割り当てられているが、
さらに、ARPだけでなく、
RARP(MACアドレスからIPアドレスの情報を得る)というプロトコルでも
この構造のパケットを使うため、可能な動作としては表3.2-1に示す4つがある
(ARPは必須だが、RARPは実装されていないことも多い)。
- ■送信元MACアドレス(6bytes)
-
ARPリクエストもしくはARPリクエストへの応答を送信する側のコンピューターが、
自分自身のMACアドレスを格納する。
イーサネットの場合、MACアドレスは6bytesで、
このフィールドに自分自身のMACアドレスを埋め込んでパケットを送信する。
- ■送信元IPアドレス(4bytes)
-
ARPリクエストもしくはARPリクエストへの応答を送信する側のコンピューターが、
自分自身のIPアドレスを格納する。
IPv4の場合は、IPアドレスは4bytesで、
このフィールドに自分自身のIPアドレスを埋め込んでパケットを送信する。
送信元のMACアドレスとIPアドレスは、自明なので、
このフィールドには必ず何らかの値がセットされていることになる。
- ■あて先MACアドレス(6bytes)
-
ARPの応答パケットにおいて、
ARPパケットを返送する先(つまりもともとのARPリクエストを最初に送信した側)の
コンピューターのMACアドレスがセットされる。
ARPの要求送信時には不明なので、0のままとなっている。
- ■あて先IPアドレス(4bytes)
-
ARPの要求送信時は、MACアドレスを知りたいノードのIPアドレスがセットされる。
ARPの応答パケットにおいては、
ARPパケットを返送する先(つまりもともとのARPリクエストを最初に送信した側)の
コンピューターのIPアドレスがセットされる。
以上
HTMLだと、
思うように編集することは難しく、やろうすればとっても時間が掛かります。
ですので、本記事の元となっているWordで作成したPDFを
ページ最後に貼り付けました。
役に立てていただければ、うれしく思います。
このPDFファイルは、自由に配布されてもかまいません。
ただし、再配布の際には、
入手元と著者名は明らかにしてください。
なお、上のPDFファイルの内容、また本文中の記述に、
誤字や脱字、誤った内容の記述など見つかりましたら、
下に示すフォームでご連絡いただければ幸いです。