arp-scan
- LAN内のデバイスを高速検出するネットワークスキャンツール -
ネットワーク上に接続されている機器を素早く特定したい。そんなときに活躍するのがarp-scanです。
arp-scanは、データリンク層(第2層/L2)ベースでARPパケットを送信し、IPアドレスとMACアドレスを効率よく収集できるネットワーク探索ツールです。
本記事では、arp-scanのインストール方法からコマンドの使い方、主要オプションをステップごとに解説し、実演デモを通じて実際の操作イメージもつかめるように構成しています。
さらに、実際に筆者が遭遇したトラブルとその対処法も紹介しているため、ハンズオン形式で手を動かしながら学びたい方に最適な内容です。
arp-scanの基礎知識
arp-scanとは
arp-scanは、ARP(Address Resolution Protocol)を利用してローカルネットワーク上の機器を検出するネットワーク探索ツールです。
ARPとは、IPアドレスからMACアドレスを解決するためのプロトコルであり、OSI参照モデルのデータリンク層(第2層/L2)で動作します。
具体的には、指定したIPレンジに対してARPリクエストを送信し、応答を返したホストのIPアドレス・MACアドレス・ベンダー情報を一覧表示します。
例えば、192.0.2.0/24のネットワークに対して実行した場合、最大256ホストに対してARPリクエストを送信し、応答のあったホストを一覧化します。
実行結果例
192.0.2.10 00:11:22:33:44:55 Cisco Systems, Inc
192.0.2.100 aa:bb:cc:dd:ee:ff BUFFALO.INC
192.0.2.150 11:22:33:44:55:66 (Unknown)このように、IPアドレス・MACアドレス・ベンダー情報を一度に取得できる点が、arp-scanの大きな特徴です。
主な特徴・できること
- ローカルネットワーク内のホストを網羅的に列挙できる
- IPアドレスと紐付いたMACアドレスも取得できる
- MACアドレスからベンダー(製造元メーカー)を特定できる
- OSやサービスに依存せず、ほぼすべての機器(PC・スマホ・IoTなど)を検出可能
- データリンク層(第2層/L2)で動作するため、同一サブネット内のスキャンに特化
- ARPリクエストを送信するので、pingスキャンでは検出できないホストも検出できる
- スキャン範囲(CIDR指定など)を柔軟に設定できる
- 結果をスクリプトや他ツールと連携しやすい
- オープンソース
ネットワーク内のアクティブな機器を可視化するために用いられ、未使用IPアドレスの把握や不正接続機器の特定などの用途にも活用されています。
arp-scanが重宝される理由
ネットワーク探索ツールは数多く存在しますが、arp-scanが特にローカルネットワーク調査において使用される理由は、以下の技術的特性にあります。
データリンク層(第2層/L2)ベースのため検出精度が高い
ICMP(ping)ベースのスキャンでは、ファイアウォールやホストの設定によって応答がブロックされることがあります。一方、ARPはローカルネットワーク内で必須のプロトコルであるため、多くの機器が応答します。そのため、ICMP応答を無効化しているホストでも、arp-scanであれば高い確率で検出できます。
MACアドレス情報が取得できる
IPアドレスだけでなくMACアドレスも同時に取得できるため、以下のような分析が可能です。
- 未許可デバイスの検出(例:私物端末の接続)
- ベンダー情報から機器種別の推定(例:ネットワーク機器、IoT機器 など)
シンプルで再現性が高い
コマンドがシンプルであり、スクリプトへの組み込みも容易です。脆弱性診断やペネトレーションテストの初期フェーズにおいて、安定した結果を得やすい点も評価されています。
arp-scanのインストール
arp-scanは軽量かつ依存関係の少ないツールで、多くのLinuxディストリビューションで容易に導入できます。このセクションでは、実務や学習環境でよく利用されるKali LinuxおよびUbuntuへの導入手順を解説します。
Kali Linuxの場合
Kali Linuxでは、arp-scanは標準ツールとしてあらかじめインストールされています。そのため、追加作業は必要なく、即座に利用可能です。
インストール済みであることは、以下のコマンドで確認できます。
実行パスの確認
$ which arp-scan
/usr/sbin/arp-scanバージョンの確認
$ arp-scan -V
arp-scan 1.10.0
Copyright (C) 2005-2022 Roy Hills
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
libpcap version 1.10.6 (64-bit time_t, with TPACKET_V3)
Built with libcap POSIX.1e capability support.Ubuntuの場合
Ubuntuでは、arp-scanは公式リポジトリに含まれており、APTパッケージ管理システムを用いて簡単に導入できます。
パッケージリストの更新
$ sudo apt updateまずはパッケージリストを最新の状態に更新します。これにより、最新バージョンのarp-scanを取得できるようになります。
パッケージ情報の確認
$ apt show arp-scan
Package: arp-scan
Version: 1.10.0-2build2
Priority: extra
Section: universe/admin
Origin: Ubuntu
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Original-Maintainer: Debian Security Tools <team+pkg-security@tracker.debian.org>
Bugs: https://bugs.launchpad.net/ubuntu/+filebug
Installed-Size: 1,601 kB
Depends: libc6 (>= 2.38), libcap2 (>= 1:2.10), libpcap0.8t64 (>= 1.5.1)
Recommends: libwww-perl, libtext-csv-perl, ieee-data
Homepage: https://github.com/royhills/arp-scan
Download-Size: 492 kB
APT-Sources: http://jp.archive.ubuntu.com/ubuntu noble/universe amd64 Packages
Description: arp scanning and fingerprinting tool
arp-scan is a command-line tool that uses the ARP protocol to discover and
fingerprint IP hosts on the local network. It is available for Linux and BSD
under the GPL licenceインストール前に、パッケージの詳細情報を確認します。バージョンや依存関係、概要説明などを把握できます。
- Version:パッケージのバージョン
- Depends:依存ライブラリ
- Description:パッケージの概要
インストール状況の確認
$ apt list --installed | grep arp-scan
(未インストールの場合は何も出力されません。)念のため、既にインストールされているかを確認します。
arp-scanのインストール
$ sudo apt install arp-scanarp-scanパッケージをインストールします。
インストール後の確認
実行パスの確認
$ which arp-scan
/usr/sbin/arp-scanバージョンの確認
$ arp-scan -V
arp-scan 1.10.0
Copyright (C) 2005-2022 Roy Hills
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
libpcap version 1.10.4 (with TPACKET_V3)
Built with libcap POSIX.1e capability support.基本的な使い方
arp-scanはrawソケットを利用するため、実行には管理者権限(rootまたはsudo)が必要です。
arp-scanコマンドの実行方法
最もシンプルなコマンド
$ sudo arp-scan -l
or
$ sudo arp-scan --localnetarp-scanでローカルネットワーク全体をスキャンするには、-l(--localnet)オプションを指定します。
例えば、ネットワークインターフェースのIPアドレスが192.0.2.11/24の場合、192.0.2.0/24のすべてのホスト宛てにARPリクエストを送信し、応答したホストのIPアドレスとMACアドレスを一覧表示します。
ネットワークインターフェースを指定したスキャン
複数のNICが存在する環境や仮想マシン上で複数のネットワークアダプターを設定している場合、インターフェースを明示的に指定します。インターフェースを指定しないとデフォルトのインターフェースが適用されるため、意図しないネットワークに対してスキャンされる可能性があります。
$ sudo arp-scan -l -I eth0
or
$ sudo arp-scan -l --interface=eth0-I (--interface):使用するネットワークインターフェース
eth0やenp3s0、wlan0など、システムに搭載されたインターフェース名を引数に指定します。
実行結果の見方
実行結果のサンプル
192.0.2.10 00:11:22:33:44:55 BUFFALO.INC
192.0.2.100 aa:bb:cc:dd:ee:ff Cisco Systems, Inc
192.0.2.150 11:22:33:44:55:66 (Unknown)- 第1カラム(IPアドレス):応答したホストのIPv4アドレス
- 第2カラム(MACアドレス):ホストのMACアドレス
- 第3カラム(ベンダー情報):MACアドレスから推定されるメーカー名
ベンダーの識別には、ieee-oui.txtとmac-vendor.txtが使用されます。
- /usr/share/arp-scan/ieee-oui.txt
- /etc/arp-scan/mac-vendor.txt
ieee-oui.txtは、IEEEの登録データから生成されます。mac-vendor.txtには、追加のMACアドレスとベンダーのマッピングが含まれており、カスタムマッピングを追加するために使用します。
get-ouiコマンドを使用すると、IEEEレジストリから最新データを取得して、ieee-oui.txtを更新できます。
get-ouiコマンドの実行例
$ sudo get-oui -v
Renaming /usr/share/arp-scan/ieee-oui.txt to /usr/share/arp-scan/ieee-oui.txt.bak
Opening /usr/share/arp-scan/ieee-oui.txt for output
Processing IEEE IAB registry data from file:///var/lib/ieee-data/iab.csv
Downloaded 381908 bytes
4575 IAB entries written to /usr/share/arp-scan/ieee-oui.txt
Processing IEEE MAM registry data from file:///var/lib/ieee-data/mam.csv
Downloaded 608108 bytes
5418 MAM entries written to /usr/share/arp-scan/ieee-oui.txt
Processing IEEE OUI registry data from file:///var/lib/ieee-data/oui.csv
Downloaded 3372302 bytes
35816 OUI entries written to /usr/share/arp-scan/ieee-oui.txt
Processing IEEE OUI36 registry data from file:///var/lib/ieee-data/oui36.csv
Downloaded 557084 bytes
6079 OUI36 entries written to /usr/share/arp-scan/ieee-oui.txt
Total of 51888 MAC/Vendor mappings written to /usr/share/arp-scan/ieee-oui.txt-vオプション:詳細な進行状況を出力
ヘルプコマンド
使用可能なオプションの一覧は、以下のコマンドで確認できます。
$ arp-scan -h
or
$ arp-scan --help主なオプション
arp-scanには多数のオプションが用意されており、目的に応じて柔軟にスキャンを制御できます。ここでは、使用頻度の高いオプションを「IPアドレス指定」「スキャン制御」「出力・表示」の3カテゴリに分けて解説します。
IPアドレス指定
特定のIPアドレスのみスキャンする
ローカルネットワーク全体ではなく、特定のIPアドレスを指定してスキャンすることもできます。
単一のIPアドレス
$ sudo arp-scan 192.0.2.1CIDR形式
$ sudo arp-scan 192.0.2.0/24範囲指定
$ sudo arp-scan 192.0.2.1-192.0.2.50複数指定(スペース区切り)
$ sudo arp-scan 192.0.2.1 192.0.2.10 192.0.2.100ファイル読み込み(-f、--file)
$ sudo arp-scan -f targets.txtスキャン対象のIPアドレスをファイルから読み込むオプションです。ファイルのフォーマットは、IPアドレス、範囲指定、CIDR表記で記述します。
targets.txtの例
192.0.2.1
192.0.2.10-192.0.2.100
192.0.2.0/24当サイトの検証環境では、ファイルを一般ユーザーのホームディレクトリに配置すると、読み取り権限エラーが発生しました。
$ sudo arp-scan -f /home/kali/targets.txt
Cannot open /home/kali/targets.txt: Permission deniedrootユーザーがアクセス可能なディレクトリへ配置することで、正常に動作することを確認済みです。(例./root直下 など)
$ sudo arp-scan -f /root/targets.txtスキャン制御
送信回数(-r、--retry)
$ sudo arp-scan -l -r 5
or
$ sudo arp-scan -l --retry=5ARPリクエストの再送回数を指定します。(デフォルト:2回)
ネットワークの遅延やパケットロスが発生しやすい環境では、再送回数を増やすことで検出漏れを減らせます。一方、安定した環境では再送回数を減らすことでスキャン時間を短縮できます。
| 再送回数 | 用途の目安 |
|---|---|
| 1 | 高速スキャンを優先する場合 |
| 2(デフォルト) | 一般的な環境 |
| 3〜5 | 不安定なネットワークや無線LAN環境 |
待機時間(-t、--timeout)
$ sudo arp-scan -l -t 1000
or
$ sudo arp-scan -l --timeout=1000各ホストからのARPレスポンスを待機する時間をミリ秒(ms)単位で指定します。(デフォルト:500ms)
レイテンシが高いネットワークや、応答の遅いデバイス(組み込み機器・IoT機器など)を対象にする場合、待機時間を大きめに設定すると検出率が向上します。
# タイムアウトを1秒(1000ミリ秒)に設定(応答の遅いIoT機器への対応)
sudo arp-scan -l -t 1000
# タイムアウトを200ミリ秒に短縮(高速スキャン優先)
sudo arp-scan -l -t 200送信間隔(-i、--interval)
sudo arp-scan -l -i 100
or
sudo arp-scan -l --interval=100
ARPリクエストの送信間隔(ミリ秒)を指定します。(デフォルト:2ミリ秒)
送信間隔を広げることで、ネットワーク機器への負荷を低減できます。特に、スイッチやルーターの処理能力が限られている環境、または本番稼働中のネットワークで慎重にスキャンを行う際に有効です。
送信帯域(-B、--bandwidth)
# 帯域幅を1,000,000bps(1Mbps)に設定
$ sudo arp-scan -l -B 1000000
or
$ sudo arp-scan -l --bandwidth=1000000ARPリクエストの送信に使用する帯域幅をビット/秒(bps)単位で指定します。(デフォルト:256000ビット/秒)
出力・表示
ベンダー情報を非表示(-q、-quiet)
$ sudo arp-scan -l -q
or
$ sudo arp-scan -l --quiet
# 出力例
192.0.2.10 00:11:22:33:44:55
192.0.2.100 aa:bb:cc:dd:ee:ff
192.0.2.150 11:22:33:44:55:66IPアドレスとMACアドレスのみを出力します。(ベンダー情報は表示しない。)
ヘッダーとフッターを非表示(-x、--plain)
$ sudo arp-scan -l -x
or
$ sudo arp-scan -l --plainヘッダーやフッターを非表示にし、検出結果のみを出力します。
応答時間を出力(-D、--rtt)
$ sudo arp-scan -l -D
or
$ sudo arp-scan -l --rtt
# 出力例
192.0.2.10 00:11:22:33:44:55 BUFFALO.INC RTT=0.407 ms
192.0.2.100 aa:bb:cc:dd:ee:ff Cisco Systems, Inc RTT=0.237 ms
192.0.2.150 11:22:33:44:55:66 (Unknown) RTT=0.387 ms各ホストからの応答時間(RTT:Round Trip Time)を出力します。
出力フォーマット(-F、--format)
$ sudo arp-scan -l -F '${ip}\t${mac}\t${vendor}'
or
$ sudo arp-scan -l --format='${ip}\t${mac}\t${vendor}'※\t:タブ
出力フォーマットをカスタマイズするためのオプションです。フィールド指定子を使って、出力する項目や順序を定義します。
${ip}:IPアドレス${mac}:MACアドレス${vendor}:ベンダー名${rtt}:応答時間(RTT)
CSVやTSV形式で実行結果を保存したい場合、-Fオプションと>リダイレクトやteeコマンドを組み合わせる使い方が実用的です。
# 例)リダイレクトを使って、CSVファイルに出力
$ sudo arp-scan -l -F '${ip},${mac},${vendor}' > output.csv
# 例)teeコマンドを使って、TSVファイルに出力
$ sudo arp-scan -l -F '${ip}\t${mac}\t${vendor}' | tee output.tsv詳細出力(-v、--verbose)
$ sudo arp-scan -l -v
$ sudo arp-scan -l -vv
$ sudo arp-scan -l -vvv詳細な情報を出力します。複数回指定することで、詳細レベルをさらに上げることができます。(-v、-vv、-vvv)
【実演デモ】arp-scanを実行する
このセクションでは、検証用に構築したローカル環境を使い、arp-scanの実行手順と出力結果の読み方を解説します。
検証環境のシステム構成
| OS | IPアドレス | 備考 |
|---|---|---|
| VirtualBoxのネットワークアダプター | 192.168.10.1 | ホストオンリーアダプター |
| Kali Linux 2026.1 | 192.168.10.11 | 仮想マシン(スキャン実行ホスト) |
| Metasploitable2 | 192.168.10.101 | 仮想マシン |
| Ubuntu 24.04 LTS | 192.168.10.102 | 仮想マシン |
| OWASP BWA | 192.168.10.105 | 仮想マシン |
本デモは、当サイトが用意した検証用の仮想ネットワーク上で実施しています。
ネットワークインターフェースの確認
スキャン前に、使用するインターフェース名を確認します。
$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host noprefixroute
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 08:00:27:43:41:e8 brd ff:ff:ff:ff:ff:ff
inet 192.168.10.11/24 brd 192.168.10.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::a00:27ff:fe43:41e8/64 scope link proto kernel_ll
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 08:00:27:79:17:04 brd ff:ff:ff:ff:ff:ff
inet 10.0.3.15/24 brd 10.0.3.255 scope global dynamic noprefixroute eth1
valid_lft 70637sec preferred_lft 59837sec
inet6 fd17:625c:f037:3:51cf:e21a:823:3d09/64 scope global dynamic mngtmpaddr noprefixroute
valid_lft 86288sec preferred_lft 14288sec
inet6 fe80::53d7:53c7:c047:d04e/64 scope linkターゲットネットワークに接続されているインターフェースがeth0であることを確認しました。
ローカルネットワーク全体をスキャンする
$ sudo arp-scan -l -I eth0
Interface: eth0, type: EN10MB, MAC: 08:00:27:43:41:e8, IPv4: 192.168.10.11
Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan)
192.168.10.1 0a:00:27:00:00:04 (Unknown: locally administered)
192.168.10.101 08:00:27:0e:b7:7f PCS Systemtechnik GmbH
192.168.10.102 08:00:27:d3:95:02 PCS Systemtechnik GmbH
192.168.10.105 08:00:27:fc:30:6e PCS Systemtechnik GmbH
4 packets received by filter, 0 packets dropped by kernel
Ending arp-scan 1.10.0: 256 hosts scanned in 2.127 seconds (120.36 hosts/sec). 4 responded-l:ローカルネットワーク全体-I:ネットワークインターフェースを指定
実行結果を確認する
スキャンを実行したマシン自身の情報
Interface: eth0, type: EN10MB, MAC: 08:00:27:43:41:e8, IPv4: 192.168.10.11これは自分自身(arp-scanを実行したマシン)のネットワーク情報です。
- インターフェース:
eth0 - MACアドレス:
08:00:27:43:41:e8 - IPアドレス:
192.168.10.11
スキャン対象
Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan)256ホスト = /24ネットワーク(192.168.10.0〜255)に対して、スキャンを開始します。(つまりLAN内を全部調査)
検出された機器一覧
192.168.10.1 0a:00:27:00:00:04 (Unknown: locally administered)
192.168.10.101 08:00:27:0e:b7:7f PCS Systemtechnik GmbH
192.168.10.102 08:00:27:d3:95:02 PCS Systemtechnik GmbH
192.168.10.105 08:00:27:fc:30:6e PCS Systemtechnik GmbHlocally administered:仮想NICや手動設定のMACアドレスPCS Systemtechnik GmbH:VirtualBoxの仮想NICのOUIベンダー
検出された機器が一覧形式で出力されます。
| IPアドレス | MACアドレス (物理アドレス) | ベンダー(推定) |
|---|---|---|
| 192.168.10.1 | 0a:00:27:00:00:04 | 不明(ルーター or ゲートウェイ) |
| 192.168.10.101 | 08:00:27:0e:b7:7f | VirtualBox仮想マシン |
| 192.168.10.102 | 08:00:27:d3:95:02 | VirtualBox仮想マシン |
| 192.168.10.105 | 08:00:27:fc:30:6e | VirtualBox仮想マシン |
通信結果
4 packets received by filter, 0 packets dropped by kernel- 4台から応答あり
- パケットロスなし
スキャン結果のまとめ
Ending arp-scan 1.10.0: 256 hosts scanned in 2.127 seconds (120.36 hosts/sec). 4 responded256ホストを約2.1秒でスキャンし、4ホストが応答したことがわかります。
結果をファイルに保存する
$ sudo arp-scan -l -I eth0 | tee output.txtteeコマンドを使うことで、ターミナルへの表示と同時にファイルへの書き込みが行われます。
よくあるトラブルと対処法
arp-scan実行時に、以下のWARNINGが発生することがあります。
WARNING: Cannot open MAC/Vendor file ieee-oui.txt: Permission denied
WARNING: Cannot open MAC/Vendor file mac-vendor.txt: Permission deniedこれは、ベンダー定義ファイルへのアクセス権限に関する問題です。スキャン結果(IP、MACアドレス)には影響ありません。
仕様確認
arp-scanコマンドを実行すると、ベンダー定義ファイルは以下の順序で読み込まれます。
- まず、カレントディレクトリにある
ieee-oui.txt、mac-vendor.txtが読み込まれます。 - 対象ファイルがカレントディレクトリに見つからない場合、既定のファイルが使用されます。
/usr/share/arp-scan/ieee-oui.txt/etc/arp-scan/mac-vendor.txt
調査結果
ベンダー定義ファイルは問題なし
- カレントディレクトリに対象ファイルが存在しない。
/usr/share/arp-scan/ieee-oui.txt、/etc/arp-scan/mac-vendor.txtは存在する。- 同ファイルのrootユーザーによる参照権限も問題ない。
arp-scanを実行するディレクトリによって挙動が異なる
- /home直下
- /etc直下
- 一般ユーザーのホームディレクトリのサブディレクトリ(例./home/kali/Documents など)
- 一般ユーザーのホームディレクトリ直下(例./home/kali など)
推測される原因
arp-scanを実行時、カレントディレクトリ内のファイルを読み込もうとした際、アクセス権限が不足しているためエラーが発生?(arp-scanのバグ?)
対処法
一般ユーザーのホームディレクトリ直下以外で実行する
# 例)/home/kali/Documentsで実行する場合
$ cd /home/kali/Documents
$ sudo arp-scan -lベンダー定義ファイルをオプション指定する
$ sudo arp-scan -l \
--ouifile=/usr/share/arp-scan/ieee-oui.txt \
--macfile=/etc/arp-scan/mac-vendor.txtベンダー定義ファイルのパスを直接指定することにより、カレントディレクトリの読み取りを省略します。
