﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-公子周-随笔分类-DDOS攻防</title><link>http://www.cppblog.com/zxl200406/category/19597.html</link><description>&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp--不乱于心，不困于情</description><language>zh-cn</language><lastBuildDate>Wed, 11 Jul 2012 07:19:33 GMT</lastBuildDate><pubDate>Wed, 11 Jul 2012 07:19:33 GMT</pubDate><ttl>60</ttl><item><title>DDOS 七层   差一些的完美解决方案</title><link>http://www.cppblog.com/zxl200406/archive/2012/07/11/182803.html</link><dc:creator>公子周</dc:creator><author>公子周</author><pubDate>Wed, 11 Jul 2012 03:58:00 GMT</pubDate><guid>http://www.cppblog.com/zxl200406/archive/2012/07/11/182803.html</guid><wfw:comment>http://www.cppblog.com/zxl200406/comments/182803.html</wfw:comment><comments>http://www.cppblog.com/zxl200406/archive/2012/07/11/182803.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zxl200406/comments/commentRss/182803.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zxl200406/services/trackbacks/182803.html</trackback:ping><description><![CDATA[在此本人，希望大家多提意见，也帮我完善DDOS, 七层的防御，当然防御方法要与公司的业务特点要结合，才能符合自己公司的防御的方法<br /><br />最近，我在做一个ddos行业检测的系统（七层 http），我负责后端。<br /><img src="http://www.cppblog.com/images/cppblog_com/zxl200406/行为检测功能.jpg" width="1039" height="333" alt="" /><br /><span style="color: red; ">请各位朋友位，看一下，我还应该加一些哪些功能，我公司的网站比较多，全站：与分站的意思，就是 是否区分站点<br /><img src="http://www.cppblog.com/images/cppblog_com/zxl200406/DDOS判定方法.jpg" width="1194" height="473" alt="" /><br /></span> <br />我在这里，无法判断，大的出口IP的DDOS，因为混合了正常攻击，1，不敢封此IP，2不好判断出来<br /><br />实现方法<br />1、采集数据，通过在web服务器上部署相应的模块，实现数据采集<br />2、发送相应的数据，到MSMQ上<br />3、按用户访问网站的时间，一分钟为单位时间，写入文件<br />4、另一个模块，通过读取文件1分钟大约70M左右的数据，写入hash_map，然后做大量的运算。<br />5、写入图上的功能的相关数据到数据中<span style="background-color: #eeeeee; font-size: 13px; ">判定DDOS是的方法</span><br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; "><span style="color: #0000FF; ">void</span>&nbsp;CUserHashMap::DDOS()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;User_Hash::iterator&nbsp;hash_site=HashSite.begin();<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(;hash_site!=HashSite.end();hash_site++)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hash_map&lt;<span style="color: #0000FF; ">string</span>,SessionAndUrl&gt;::iterator&nbsp;hash_ip_iter=hash_site-&gt;second.HashIP.begin();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(;hash_ip_iter!=hash_site-&gt;second.HashIP.end();hash_ip_iter++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bitvec.reset();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(hash_ip_iter-&gt;second.sessionamount0)<span style="color: #008000; ">//</span><span style="color: #008000; ">第一种抓虫或黑客扫描工具</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">准备写入数据库中，数据中结构为</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bitvec[0]=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(ceil(hash_ip_iter-&gt;second.sessionamount1*1.0*100/hash_ip_iter-&gt;second.ipcount)&gt;=95&amp;&amp;hash_ip_iter-&gt;second.ipcount&gt;=60)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">第二种情况,ddos工具，发送原始socket,session值各不相同，全为1</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bitvec[1]=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(hash_ip_iter-&gt;second.sessiontop1&gt;=hash_ip_iter-&gt;second.ipcount&amp;&amp;hash_ip_iter-&gt;second.ipcount&gt;=60)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">第三种情况session全部都相同的情况</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bitvec[2]=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(ceil(hash_ip_iter-&gt;second.urltop5*1.0*100/hash_ip_iter-&gt;second.ipcount)&gt;=100&amp;&amp;hash_ip_iter-&gt;second.ipcount&gt;=60)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">第四种情况，ddos,访问的url&nbsp;top&nbsp;5以内=100%</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bitvec[3]=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(ceil(hash_ip_iter-&gt;second.referrtop1*1.0*100/hash_ip_iter-&gt;second.ipcount)==100&amp;&amp;hash_ip_iter-&gt;second.ipcount&gt;=60)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">第五种情况，refer，全部都相同，前五，全部相同</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bitvec[4]=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(bitvec.to_string()!="00000000")<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">[VanclSiteName],[IPaddress],[IPCount],[AttackType],[Time],[TopSessionTen],[TopUrlTen],,[ReferTen],[Reason]</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;sql="insert&nbsp;into&nbsp;[test].[dbo].[Exception]&nbsp;values&nbsp;('0%','1%',2%,'3%','4%','5%','6%','7%');";<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;odbc.replace(sql,"0%",hash_site-&gt;first.c_str());<span style="color: #008000; ">//</span><span style="color: #008000; ">站点名称</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;odbc.replace(sql,"1%",hash_ip_iter-&gt;first.c_str());<span style="color: #008000; ">//</span><span style="color: #008000; ">IP地址</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;odbc.replace(sql,"2%",hash_ip_iter-&gt;second.ipcount);<span style="color: #008000; ">//</span><span style="color: #008000; ">IP访问次数</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;odbc.replace(sql,"3%",bitvec.to_string().c_str());<span style="color: #008000; ">//</span><span style="color: #008000; ">攻击类型</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;odbc.replace(sql,"4%",filetime.c_str());<span style="color: #008000; ">//</span><span style="color: #008000; ">时间</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;odbc.replace(sql,"5%",hash_ip_iter-&gt;second.sessiontop10.c_str());<span style="color: #008000; ">//</span><span style="color: #008000; ">session&nbsp;top&nbsp;10</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;odbc.replace(sql,"6%",hash_ip_iter-&gt;second.urltop10.c_str());<span style="color: #008000; ">//</span><span style="color: #008000; ">url&nbsp;top&nbsp;10</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;odbc.replace(sql,"7%",hash_ip_iter-&gt;second.reffer10.c_str());<span style="color: #008000; ">//</span><span style="color: #008000; ">refer&nbsp;top&nbsp;10</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;odbc.ExecuteNonQuery(sql.c_str());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br />//实现所有的功能后（70M大小文件,近30w条数据）<br />//以上是测试数据代码<br /><div>int _tmain(int argc, _TCHAR* argv[])</div><div>{</div><div><span style="white-space:pre">	</span>CUserHashMap hash;</div><div><span style="white-space:pre">	</span>DWORD num1=GetTickCount();</div><div><span style="white-space:pre">	</span>CUserReadFile file("2012-07-04_14.58.log");</div><div><span style="white-space:pre">	</span>char *buff=NULL;</div><div><span style="white-space:pre">	</span>buff=file.ReadFile();</div><div><span style="white-space:pre">	</span>//////////////////分割字符串开始//////////////////////</div><div><span style="white-space:pre">	</span>char delims[] = "\n";</div><div><span style="white-space:pre">	</span>char *result = NULL;</div><div><span style="white-space:pre">	</span>result = strtok( buff, delims );</div><div><span style="white-space:pre">	</span>//取第一行的时候。</div><div><span style="white-space:pre">	</span>string m_time=result;</div><div><span style="white-space:pre">	</span>hash.SetFileTime(m_time.substr(0,m_time.find_first_of("\t")));</div><div><span style="white-space:pre">	</span>while( result != NULL ) {</div><div><span style="white-space:pre">		</span>hash.SplitBlack(result);//插入数据</div><div><span style="white-space:pre">		</span>result = strtok( NULL, delims );</div><div><span style="white-space:pre">	</span>} &nbsp;&nbsp;</div><div><span style="white-space:pre">	</span>//////////////////分割字符串结束//////////////////////</div><div><span style="white-space:pre">	</span>file.Delete();//释放内存</div><div><span style="white-space:pre">	</span>cout&lt;&lt;GetTickCount()-num1&lt;&lt;endl;</div><div><span style="white-space:pre">	</span>hash.CountHashTable();//计算hashtalbe表，内部计算，并赋值。</div><div><span style="white-space:pre">	</span>hash.DDOS();</div><div><span style="white-space:pre">	</span>hash.VanclSiteStatistic();//站点信息统计</div><div><span style="white-space:pre">	</span>cout&lt;&lt;"total time"&lt;&lt;GetTickCount()-num1&lt;&lt;endl;</div><div><span style="white-space:pre">	</span>return 0;</div><div>}</div><div></div><div>success!</div><div>2013</div><div>total time3978</div><br />时间上需要4s时间，计算，并写数据库当中。<br /></div><img src ="http://www.cppblog.com/zxl200406/aggbug/182803.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zxl200406/" target="_blank">公子周</a> 2012-07-11 11:58 <a href="http://www.cppblog.com/zxl200406/archive/2012/07/11/182803.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>