Help us understand the problem. What is going on with this article?

arpでMACアドレスからIPアドレスを逆引きする

More than 3 years have passed since last update.

tl;dr

terminal
# nmapが無かったらインストール
$ which nmap || brew install nmap

# スクリプト用のディレクトリを作成(適宜読み替え)
$ mkdir -p ~/mybin && cd $_

# スクリプトをダウンロード
$ wget -O- https://gist.github.com/kei-sato/b5ecda9c6c03a9bf7880/raw/474fa3d9d5a204835c02b9a3a1bc234fd9269af3/rarp > rarp
$ wget -O- https://gist.github.com/kei-sato/006cc6f069e648c077af/raw/b65a4c7aca5dcecae348dd21d5bacbe099f92bd3/netmask-bit-count > netmask-bit-count

# 実行パーミッション付与
$ chmod +x *

# ネットワーク関連alias
$ alias getip='ifconfig en0 | grep "inet[^6]" | cut -d" " -f2'
$ alias getmask='ifconfig en0 | awk '\''/mask/{print $4}'\'
$ alias cidr='echo "`getip`/`getmask | netmask-bit-count`"'

# LANのARPキャッシュを更新
$ nmap -sn `cidr`

# MACアドレスからIPアドレスを逆引き
$ rarp 00:0a:95:9d:68:16
192.168.0.253

rarp: https://gist.github.com/kei-sato/b5ecda9c6c03a9bf7880
netmask-bit-count: https://gist.github.com/kei-sato/006cc6f069e648c077af

環境

terminal
$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.11.3
BuildVersion:   15D21

動機

同じLANに接続している他の機器のIPアドレスが知りたい。
でも、DHCPによってIPアドレスが動的に変わってしまう
MACアドレスは変わらないから、MACアドレスから逆引きすれば出来るはず。

最初の想定

  1. arp -anで、ローカルマシンにキャッシュされたMACアドレスとIPアドレスの対応テーブルを出力
  2. MACアドレスでgrep

だけでいいはずだった…。

つまづいた点

arpの出力では00や0aの先頭の0が省略される

例えば、00:0a:95:9d:68:16 => 0:a:95:9d:68:16となるので、
arp -an | grep 00:0a:95:9d:68:16としてもヒットしません。

解決策

スクリプトを書きました
https://gist.github.com/kei-sato/b5ecda9c6c03a9bf7880

キャッシュを更新する必要がある

arp -anで出力されるのはあくまでローカルマシンのキャッシュであって、
ルーターのキャッシュではないので、ローカルマシンのキャッシュを更新する必要があります。
キャッシュを更新するには試しにパケットを送ってみるしかありません。

解決策

LANのCIDRが192.168.0.0/24だとすると、nmap -sn 192.168.0.0./24でLAN内の全ての機器にパケットを送ることができます。1

ifconfig en0でCIDRは出力されない

具体的には次のように出力されます

$ ifconfig en0
en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
    ether 01:96:32:33:c6:64
    inet 192.168.0.167 netmask 0xffffff00 broadcast 192.168.0.255
    media: autoselect
    status: active

解決策

netmaskをCIDRのプレフィックス長(スラッシュの後ろ)に直すスクリプトを書きました。2
https://gist.github.com/kei-sato/006cc6f069e648c077af
そして、次のようにaliasを設定します。

.bash_profile
alias getip='ifconfig en0 | grep "inet[^6]" | cut -d" " -f2'
alias getmask='ifconfig en0 | awk '\''/mask/{print $4}'\'
alias cidr='echo "`getip`/`getmask | netmask-bit-count`"'
terminal
$ cidr
192.168.0.167/24

本来は192.168.0.0/24であって欲しいですが、nmapする上では問題ありません。

terminal
$ nmap -sn `cidr`

  1. nmapbrew install nmapでインストールできます 

  2. 冒頭でダウンロードして実行パーミッションを設定する方法を書きました 

kei-sato
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away