落伍者(四季发财)
[专业PHP解码][IDC]
- 贡献
- 2035
- 鲜花
- 53
- 注册时间
- 2003-7-22
|
本帖最后由 Bendy 于 2012-9-22 20:28 编辑
接上文
第一步将相应流量通过监控端口流到监控机...
但我们没有专业的监控..分析...
结合我们的实际情况..(本人并不专长于数据流量分析)
我选择了一台性能较好的品牌机进行处理.
需要双网卡...而且是千兆的..
安装使用LINUX系统(我用CENTOS 6.2 64BIT)
机器物理接法是...网卡eth0接公网.配置管理IP. 网卡eth1接监控口.不配置IP.
我也不对机器做什么优化了...就安装基本系统.
然后使用YUM 安装下面几个我们需要用到的组件.
httpd
php53
php53-mysql
mysql
mysql-server
以上几个...是为了方便管理数据库.PHP是我必须使用的程序.
screen 这个是为了后台运行.控制...
wireshark 这个是截取数据包..可以算是TCPDUMP的增强版.
然后再在/var/www/html放上phpmyadmin ...就可以有MYSQL管理了.
设置MYSQL密码等..
下面是主要步骤
一\ 新建一个数据库..
用于保存域名信息....这个数据库比较重要.
- --
- -- 表的结构 `domain`
- --
- CREATE TABLE IF NOT EXISTS `domain` (
- `id` int(5) unsigned NOT NULL auto_increment,
- `d` varchar(32) character set utf8 NOT NULL,
- `ip` varchar(16) character set utf8 NOT NULL,
- `checktime` datetime default NULL,
- `beiantime` datetime default NULL,
- `beianhao` varchar(30) character set utf8 NOT NULL,
- `beianinfo` text character set utf8,
- PRIMARY KEY (`id`),
- KEY `domain` (`d`)
- ) ENGINE=MyISAM DEFAULT CHARSET=latin1 ;
复制代码 id 是序号
d是域名
IP是对应服务器IP
CHECKTIME是域名检测更新时间.
BEIANTIME 是备案检测更新时间
BEIANHAO 备案号
BEIANINFO 备案信息
很简单的结构.
第二步, 检测程序.
我只会PHP..只好使用PHP做系统级的数据分析/操作.
/home/d.php
- <?php
- #error_reporting(-1);
- date_default_timezone_set("Asia/Shanghai");
- $pp_count=1000; //每次截包数量
- while (true){ //遁环运行...
- $mysql=mysql_pconnect('localhost','fuck','you');
- if (!$mysql) {
- die('Could not connect: ' . mysql_error());
- }
- mysql_select_db("ym",$mysql);
- mysql_query("SET character_set_connection='utf8', character_set_results='utf8', character_set_client=utf8",$mysql);
- //run
- $nnn=0;
- while ($nnn < 100) { //双循环运行..因为时间长了.MYSQL连接就会断开.会出错
- $nnn++;
- $starttimer = time()+microtime();
- $return="";$data=array();
- @exec("tshark -c $pp_count -i eth1 -T fields -e ip.addr -e http.host -e http.server 2>/dev/null",$return); //这个是截取数据包的关键..使用外部程序操作.
- $data=implode("\n",$return);
- $i="/(\d+\.\d+\.\d+\.\d+)\s+(\S+)/";
- $m=array();
- preg_match_all($i,$data,$m,2);
- $m_count=count($m);
- $p=array();
- foreach ($m as $v){
- $domain=c_d($v[2]); //精简域名.....
- if ($domain == 'no') continue;
- $p[$domain]=$v[1];
- }
- $p_count=count($p);
- $new=$n2=0;
- foreach ($p as $d => $ip){
- if (check($ip)) continue; //跳过某些IP段的检查.
- $sql="SELECT * FROM `domain` WHERE `d` = '$d' ";
- $result=mysql_query($sql,$mysql);
- if ($row=mysql_fetch_array($result)){
- $time=time()-strtotime($row['checktime']);
- if ($time < 1296000 ) { //这个有点多余..未更改好.
- $sql="UPDATE `domain` SET `checktime` = now() WHERE `d` = '$d'";
- mysql_query($sql,$mysql);
- $n2++;
- }
- }
- else{
- $sql="INSERT INTO `domain` (`d` , `ip` ,`checktime`,`beianhao`) Values ( '$d','$ip',now(),'' )";
- mysql_query($sql,$mysql);
- $new++;
- }
- }
- $stoptimer = time()+microtime();
- $timer = round($stoptimer-$starttimer,2);
- $result=mysql_query("SELECT * FROM `domain`",$mysql);
- $a_count=mysql_num_rows($result);
- echo date("H:i:s")." in $timer seconds.[ c: $a_count t : $m_count p: $p_count u: $n2 a: $new ]\r\n";
- }
- mysql_close($mysql);
- echo "again!!\r\n";
- }
- function check ($ip){ //..IP.
- $ip_n=ip2long($ip);
- $ips[]="222.187.212.128/64"; //这些IP段不检查../后面是数量
- $ips[]="222.187.211.0/64";
- foreach ($ips as $v){
- $vv=explode("/",$v);
- $s=ip2long($vv[0]);
- $e=$s+$vv[1];
- if ($ip_n > $s && $ip_n <= $e ) return true;
- }
- return false;
- }
-
- function c_d($domain){ //自已写的精简域名...求更好的....
- $ds=explode(".",$domain);
- $n=count($ds)-1;
- if ($n>0){
- if (strlen($ds[$n])==2){
- if ($ds[$n] <>"cn" and $ds[$n] <>"ru" and $ds[$n] <>"tv" and $ds[$n] <>"hk" and $ds[$n] <>"us"
- and $ds[$n] <>"cc" and $ds[$n] <>"cn" and $ds[$n] <>"tw" and $ds[$n] <>"la" ) return "no";
- if ($ds[$n-1]=="com" or $ds[$n-1] == "net" or $ds[$n-1] == "org" or $ds[$n-1] == "gov" or strlen($ds[$n-1]) == 2){
- $d=$ds[$n-2].".".$ds[$n-1].".".$ds[$n];
- return $d;
- }
- $d=$ds[$n-1].".".$ds[$n];
- return $d;
- }
- elseif (strlen($ds[$n])==3){
- if ($ds[$n] <>"com" and $ds[$n] <>"net" and $ds[$n] <>"org" and $ds[$n] <>"gov" and $ds[$n] <>"edu" ) return "no";
- }
- elseif (strlen($ds[$n])==4){
- if ($ds[$n] <>"info") return "no";
- }
- elseif (strlen($ds[$n]) < 2 or strlen($ds[$n]) > 3){
- return "no";
- }
- $d=$ds[$n-1].".".$ds[$n];
- return $d;
- }
- return "no";
- }
- ?>
复制代码 第三步 通过 SCREEN 在后台循环运行该PHP文件.
- screen
- cd /home/
- php d.php
复制代码 然后你就可以看到这个SCREEN进程...在不停地检测域名....录入数据库...检测/录入...不停地跳动....
感觉爽不.
然后下一个贴...就要准备另一个程序...将数据库内的域名进行备案自动查询了..
继续 待续吧..
09-22 更新.
之前的程序是数据采集和分析.全在一个PHP程序里面操作.
在我的环境中...截取1000个数据包.并分析.一个循环需要2秒左右.
这个情况只能算是采样式采集...做不到完整数据采集的....
今天经过改进...
将采集和分析分开来操作.
采集使用LINUX的BASH循环来操作....
/home/cap.sh
- while true
- do
- tshark -c 30000 -i eth1 -n -T fields -e ip.addr -e http.host -e http.server > /dev/shm/data.tmp 2>/dev/null
- rm /dev/shm/run.dat -f
- mv /dev/shm/data.tmp /dev/shm/run.dat
- done
复制代码 采集3W包..然后保存在data.tmp.
采集完成后..将data.tmp改名为run.dat(供PHP分析处理).
继续采集...循环处理....
然后PHP读取RUN.DAT进行处理(读取完成后...删除RUN.DAT.然后分析完成后.等 下一个RUN.DAT文件生成后再分析.....
使用新方法后..在我同样的环境下...每4秒左右生成一次RUN.DAT...
也就是4秒时间..就采集/分析了3W 个数据包...比之前的速度提高15倍.....
.
.
.
|
评分
-
查看全部评分
|