Posted at

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. 冒頭でダウンロードして実行パーミッションを設定する方法を書きました