‘DHCP’ タグのついている投稿

PythonのPyDHCPLibを使ってDHCPパケットを読む

PyDHCPLibはPure Pythonで書かれたDHCPパケットのリード/ライトライブラリです。

Pythonで書かれているので、LinuxでもWindowsでも動きます。(Windowsのときはちょっと対策が必要)

まずはdebian Linuxの場合。(aptでインストールできました。追記参照)

$ wget http://pydhcplib.tuxfamily.org/download/pydhcplib-0.6.2.tar.gz
$ tar xvzf pydhcplib-0.6.2.tar.gz
$ cd pydhcplib-0.6.2
$ sudo /usr/bin/python2.6 ./setup.py install

/usr/local/lib/python2.6/dist-packages/pydhcplib
に入りました。

流れてくるパケットを読み取るためにはサーバとして動かします。
examplesディレクトリの中にサーバ用のサンプルが入っているので実行します。

$ sudo /usr/bin/python2.6 ./examples/server_example.py

これでOKです。

ちなみにroot権限で実行しないと、以下のエラーが出てポートが開けられません。
pydhcplib.DhcpNetwork.BindToAddress error : [Errno 13] Permission denied

ではWindowsの場合。

Windows 7にもPython 2.7.2をインストールして使って見ました。

> cd pydhcplib-0.6.2
> C:\Python27\python.exe .\setup.py install

C:\Python27\Lib\site-packages\pydhcplibにインストールされました。

> C:\Python27\python.exe .\examples\server_example.py
Traceback (most recent call last):
  File ".\examples\server_example.py", line 21, in <module>
    from pydhcplib.dhcp_network import *
  File "C:\Python27\lib\site-packages\pydhcplib\dhcp_network.py", line 22, in <module>
    import IN
ImportError: No module named IN

インポートエラー。INモジュールというものがないとのこと。

INモジュールはdebianではPythonのplat-linux2ディレクトリ以下に入っています。中身は
# Generated by h2py from /usr/include/netinet/in.h
netinetから変換した定数の定義でした。

なので、必要なところだけコピーしてくることにします。

$ cat /usr/lib/python2.6/plat-linux2/IN.py |grep SO_BINDTODEVICE
SO_BINDTODEVICE = 25

このSO_BINDTODEVICEの定義だけを書いたIN.pyファイルをexamplesディレクトリに置けばOKです。

IN.py
SO_BINDTODEVICE = 25

これで試しにiPod touchをLANに接続して見ました。

> C:\Python27\python.exe .\examples\server_example.py
# Header fields
op : BOOTREQUEST
htype : 1
hlen : 6
hops : 0
xid : 3472825851
secs : 1
flags : 0
ciaddr : 0.0.0.0
yiaddr : 0.0.0.0
siaddr : 0.0.0.0
giaddr : 0.0.0.0
chaddr : 00:26:bb:XX:XX:XX
sname :
file :
# Options fields
client_identifier :
parameter_request_list : subnet_mask,router,domain_name_server,domain_name,domain_search,252
host_name : homma2
request_ip_address : 172.18.0.21
dhcp_message_type : DHCP_REQUEST
ip_address_lease_time : 7776000
maximum_dhcp_message_size : 1285

これでネットワークに接続された端末のリースタイム・MACアドレス・IPアドレスが取れました。

追記

debian squeezeではパッケージ登録されていました。
なので、aptで簡単にインストールできます。

$ aptitude search pydhcplib
p   python-pydhcplib                                                                                 – Python DHCP client/server library
v   python2.5-pydhcplib                                                                              –
v   python2.6-pydhcplib                                                                              –
$ sudo aptitude install python-pydhcplib

以上。