はじめに
「社内ネットワークは信頼できる」
—多くの人がそう考えていますが、実はLAN内には昔から知られる大きな穴があります。
それが今回扱うARPスプーフィングです。
本記事では、用語解説としてARPプロトコルの仕組みと根本的な脆弱性内容を整理し、その上で実機ハンズオンにて、下記を順番に確認していきます。
- 攻撃前後のARPテーブルの変化
- arpspoof によるARPテーブルの汚染
- 透過中継(盗聴型)と偽サイト表示(フィッシング型)、2パターンの中間者攻撃
- Wiresharkによる偽のARPリプライパケットとパケット転送の観察
- DAI(Dynamic ARP Inspection)による防御
なお本記事のすべての内容は、実機のL3SW(Cisco Catalyst)とサーバ(PC模擬)で検証済みです。コマンド例・IPアドレス・MACアドレスはすべて検証で使った実値に統一し、要所には実際のスクリーンショットを証跡として掲載しています。
記事の概要
本記事は前編と後編の2部構成となっており、前編では ARPの概要及び検証環境/環境構築を行います。
実機を使ったARPスプーフィングの検証に関しましては、後編をご覧ください。
後編はこちら:【後編】社内LANは信頼できる?ARPスプーフィングの手口を実機で体感しよう
前編の内容:
・ ARPとは?
・ ハンズオンの構成
・ ハンズオンStep1: 環境構築
後編の内容:
・ ハンズオンStep2: 攻撃前のARPテーブルの確認
・ ハンズオンStep3: arpspoofによるARPテーブルの上書き
・ ハンズオンStep4: 偽サイトを表示させるパターン(フィッシング型)
・ ハンズオンStep5: Wiresharkによるパケット解析
・ ハンズオンStep6: DAI(Dynamic ARP Inspection)による防御の検証
・ まとめ
座学だけでなく実際に仮想環境で攻撃と防御を体験するハンズオンを通じて、ARPの仕組みとセキュリティ対策を深く学んでいきます。
それでは早速、前編の内容に入っていきましょう!
ARPとは?
ARPの役割とARPテーブルの仕組み
ARP(Address Resolution Protocol)は、同一L2(レイヤー2/データリンク層)セグメント内でIPアドレスからMACアドレスを解決するためのプロトコルです。
PCが同じネットワーク内の別の機器と通信する際、宛先IPアドレスは分かっていてもEthernetフレームを送るためのMACアドレスが分からなければ通信できません。そこで各端末は次のような流れでMACアドレスを解決します。
- 送信元が「このIPアドレスを持つ機器のMACアドレスを教えてください」というARPリクエストをブロードキャストで送信する
- 該当するIPアドレスを持つ機器が「自分のMACアドレスはこれです」というARPリプライをユニキャストで返す
- 送信元は受け取ったIP-MACの対応関係をARPテーブル(ARPキャッシュ)に一定時間保存し、以降の通信で再利用する
このARPテーブルは、WindowsでもLinuxでも arp -a コマンドで確認できます。
Gratuitous ARPの性質
通常のARPはリクエストに対する応答ですが、Gratuitous ARP(GARP)は誰からもリクエストされていないのに自発的に送信されるARPリプライです。
本来GARPは、
- 自分のIPアドレスがネットワーク内で重複していないかを確認する
- NIC(Network Interface Card)交換やフェイルオーバーなどでMACアドレスが変わった際に、周囲の機器のARPテーブルを速やかに更新させる
といった正当な目的で使われます。しかし裏を返せば、
「攻撃対象の端末がARPリプライを無条件で受け入れて、ARPテーブルを上書きしてしまう」
という挙動そのものが、なりすましに悪用できる性質だということになります。
ARPに認証機構がないという根本的な脆弱性
ARPの仕様上の弱点を突いた攻撃手法に、ARPスプーフィングがあります。
ARPスプーフィングとは、同一ネットワークセグメント内で通信内容を盗聴・改ざんする中間者攻撃(MITM: Man-in-the-Middle)の糸口としてよく使われる手法です。
システムのバグなどを突くわけではなく、認証機構を持たないARPプロトコルの「設計上の仕様」を逆手にとるため、対策がなされていないネットワークでは非常に成立しやすい攻撃です。
ARPスプーフィングが成立してしまう本質的な理由は、ARPというプロトコルに送信元を検証する仕組みが一切存在しないことにあります。
- ARPリプライは誰でも自由に送信できる
- 受信側は「本当にそのIPアドレスの持ち主から送られてきたものか」を確認する手段を持たない
- 受信側は受け取ったARPリプライの内容を無条件に信頼し、ARPテーブルを上書きする
つまり、攻撃者が「私が<デフォルトゲートウェイのIPアドレス>です」という偽のARPリプライを送りつけるだけで、ターゲットのARPテーブルは何の疑いもなく書き換えられてしまいます。
これがARPスプーフィングの根本原理です。 また、中間者攻撃の手口はARPスプーフィングだけではありません。
DNSの応答を偽装するDNSスプーフィングや、DHCPサーバーになりすますDHCPスプーフィングといった手法も存在します(いずれも本記事では扱わず、今回はARPスプーフィングに絞って検証します)。
ARPスプーフィングはそのなかでも、L2(データリンク層)の性質を悪用する代表的な一つという位置づけになります。
ハンズオンの構成
検証環境
今回は以下の4台構成で検証環境を用意します。
| 役割 | 機器 | 概要・用途 |
|---|---|---|
| 攻撃元 | 攻撃元PC(Kali) | VirtualBox上のKali Linuxでarpspoof や Wireshark を使用した攻撃・解析の実行 |
| 攻撃対象 | ターゲットPC(Windows) | 被害者役。サーバーと通信を行う |
| 通信先 | サーバー(AlmaLinux) | ターゲットPCからの通信を受信するWebサーバー |
| 中継 | L2SW(Catalyst 3550) | 通常のL2スイッチングおよびDAIの設定 |
以降、本文ではこの4台を 攻撃元PC / ターゲットPC / サーバー / L2SW と呼びます。すべての機器は同一の L2SW に接続し、同一L2セグメントに属する構成とします。
本記事では再現性のため、検証で実際に使ったアドレス・MAC・ポートに統一してコマンド例を記載します。ご自身の環境で試す場合は、以下の値をそれぞれの環境の値に読み替えてください。
▼ 今回のハンズオンで使ったアドレス一覧
| 役割 | IPアドレス | MACアドレス | 接続先ポート(L2SW) | インターフェイス |
|---|---|---|---|---|
| 攻撃元PC(Kali) | 192.168.56.1 | 08:00:27:5a:87:bc | Fa0/3 | eth0 (接続名 : 有線接続 1) |
| サーバー(AlmaLinux) | 192.168.56.2 | 08:00:27:70:f1:c9 | Fa0/2 | enp0s3 |
| ターゲットPC(Windows) | 192.168.56.3 | f8:e4:3b:a2:c9:2a | Fa0/1 | イーサネット (USB-LAN) |
3台はすべてVLAN 10のアクセスポートに接続し、上位スイッチやルータへのアップリンクは持たせていません。ゲートウェイも用意しない、クローズド環境の検証セグメントです。

