2011年10月25日火曜日

php でパケットキャプチャを行う

方法としては以下の2通り

① phpのソケットapiを利用する。
作業量は少なくなりそうだが、
パケットキャプチャに関する参考資料が少ない。

phpのソケットapiリファレンス
phpのソケットapiでサーバを作る

また、パケットキャプチャに必要な、
ソケットのドメインAF_PACKET(PF_PACKET)が
使えないかもしれない。。


② Cで書いて、phpエクステンションにする。
パケットキャプチャの資料は多そうだが、
phpエクステンションのハローワールドから
はじめる必要がある。


Cでパケットキャプチャ1
Cでパケットキャプチャ2
phpエクステンションの作り方


②の方法で行く事にする。

1、スケルトン作成
# cd /usr/local/share/php-5.3.8/ext/
# ./ext_skel --extname=pcap
# cd pcap

config.m4を修正
dnl PHP_ARG_ENABLE(エクステンション名, whether to enable エクステンション名 support,
dnl Make sure that the comment is aligned:
dnl [ --enable-エクステンション名 Enable エクステンション名 support])
この3行のdnlを消して保存する。

KLabのブログに書いてあった場所とは異なる。
ここの意味は何なのか?


2、コンパイル
# phpize
# ./configure
# make

3、ソース修正
php_pcap.h
pcap.c
をそれぞれ修正して、再度コンパイル


4、シンボリックリンク作成
# cd /usr/lib64/20090626/
# sudo ln -s /usr/local/share/php-5.3.8/ext/pcap/modules/pcap.so ./pcap.so

php.iniにパスを通す。


5、ソースを書く。
[1] PHP extensionとして作っているところ
[2] こCのパケットキャプチャを作っているところ
書いてみて共通しているところ、ちがうを探してみた。

① socketのタイプ
[1]では、ドメイン:AF_PACKET、タイプ:SOCK_RAWを使っていたが、
[2]では、ドメイン:PF_PACKET、タイプ:SOCK_DGRAMを使っていた。


う~ん。
pcap使ったほうがいいのかも

0 件のコメント:

コメントを投稿