【ARP】ARPプロトコル概要

1 ARPとは?

メールサーバーSMTPポートを外部公開すると、
毎日毎日不正アクセスを試みるヤツラが多いことに気づきます。

ヤツラが何を企んでいるのか、流れるパケットをWiresharkで監視してみると、
よく分からないプロトコルの通信がたくさん流れています。

それで、2022年現在いろいろな通信プロトコルについて調べている最中です。

本記事は、調べた結果であり、自分の備忘録として残しておくものです。
探せば同様の記事はすぐに見つかりますが、
こうして自分で記録を作ることによって、より理解が深まったのではないかと思っています。

今回は、ARP編です。

ARPAddress Resolution Protocol:アドレス解決プロトコル)とは、
IPv4アドレスからOSI参照モデルデータリンク層で使用するMACアドレス
取得するためのプロトコルです。

LANに接続されたコンピューター間で通信するためには、
IPパケットは下位のレイヤでL2ヘッダーが付加された上で伝送されることから、
MACアドレスの情報が必要となります。

ARPIPv4の時に使用されるプロトコルです。
IPv6を使用したIPアドレスの場合は、
ICMPv6近隣探索プロトコル(NDP)によりARPの機能が提供されています。

2 ARPの動作

ARPAddress 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 イーサネットフレーム

ARPICMPも、TCPUDPIPなどが動作するための補助的なプロトコルですが、
いずれも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」であり、
ほかにもフレーム・リレー0x000fHDLC0x0011などいくつか決まっているが
(定義はRFC1700「Assingned Numbers」などに記載)、あまり深い意味は持たない。

■プロトコル(0x0800)
ARPプロトコルで取り扱う上位のプロトコルの種類を表す。
 
0x0800TCP/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だけでなく、
RARPMACアドレスから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ファイルの内容、また本文中の記述に、
誤字や脱字、誤った内容の記述など見つかりましたら、
下に示すフォームでご連絡いただければ幸いです。

お問い合わせ