図: ハンズオン構成。
L2SW(Cisco Catalyst) の Fa0/1 にターゲットPC、Fa0/2 にサーバー、Fa0/3 に攻撃元PC(Kali) を接続。

図: 実機の様子:① L2SW(Cisco Catalyst)の Fa0/1〜0/3 に3台を直結

図: 実機の様子:② ターゲットPC(Windows)と攻撃元PC(Kali)

図: 実機の様子:③ サーバー役の AlmaLinux
正常時はターゲットPCとサーバーが直接ARPで解決し合ったMACアドレス宛に通信しますが、攻撃が成立すると両者の通信は物理的にも論理的にも攻撃元PCを経由するようになります。
ARPスプーフィングによる通信の盗聴リスクは、実ケースとして「同一セグメント内の暗号化が不十分な社内LAN」や「不特定多数が接続するフリーWi-Fi環境」などで起こりえます。こうした環境では、同一ネットワーク内に悪意ある端末が1台存在するだけで、中間者攻撃による通信内容の盗聴や改ざんが成立してしまいます。
検証の目的について
本検証の目的は、ARPの脆弱性を突いたARPスプーフィング攻撃による偽サイト誘導の脅威を実証した上で、DAIをつかったネットワーク機器の防御機能を適用し、IP通信の安全性を回復する一連のプロセスを理解することです。
検証の流れ
- Step1: 環境構築(各機器のネットワーク設定)
- Step2: 攻撃前のARPテーブルの確認
- Step3: arpspoofによるARPテーブルの上書き
- Step4: 偽サイトを表示させるパターン(フィッシング型)
- Step5: Wiresharkによるパケット解析(偽ARPリプライ・パケット転送の観察)
- Step6: DAIによる防御の検証
ハンズオンStep1: 環境構築
3台をそれぞれ静的IPで 192.168.56.0/24 のセグメントに参加させ、サーバーには検証用のWebページを立てます。ここでは機器ごとに設定手順を分けて説明します。
攻撃元PC(Kali Linux)の準備
まず VirtualBox をインストールし、その上に Kali Linux の仮想マシン(VM)を用意します。Kali Linux 公式サイトの「Pre-built VMs」から VirtualBox 用イメージ(.ova)をダウンロードし、「仮想マシンをインポート」から取り込みます。ネットワークアダプタは VirtualBox の設定でブリッジアダプタにして、ターゲットPC・サーバーと同じL2セグメントに接続されるようにします。
攻撃には dsniff に含まれる arpspoof、解析には Wireshark を使います。最近の Kali にはほぼ最初から入っていますが、念のため確認とインストールをしておきます。
sudo apt update sudo apt install -y dsniff wireshark which arpspoof
続いて、arpspoof を撃つたびに手で振り直さなくて済むよう、静的IPを nmcli で恒久設定します。接続名はロケールによって変わり、日本語環境では 有線接続 1 になっていることが多いので、まず実際の名前を確認します。
nmcli connection show
今回は日本語環境で接続名は 有線接続 1 でした。これに対し、IPv4を手動(static)に切り替え、アドレスなどを一つずつ設定していきます。
sudo nmcli connection modify "有線接続 1" ipv4.addresses 192.168.56.1/24
反映後は ip addr で IP と MAC が設定されているか、ip route でルート内容を確認します。

