tl;dr
# 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
環境
$ sw_vers
ProductName: Mac OS X
ProductVersion: 10.11.3
BuildVersion: 15D21
動機
同じLANに接続している他の機器のIPアドレスが知りたい。
でも、DHCPによってIPアドレスが動的に変わってしまう。
MACアドレスは変わらないから、MACアドレスから逆引きすれば出来るはず。
最初の想定
-
arp -an
で、ローカルマシンにキャッシュされたMACアドレスとIPアドレスの対応テーブルを出力 - 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を設定します。
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`"'
$ cidr
192.168.0.167/24
本来は192.168.0.0/24
であって欲しいですが、nmapする上では問題ありません。
$ nmap -sn `cidr`