<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[沧海一粟]]></title> 
<link>http://www.dzhope.com/index.php</link> 
<description><![CDATA[Web系统架构与服务器运维,php开发]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[沧海一粟]]></copyright>
<item>
<link>http://www.dzhope.com/post//</link>
<title><![CDATA[Linux VPS下简单解决CC攻击]]></title> 
<author>jed &lt;jed521@163.com&gt;</author>
<category><![CDATA[服务器技术]]></category>
<pubDate>Mon, 14 Jun 2010 00:55:25 +0000</pubDate> 
<guid>http://www.dzhope.com/post//</guid> 
<description>
<![CDATA[ 
	一，准备工作<br/>1，登录进VPS控制面板，准备好随时重启VPS。<br/>2，关闭Web Server先，过高的负载会导致后面的操作很难进行，甚至直接无法登录SSH。<br/>3，以防万一，把设置的Web Server系统启动后自动运行去掉。<br/>（如果已经无法登录进系统，并且重启后负载过高导致刚刚开机就已经无法登录，可联系管理员在母机上封掉VPS的IP或80端口，在母机上用虚拟控制台登录 进系统，然后进行2&3的操作，之后解封）<br/><br/>二，找出攻击者IP<br/><br/>1，在网站根目录建立文件ip.php，写入下面的内容。<br/><br/><div class="code"><br/>&lt;?php<br/>$real_ip = getenv(&#039;HTTP_X_FORWARDED_FOR&#039;);<br/>if(isset($real_ip))&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shell_exec(&quot;echo $real_ip &gt;&gt; real_ip.txt&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shell_exec(&quot;echo $_SERVER&#91;&#039;REMOTE_ADDR&#039;&#93; &gt;&gt; proxy.txt&quot;);<br/>&#125;else&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shell_exec(&quot;echo $_SERVER&#91;&#039;REMOTE_ADDR&#039;&#93; &gt;&gt; ips.txt&quot;);<br/>&#125;<br/>echo &#039;服务器受到攻击，正在收集攻击源，请在5分钟后访问本站，5分钟内多次访问本站有可能会被当作攻击源封掉IP。谢谢合作！&#039;;<br/>?&gt;<br/><br/></div><br/><br/>2，设置伪静态，将网站下的所有访问都rewrite到ip.php。<br/>Nginx规则：<br/><div class="code"><br/>rewrite (.*) /ip.php;<br/><br/></div><br/><br/>Lighttpd规则：<br/><br/><div class="code"><br/>url.rewrite = (<br/>&quot;^/(.+)/?$&quot; =&gt; &quot;/ip.php&quot;<br/>)<br/><br/></div><br/><br/>3，启动Web Server开始收集IP<br/>进行完1和2的设置后，启动Web Server，开始记录IP信息。<br/>收集时间建议为3到5分钟，然后再次关闭Web Server。<br/>real_ip.txt，这个文件中保存的IP有80%以上都相同的，这个IP就是攻击者实施攻击的平台的IP。<br/>proxy.txt，这个文件中保存的是攻击者调用的代理服务器的IP，需要封掉。<br/>ips.txt，这里记录的是未表现出代理服务器特征的IP，根据访问次数判断是否为攻击源。<br/><br/>三，对上一段的补充<br/>如果VPS上启用了WEB日志，可以查看日志文件的增长速度来判断是哪个站点被攻击。<br/>如果没有启用日志，并且站点数量很少，临时启用日志也很方便 。<br/>如果没有启用日志，并且站点数量过多，可以使用临时的Web Server配置文件，不绑定虚拟主机，设置一个默认的站点。然后在ip.php里加入下面一行<br/><div class="code"><br/>shell_exec(“echo $_SERVER&#91;&#039;HTTP_HOST&#039;&#93; &gt;&gt; domain.txt”);<br/><br/></div><br/><br/>domain.txt里将保存被访问过的域名，被CC攻击的站点将在里面占绝大多数。<br/><br/>四，开始封堵IP<br/>建立文件ban.php<br/><br/><div class="code"><br/>&lt;?<br/>$threshold = 10;<br/>$ips = array_count_values(file(&#039;ips.txt&#039;));<br/>$ban_num = 0;<br/>foreach($ips as $ip=&gt;$num)&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;if($num &gt; $threshold)&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$ip = trim($ip);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$cmd = &quot;iptables -I INPUT -p tcp --dport 80 -s $ip -j DROP&quot;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shell_exec($cmd);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo &quot;$ip baned!&#92;n&quot;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$ban_num ++;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&#125;<br/>$proxy_arr = array_unique(file(&#039;ips.txt&#039;));<br/>foreach($proxy_arr as $proxy)&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;proxy = trim($proxy);<br/>&nbsp;&nbsp;&nbsp;&nbsp;$cmd = &quot;iptables -I INPUT -p tcp --dport 80 -s $proxy -j DROP&quot;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;shell_exec($cmd);<br/>&nbsp;&nbsp;&nbsp;&nbsp;echo &quot;$proxy baned!&#92;n&quot;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$ban_num ++;<br/>&#125;<br/>echo &quot;total: $ban_num ips&#92;n&quot;;<br/>?&gt;<br/><br/></div><br/><br/>用下面的命令执行脚本（确保php命令在PATH中）<br/><div class="code"><br/>php ban.php<br/><br/></div><br/>这个脚本依赖于第二段中ips.txt里保存的结果，当其中记录的IP访问次数超过10次，就被当作攻击源给屏蔽掉。如果是代理服务器，则不判断次数直接 封掉。<br/>封完IP之后，把所有的网站设置恢复正常，站点可以继续正常运行了。<br/><br/>五，一些细节<br/>为保持对操作过程的描述尽量简洁，没有在上面的内容中加入过多的解释，留在这段统一讲述。<br/>1，关于“代理服务器”的一些本质<br/>两个与TCP&HTTP协议相关的值，REMOTE_ADDR和HTTP_X_FORWARDED_FOR。<br/>（1）REMOTE_ADDR总是取离Web服务器最接近的一台主机的IP，如果没有使用代理，这个值就是访问者本身的IP，如果使用了代理，这个值就是 代理服务器的IP，如果通过多个代理服务器进行的连接，这个值就是到达Web服务器前最后一台代理服务器的IP。<br/>REMOTE_ADDR是由TCP/IP层决定的，不能修改不能伪造。<br/>（2）HTTP_X_FORWARDED_FOR，因为这个值是属于HTTP部分，而不是TCP/IP，所以这个值不管是什么，都不影响数据的传输。事实 上，一般情况下，如果是访问者直接访问Web服务器，这个值为空；通过透明代理的时候，这个值会被代理服务器设置为访问者的IP；通过匿名代理连接时，这 个值可能为代理服务器的IP也可能是空的也有可能是随机的。<br/>HTTP_X_FORWARDED_FOR可以被任意修改。大多数代理服务器都是透明代理，也就是说，会把这个值设置为最原始访问者的IP。<br/><br/>2，关于解决CC攻击的层面问题<br/>按处理效率从高到低排列。<br/>（由于本文是针对VPS服务器所写，而VPS简单来说就是服务器的低端替代品，内存和CPU等资源普遍偏低，当然是处理效率越高越好。）<br/>（1）网络传输层。也就是本文所用的iptables，这个工具本身是工作于系统内核，在建立网络连接时直接把攻击者的连接给否了。在这一层面上将攻击源 处理掉后，消耗掉的资源几乎可以忽略不计。<br/>（2）Web Server层，大多数Web Server都可以设置禁止访问的IP。在这一层上解决的意义和上面的差不多，但是效率要差些。<br/>（3）脚本层，从脚本程序上制定适合于本身的策略过滤掉攻击源。网络上有很多流传的在这一层面的解决方案，但是不太适用于VPS，而且设置难度可能要增加 几倍或者几十倍。<br/><br/>3，为什么不是从日志收集IP？<br/>主要是考虑两点，一是大多数VPS使用者都因为硬盘空间过小，经常清除日志很麻烦，而直接禁止了日志。<br/>二是如果从日志收集IP，脚本复杂程度要高很多，而且可能要根据情况做些调整，考虑到将要读到本文的人大多数都未必掌握更多的技术，本文的目的就是按部就 班的依本文进行操作，即可解决问题。<br/>Tags - <a href="http://www.dzhope.com/tags/linux/" rel="tag">linux</a> , <a href="http://www.dzhope.com/tags/cc/" rel="tag">cc</a> , <a href="http://www.dzhope.com/tags/%25E6%2594%25BB%25E5%2587%25BB/" rel="tag">攻击</a> , <a href="http://www.dzhope.com/tags/iptables/" rel="tag">iptables</a>
]]>
</description>
</item><item>
<link>http://www.dzhope.com/post//#blogcomment</link>
<title><![CDATA[[评论] Linux VPS下简单解决CC攻击]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://www.dzhope.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>