図: Kali の ip addr。eth0 に MAC 08:00:27:5a:87:bc と 192.168.56.1/24 が設定されている。

図: Kali の ip route。この検証用のインターフェイス(eth0)の送信元IPが 192.168.56.1 になっている。
サーバー(AlmaLinux)の準備
サーバーのOSが AlmaLinux です。ターゲットPCはここにサーバーに向けてWebページを取りに行き、攻撃が成立するとその通信が Kali を経由するようになります。
まずはサーバー(AlmaLinux)に Web サーバー(httpd)を導入します(AlmaLinux は RHEL系なので dnf/httpdが該当)。
sudo dnf update -y sudo dnf install -y httpd
続いて nmcli で静的IPを恒久設定します。今回の環境ではデバイス名・コネクション名ともに enp0s3 で検証しました。
# 静的IPアドレスを割り当てる sudo nmcli connection modify "有線接続 1" ipv4.addresses 192.168.56.1/24 # DHCP をやめて手動(static)に切り替える sudo nmcli connection modify "有線接続 1" ipv4.method manual # ゲートウェイ・DNS は検証用セグメントでは使わないので空にしておく sudo nmcli connection modify "有線接続 1" ipv4.gateway "" sudo nmcli connection modify "有線接続 1" ipv4.dns "" # この接続を既定ルート(インターネットへの出口)にしない sudo nmcli connection modify "有線接続 1" ipv4.never-default yes # ここまでの変更を反映するため、コネクションを張りなおす sudo nmcli connection down "有線接続 1" sudo nmcli connection up "有線接続 1"
反映後、ip a で IPアドレス と MACアドレス が設定されていることを確認します。

