| この記事の要点 |
|
ARP とは
ARP (Address Resolution Protocol) は、IPv4 アドレスから MAC アドレスを解決するためのプロトコルです。OSI 参照モデルのデータリンク層 (第 2 層) と ネットワーク層 (第 3 層) を橋渡しする役割を担い、同一ネットワークセグメント内のホストが互いに通信する前に必ず使われています。
IPv6 では ARP は使われず、NDP (Neighbor Discovery Protocol) に置き換えられています。
なぜ ARP が必要なのか
IP パケットは「IP アドレス → IP アドレス」で宛先を指定しますが、実際にケーブル / 無線上を流れるイーサネットフレームは 送信元 MAC → 宛先 MAC のヘッダを持ちます。
つまり「同じ LAN にある 192.168.0.10 へ送る」場合、まずその IP に対応する MAC アドレスを知る必要があります。これを LAN 内で動的に解決するのが ARP です。
ARP の動作フロー
| ステップ | 動き | 宛先 |
|---|---|---|
| 1. ARP Request | 「192.168.0.10 の MAC は誰?」 | ブロードキャスト (FF:FF:FF:FF:FF:FF) |
| 2. ARP Reply | 「私です。MAC は aa:bb:cc:dd:ee:ff」 | ユニキャスト |
| 3. キャッシュ | 応答内容を ARP テーブルに保存 | — |
| 4. 通信 | 取得した MAC を宛先にイーサネットフレーム送信 | ユニキャスト |
ARP キャッシュ (ARP テーブル)
毎回ブロードキャストすると LAN が無駄に騒がしくなるので、解決結果はキャッシュされます。通常 OS は数分〜数十分でエントリを破棄し、再解決します。
確認コマンド
| OS | コマンド |
|---|---|
| Windows | arp -a |
| Linux | arp -a / ip neigh |
| macOS | arp -a |
# Linux/Mac
$ arp -a
? (192.168.0.1) at aa:bb:cc:dd:ee:ff [ether] on eth0
? (192.168.0.5) at 12:34:56:78:9a:bc [ether] on eth0
# Linux (推奨)
$ ip neigh
192.168.0.1 dev eth0 lladdr aa:bb:cc:dd:ee:ff REACHABLE
キャッシュのクリア
# Windows (管理者権限)
arp -d *
# Linux
sudo ip -s -s neigh flush all
ARP パケットの構造(概略)
| フィールド | 意味 |
|---|---|
| Hardware Type | 1 = Ethernet |
| Protocol Type | 0x0800 = IPv4 |
| Operation | 1 = Request / 2 = Reply |
| Sender MAC / IP | 送信元 MAC / IPv4 |
| Target MAC / IP | 宛先 MAC(Request 時は 0)/ IPv4 |
関連プロトコル
| プロトコル | 役割 |
|---|---|
| ARP | IPv4 → MAC アドレス解決 |
| RARP | MAC → IPv4 解決(現在は DHCP に置換) |
| Gratuitous ARP | 自分の IP に対する ARP を自発送信。重複検知 / 機器交換通知 |
| Proxy ARP | ルータが代理で ARP 応答する |
| NDP (IPv6) | ARP の代替。Neighbor Solicitation / Advertisement |
ARP スプーフィング (ARP poisoning)
ARP は認証機構を持たないため、悪意のあるホストが偽の ARP Reply を流すと、被害者の ARP テーブルが汚染され、トラフィックが攻撃者経由になります。中間者攻撃やセッション窃取の足がかりとして広く使われます。
対策
- Dynamic ARP Inspection (DAI): Cisco 等の L2 スイッチ機能。DHCP Snooping と組み合わせて正規 IP/MAC ペアだけを通す
- DHCP Snooping: 信頼できるポート以外からの DHCP 応答を遮断
- 静的 ARP エントリ: 重要サーバへの通信で利用 (運用負荷高)
- IDS / arpwatch: ARP テーブルの変動を監視
- セグメント分離: VLAN で攻撃面を縮小
FAQ
Q. ARP は別セグメントにも届くの?
A. 届きません。ARP はブロードキャスト (L2) ベースのため、ルータを超えません。別セグメントの宛先はデフォルトゲートウェイの MAC に向けて送られます。
Q. IPv6 では?
A. ARP は使われず、NDP が ICMPv6 のメッセージで同等の役割を担います。
Q. ARP テーブルが古い情報を返してつながらない
A. キャッシュを arp -d でクリアして再解決させると改善することがあります。
Gratuitous ARP の用途
Gratuitous ARP (GARP) は、自分の IP アドレスに対する ARP Request / Reply を自発的に LAN に流す動作です。以下の用途があります。
- IP アドレス重複検知: 起動時に「この IP は誰?」を発信し、応答があれば自分の IP が重複しているのでアラート
- 機器交換通知: 同じ IP で MAC が変わったことを LAN 内の他機器に伝え、ARP テーブルを更新させる
- HA / フェイルオーバ: 仮想 IP を引き継いだ予備機が GARP を打ち、トラフィックを自分に向ける
静的 ARP エントリの登録
セキュリティや特殊用途で、ARP キャッシュを手動固定することがあります。
# Linux: 静的エントリ追加
sudo ip neigh add 192.168.0.10 lladdr aa:bb:cc:dd:ee:ff dev eth0 nud permanent
# Windows (管理者)
arp -s 192.168.0.10 aa-bb-cc-dd-ee-ff
運用負荷が高くスケールしないため、大規模ネットワークでは Dynamic ARP Inspection (DAI) の方が現実的です。
パケットキャプチャでの観察
Wireshark や tcpdump で arp フィルタをかければ、ARP Request / Reply の流れを観察できます。トラブルシュートに有効です。
# tcpdump で ARP のみ表示
sudo tcpdump -nn -i eth0 arp
# 例の出力
# ARP, Request who-has 192.168.0.10 tell 192.168.0.5, length 28
# ARP, Reply 192.168.0.10 is-at aa:bb:cc:dd:ee:ff, length 28
関連
子ページはありません
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- Git pushした変更の取消し|revert・履歴変更と保護の注意点 2026-10-15 23:49:01
- Gitでローカルを戻す前に|reset・restoreの違いと退避範囲 2026-10-15 23:49:01
- Git rebaseの使い方|対象範囲・競合解決・pushの判断 2026-10-15 22:50:59
- Git pullの使い方|取込み先・ff-only・競合とstashの注意点 2026-10-15 22:50:59
- Git pushの使い方|送信先・タグ・force-with-leaseの条件 2026-10-15 22:12:47
- Git remoteの設定・確認・削除|SSH URLとfetch/pushの違い 2026-10-15 22:12:47
- Gitリモートリポジトリの作成|初回push・既存履歴・mirrorの注意 2026-10-15 15:48:16
- Gitのuser.name・user.email設定|local/global・確認と過去履歴の注意 2026-10-15 15:30:07
- LinuxにGitをインストール|配布元・初期設定・TLSと認証の確認 2026-10-15 15:30:06
- Git導入と初回push|Linuxサーバー・Windows/macOS・SSH設定 2026-10-15 14:51:54
- Db2のCREATE INDEX|索引定義・INCLUDEと実行計画の確認 2026-10-15 14:10:22
- Db2の自動採番|IDENTITY・ID取得とRESTARTの注意点 2026-10-15 14:10:22
- 【DB2】特定スキーマの全テーブルの全カラム情報を取得する方法 2026-10-15 13:53:15
- Db2のシーケンスとIDENTITYの違い|採番とカタログの確認SQL 2026-10-15 13:53:15
- Db2で複数カラムをUPDATEする方法|SET・WHEREと更新前の値 2026-10-15 13:53:15