Mac + Python2 + Scapyで、使用中のIPアドレスを探してみた

以前、Windowsにて現在のIPアドレス利用状況を知りたい時は、以下の記事のようにしていました。
Windowsで、使用中のIPアドレスを調査する:Tech TIPS - @IT

 
Scapyを使えばARPパケットだけで同じことができるのではと思い、試してみました。

 
目次

 

環境

 

実装

ScapyでL2パケットであるARPを送信する関数を調べたところ、

  • scapy.sendrecv.sendp()
    • L2パケットの送信
  • scapy.sendrecv.srp()
    • L2パケットの送受信
  • scapy.sendrecv.srp1()
    • L2パケットの送受信(1つめのパケットのみ取り出す)
  • scapy.layers.l2.arping()
    • Arpingする

などがありました。

 
今回の目的は使用中のIPアドレスの調査なため、 arping() を使って実装すれば良さそうです。

discover_ip_address_in_use.py  

# -*- coding: utf-8 -*-
from datetime import datetime
from scapy.layers.l2 import ARP, arping


def discover():
    ip = '192.168.10.*'
    print 'start: {}'.format(datetime.now().strftime('%Y/%m/%d %H:%M:%S'))
    answers, _ = arping(ip, timeout=1, verbose=0)

    for send_packet, recieve_packet in answers:
        print 'MAC Address: {}, IP Address: {}'.format(
            recieve_packet[ARP].hwsrc,  # MACアドレス
            recieve_packet[ARP].psrc,   # IPアドレス
        )
    print 'end  : {}'.format(datetime.now().strftime('%Y/%m/%d %H:%M:%S'))


if __name__ == '__main__':
    discover()

 
実行してみると、

$ python arp/discover_ip_address_in_use.py 
start: 2018/01/11 22:44:18
MAC Address: a4:xx:xx:xx:xx:xx, IP Address: 192.168.10.1
MAC Address: b8:xx:xx:xx:xx:xx, IP Address: 192.168.10.50
end  : 2018/01/11 22:44:29

と、結果が返ってきました。

 
なお、公式ドキュメントにもArpingについて記載されていました。
ARP Ping | Usage — Scapy 2.3.3-dev documentation

また、arping()の実装を見たところ、内部で srp() を使っていました。
https://github.com/secdev/scapy/blob/v2.4rc2/scapy/layers/l2.py#L492

 

参考

 

ソースコード

GitHubに上げました。 arp/discover_ip_address_in_use.py が今回のファイルです。
https://github.com/thinkAmi-sandbox/scapy-sample