37
32

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

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

37
32
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
37
32

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?