図: enp0s3 に 192.168.56.2/24、MAC 08:00:27:70:f1:c9 が設定されている。
次に httpd を起動し、firewalld で HTTP(80番)を開けます。ここを忘れると、httpdは起動しているのにターゲットPCからサイトが表示されない、という状態になります。
sudo systemctl enable --now httpd sudo firewall-cmd --add-service=http --permanent sudo firewall-cmd --reload
最後に、ターゲットPCに見せる「サーバーのページ」を /var/www/html/index.html として配置します。
あとで攻撃を仕掛けたとき「現在画面に表示されているのはサーバー(Alma)か攻撃元(Kali)か」がひと目で分かるよう、Server: の表示を Alma にしてあります。
サーバー(Alma)のHTMLテンプレート
<!doctype html>
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Security Training Page</title>
<style>
body {
margin: 0;
font-family: Arial, sans-serif;
background: #f2f4f7;
color: #222;
}
.box {
max-width: 820px;
margin: 60px auto;
padding: 32px;
background: white;
border: 1px solid #ddd;
box-shadow: 0 12px 30px rgba(15, 23, 42, 0.12);
}
.top {
border-top: 8px solid #b21f2d;
border-bottom: 1px solid #dddddd;
padding: 24px 40px;
text-align: center;
}
.content {
margin: 32px 36px;
}
.warning {
border: 1px solid #cccccc;
background: #f7f7f7;
padding: 20px 24px;
}
.status {
margin-top: 24px;
display: flex;
gap: 12px;
justify-content: center;
}
.pill {
padding: 10px 14px;
border-radius: 999px;
font-size: 14px;
font-weight: bold;
}
.footer {
margin-top: 24px;
font-size: 14px;
color: #667085;
}
</style>
</head>
<body>
<div class="box">
<div class="top">
<h1>Security Training Page</h1>
<p>Alma / ARP Spoofing Lab</p>
</div>
<div class="content">
<div class="warning">
<h2>This is a training page hosted on AlmaLinux</h2>
<p>If this page appears unexpectedly, the traffic path may have changed.</p>
<p>This is page is used for a controlled ARP spoofing lab.<br>
Do not enter real IDs, passwords, or personal information.</p>
<p><strong>Server:</strong> Alma Linux</p>
</div>
<div class="check">
<h2>Check Points</h2>
<ul>
<li>Check the URL shown in the browser.</li>
<li>Check whether the page uses HTTP.</li>
<li>Check the ARP table on the client.</li>
<li>Check ARP packets with Wireshark.</li>
</ul>
</div>
<div class="status">
<div class="pill">LAB ONLY</div>
<div class="pill">HTTP TEST</div>
<div class="pill">NO REAL DATA</div>
</div>
<p class="footer">Training Lab / ARP Spoofing Verification</p>
</div>
</div>
</body>
</html>ターゲットPC(Windows)の準備
ターゲットPCは、普段使いの Windows PC をそのまま L2SW につないで 192.168.56.3 を割り当てます。今回の PC には有線LANポートが無かったので、USB-LANアダプタで有線ポートを増設しました。まずケーブルを L2SW(他の2台と同じ VLAN のポート)に挿してリンクを張ってから設定します。
設定は「ネットワーク接続」画面から行います。Win + R →ncpa.cpl で開き、増設した USB-LAN の「イーサネット」をダブルクリック し「プロパティ」から「インターネット プロトコル バージョン4 (TCP/IPv4)」を選択します。
| 項目 | 値 |
|---|---|
| IP アドレス | 192.168.56.3 |
| サブネット マスク | 255.255.255.0 |
| デフォルト ゲートウェイ | 空欄 |
| DNS サーバー | 空欄 |

図: TCP/IPv4 のプロパティ。「次の IP アドレスを使う」で IP アドレスとサブネットマスクを設定する。
管理者権限の PowerShell でも設定できます。
netsh interface ipv4 set address name="イーサネット" static 192.168.56.3 255.255.255.0 netsh interface ipv4 set dnsservers name="イーサネット" static none
設定後、ipconfig /all で IPv4 アドレスが 192.168.56.3(優先) になっていれば成功です。
ipconfig /all

図: ターゲットPCの ipconfig /all。IPv4 が 192.168.56.3(優先)、物理アドレスは F8-E4-3B-A2-C9-2A。
最後に、3台を起動した状態でターゲットPCから疎通確認をしておきます。
ping 192.168.56.1 # 攻撃元PC(Kali) に届くか ping 192.168.56.2 # サーバー(Alma) に届くか
-t を付けて連続 ping を流しておくと、あとで攻撃・防御を切り替えたときに通信断が起きないか(あるいはどこで途切れるか)をリアルタイムに確認できます。


図: pingで疎通できている状態。
ターゲットPCのブラウザで http://192.168.56.2 を開くと、サーバーに置いた「サーバーのページ」(Server: Alma Linux)が表示されます。この画面が、Step4で偽ページに置き換わるかどうかを確認する基準になります。

図: 平常時。URL 192.168.56.2 にサーバーのWEBページ(Server: Alma Linux)が出ている。
L2SW側の登録内容
L2SW側では、3台が同じ VLAN 10 のアクセスポート(Fa0/1〜0/3)に収容されていることを確認しておきます。show vlan brief と show mac address-table で、各ポートに正しいMACが学習されていれば土台はOKです。
L2SW1#show vlan brief VLAN Name Status Ports ---- -------------------------------- --------- ------------------------------- 10 VLAN0010 active Fa0/1, Fa0/2, Fa0/3 L2SW1#show mac address-table 10 0800.275a.87bc DYNAMIC Fa0/3 ← Kali(.1) 10 0800.2770.f1c9 DYNAMIC Fa0/2 ← Alma(.2) 10 f8e4.3ba2.c92a DYNAMIC Fa0/1 ← ターゲット(.3)
まとめ
本記事の前編では、下記の内容について解説しました。
- ARPとは?
- ハンズオンの構成
- ハンズオンStep1: 環境構築
後編の記事では実機でARPスプーフィングの手口を検証していきます。
後編はこちら:【後編】社内LANは信頼できる?ARPスプーフィングの手口を実機で体感しよう


