以前、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