﻿<?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>PHP博客-Programming Life-随笔分类-Network</title><link>http://www.phpweblog.net/killjin/category/318.html</link><description>相信不能相信的，完成不能完成的。矛盾，就象征进步。</description><language>zh-cn</language><lastBuildDate>Thu, 17 Jan 2008 14:04:15 GMT</lastBuildDate><pubDate>Thu, 17 Jan 2008 14:04:15 GMT</pubDate><ttl>60</ttl><item><title>使用tracert查看网络状况</title><link>http://www.phpweblog.net/killjin/archive/2008/01/17/2701.html</link><dc:creator>Prog</dc:creator><author>Prog</author><pubDate>Thu, 17 Jan 2008 07:08:00 GMT</pubDate><guid>http://www.phpweblog.net/killjin/archive/2008/01/17/2701.html</guid><wfw:comment>http://www.phpweblog.net/killjin/comments/2701.html</wfw:comment><comments>http://www.phpweblog.net/killjin/archive/2008/01/17/2701.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.phpweblog.net/killjin/comments/commentRss/2701.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/killjin/services/trackbacks/2701.html</trackback:ping><description><![CDATA[<p>TRACERT是一种TCP/IP实用工具(源于&#8220;Trace Route&#8221;)，在DOS和UNIX系统下都有此命令。它将您的计算机与目标服务器间传输一个包的路径情况报告给您。其最简单的使用方法为&#8220;TRACERT地址&#8221;，地址为目标服务器的域名或IP地址。(与PING命令类似，在DOS提示符下键入&#8220;TRACERT&#8221;并按回车键，可查看此命令的选项开关和参数使用方法)。您可看到如下类似结果： </p>
<p>C:&gt;tracert 61.152.157.67</p>
<p>Tracing route to 61.152.157.67 over a maximum of 30 hops: </p>
<p>1 78 ms 61 ms 62 ms 202.103.9.2</p>
<p>2 64 ms 71 ms 64 ms 202.97.19.5</p>
<p>3 71 ms 65 ms 65 ms 206.125.197.65</p>
<p>4 69 ms 73 ms 68 ms 209.3.188.181</p>
<p>5 69 ms 69 ms 67 ms 204.245.69.74</p>
<p>6 73 ms 78 ms 70 ms 204.245.69.94</p>
<p>7 74 ms 76 ms 76 ms 209.3.153.74 </p>
<p>8 82 ms 81 ms 84 ms 199.45.39.45</p>
<p>Trace complete. </p>
<p>从以上结果可看出到达目标经过了8个节点并且包传输的很快(低于100ms)。第一列显示了节点数，第一列最后一行为到达最终目标所经过的节点总数(在我们的例子中到达最终节点，61.152.157.67，共经过了8个节点)。其后的三列为各节点的响应周期。如果在其中出现星号则表示超时(着就是说在限定包存活周期内目标没有响应)，不过在我们的例子中没有这种情况出现。在各列中如果都小于100ms则可认为是不错的状态。在后面的两列显示了路途中的路由器和IP地址。 </p>
<p><br>故障探测 </p>
<p>有时TRACERT的报告会显示出无法到达一个目标服务器的问题所在。例如，下面TRACERT的报告显示出一个循环错误。 </p>
<p>8 98 ms 89 ms 90 ms 204.245.69.98</p>
<p>9 91 ms 90 ms 92 ms 204.245.69.97</p>
<p>10 94 ms 96 ms 95 ms 204.245.69.98</p>
<p>11 98 ms 98 ms 103 ms 204.245.69.97</p>
<p>12 101 ms 101 ms 100 ms 204.245.69.98</p>
<p>13 106 ms 102 ms 104 ms 204.245.69.97</p>
<p>这个结果显示出两个路由器将包来回来去的相互发送。这使包无法到达目标服务器。这种循环显示会一直到到达TRACERT默认的最大节点数量限制(30个)才停止。 </p>
<p>您可很容易的通过PING或TRACERT程序得到测试结果。而且您可以把有问题的测试结果发给您的ISP。要保存结果可通过命令&#8220;PING地址&gt;文件名&#8221;或&#8220;TRACERT地址&gt;文件名&#8221;形成一个文本文件。 </p>
<p>当然，在很多情况下您对网络的缓慢或问题无能为力，不过这些工具至少能使您知道引起网络速度下降的原因，督促相关部门修复或调整。</p>
<img src ="http://www.phpweblog.net/killjin/aggbug/2701.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.phpweblog.net/killjin/" target="_blank">Prog</a> 2008-01-17 15:08 <a href="http://www.phpweblog.net/killjin/archive/2008/01/17/2701.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ftp中主动模式(port)与被动模式(PASV)</title><link>http://www.phpweblog.net/killjin/archive/2008/01/06/2653.html</link><dc:creator>Prog</dc:creator><author>Prog</author><pubDate>Sun, 06 Jan 2008 07:01:00 GMT</pubDate><guid>http://www.phpweblog.net/killjin/archive/2008/01/06/2653.html</guid><wfw:comment>http://www.phpweblog.net/killjin/comments/2653.html</wfw:comment><comments>http://www.phpweblog.net/killjin/archive/2008/01/06/2653.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.phpweblog.net/killjin/comments/commentRss/2653.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/killjin/services/trackbacks/2653.html</trackback:ping><description><![CDATA[<span class=content><strong>目录</strong> <br>
<ul>&nbsp;&nbsp;&nbsp;&nbsp; <br>
    <li>&nbsp;开场白 <br>
    <li>&nbsp;基础 <br>
    <li>&nbsp;主动FTP <br>
    <li>&nbsp;主动FTP的例子 <br>
    <li>&nbsp;被动FTP <br>
    <li>&nbsp;被动FTP的例子 <br>
    <li>&nbsp;总结 <br>
    <li>&nbsp;参考资料 <br>
    <li>&nbsp;附录&nbsp;1:&nbsp;配置常见FTP服务器 <br></li>
</ul>
<br><br><strong>开场白</strong> <br><br>处理防火墙和其他网络连接问题时最常见的一个难题是主动FTP与被动FTP的区别以及如何完美地支持它们。幸运地是，本文能够帮助你清除在防火墙环境中如何支持FTP这个问题上的一些混乱。 <br><br>本文也许不像题目声称的那样是一个权威解释，但我已经听到了很多好的反馈意见，也看到了本文在许多地方被引用，知道了很多人都认为它很有用。虽然我一直在找寻改进的方法，但如果你发现某个地方讲的不够清楚，需要更多的解释，请告诉我！最近的修改是增加了主动FTP和被动FTP会话中命令的例子。这些会话的例子应该对更好地理解问题有所帮助。例子中还提供了非常棒的图例来解释FTP会话过程的步骤。现在，正题开始了... <br><br><strong>基础</strong> <br><br>FTP是仅基于TCP的服务，不支持UDP。&nbsp;与众不同的是FTP使用2个端口，一个数据端口和一个命令端口（也可叫做控制端口）。通常来说这两个端口是21－命令端口和20－数据端口。但当我们发现根据（FTP工作）方式的不同数据端口并不总是20时，混乱产生了。 <br><br><strong>主动FTP</strong> <br><br>主动方式的FTP是这样的：客户端从一个任意的非特权端口N（N&gt;;1024）连接到FTP服务器的命令端口，也就是21端口。然后客户端开始监听端口N+1，并发送FTP命令&#8220;port&nbsp;N+1&#8221;到FTP服务器。接着服务器会从它自己的数据端口（20）连接到客户端指定的数据端口（N+1）。 <br><br>针对FTP服务器前面的防火墙来说，必须允许以下通讯才能支持主动方式FTP： <br>
<ol type=1><br>
    <li>任何端口到FTP服务器的21端口&nbsp;（客户端初始化的连接&nbsp;S&lt;-C） <br>
    <li>FTP服务器的21端口到大于1023的端口（服务器响应客户端的控制端口&nbsp;S-&gt;C） <br>
    <li>FTP服务器的20端口到大于1023的端口（服务器端初始化数据连接到客户端的数据端口&nbsp;S-&gt;C） <br>
    <li>大于1023端口到FTP服务器的20端口（客户端发送ACK响应到服务器的数据端口&nbsp;S&lt;-C） <br><br><br>画出来的话，连接过程大概是下图的样子： <br><img alt="" src="http://slacksite.com/images/ftp/activeftp.gif" onload="var image=new Image();image.src=this.src;if(image.width>0 &amp;&amp; image.height>0){if(image.width>=510){this.width=510;this.height=image.height*510/image.width;}}"> <br><br>在第1步中，客户端的命令端口与FTP服务器的命令端口建立连接，并发送命令&#8220;PORT&nbsp;1027&#8221;。然后在第2步中，FTP服务器给客户端的命令端口返回一个"ACK"。在第3步中，FTP服务器发起一个从它自己的数据端口（20）到客户端先前指定的数据端口（1027）的连接，最后客户端在第4步中给服务器端返回一个"ACK"。 <br><br>主动方式FTP的主要问题实际上在于客户端。FTP的客户端并没有实际建立一个到服务器数据端口的连接，它只是简单的告诉服务器自己监听的端口号，服务器再回来连接客户端这个指定的端口。对于客户端的防火墙来说，这是从外部系统建立到内部客户端的连接，这是通常会被阻塞的。 <br><br><strong>主动FTP的例子</strong> <br><br>下面是一个主动FTP会话的实际例子。当然服务器名、IP地址和用户名都做了改动。在这个例子中，FTP会话从&nbsp;testbox1.slacksite.com&nbsp;(192.168.150.80)，一个运行标准的FTP命令行客户端的Linux工作站，发起到testbox2.slacksite.com&nbsp;(192.168.150.90)，一个运行ProFTPd&nbsp;1.2.2RC2的Linux工作站。debugging（-d）选项用来在FTP客户端显示连接的详细过程。红色的文字是&nbsp;debugging信息，显示的是发送到服务器的实际FTP命令和所产生的回应信息。服务器的输出信息用黑色字表示，用户的输入信息用粗体字表示。 <br><br>仔细考虑这个对话过程我们会发现一些有趣的事情。我们可以看到当&nbsp;PORT&nbsp;命令被提交时，它指定了客户端(192.168.150.80)上的一个端口而不是服务器的。当我们用被动FTP时我们会看到相反的现象。我们再来关注PORT命令的格式。就象你在下面的例子看到的一样，它是一个由六个被逗号隔开的数字组成的序列。前四个表示IP地址，后两个组成了用于数据连接的端口号。用第五个数乘以256再加上第六个数就得到了实际的端口号。下面例子中端口号就是(&nbsp;(14*256)&nbsp;+&nbsp;178)&nbsp;=&nbsp;3762。我们可以用netstat来验证这个端口信息。 <br><br>testbox1:&nbsp;{/home/p-t/slacker/public_html}&nbsp;%&nbsp;<strong>ftp&nbsp;-d&nbsp;testbox2</strong> <br>Connected&nbsp;to&nbsp;testbox2.slacksite.com. <br>220&nbsp;testbox2.slacksite.com&nbsp;FTP&nbsp;server&nbsp;ready. <br>Name&nbsp;(testbox2:slacker):&nbsp;<strong>slacker</strong> <br><font color=#ff0000>---&gt;&nbsp;USER&nbsp;slacker</font> <br>331&nbsp;Password&nbsp;required&nbsp;for&nbsp;slacker. <br>Password:<strong>&nbsp;TmpPass</strong> <br><font color=#ff0000>---&gt;&nbsp;PASS&nbsp;XXXX</font> <br>230&nbsp;User&nbsp;slacker&nbsp;logged&nbsp;in. <br><font color=#ff0000>---&gt;&nbsp;SYST <br>215&nbsp;UNIX&nbsp;Type:&nbsp;L8</font> <br>Remote&nbsp;system&nbsp;type&nbsp;is&nbsp;UNIX. <br>Using&nbsp;binary&nbsp;mode&nbsp;to&nbsp;transfer&nbsp;files. <br>ftp&gt;<strong>&nbsp;ls</strong> <br><font color=#ff0000>ftp:&nbsp;setsockopt&nbsp;(ignored):&nbsp;Permission&nbsp;denied <br>---&gt;&nbsp;PORT&nbsp;192,168,150,80,14,178</font> <br>200&nbsp;PORT&nbsp;command&nbsp;successful. <br><font color=#ff0000>---&gt;&nbsp;LIST</font> <br>150&nbsp;Opening&nbsp;ASCII&nbsp;mode&nbsp;data&nbsp;connection&nbsp;for&nbsp;file&nbsp;list. <br>drwx------&nbsp;&nbsp;&nbsp;3&nbsp;slacker&nbsp;&nbsp;&nbsp;&nbsp;users&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;104&nbsp;Jul&nbsp;27&nbsp;01:45&nbsp;public_html <br>226&nbsp;Transfer&nbsp;complete. <br>ftp&gt;&nbsp;<strong>quit</strong> <br><font color=#ff0000>---&gt;&nbsp;QUIT</font> <br>221&nbsp;Goodbye. <br><br><strong>被动FTP</strong> <br><br>为了解决服务器发起到客户的连接的问题，人们开发了一种不同的FTP连接方式。这就是所谓的被动方式，或者叫做PASV，当客户端通知服务器它处于被动模式时才启用。 <br><br>在被动方式FTP中，命令连接和数据连接都由客户端，这样就可以解决从服务器到客户端的数据端口的入方向连接被防火墙过滤掉的问题。当开启一个FTP连接时，客户端打开两个任意的非特权本地端口（N&nbsp;&gt;;&nbsp;1024和N+1）。第一个端口连接服务器的21端口，但与主动方式的FTP不同，客户端不会提交PORT命令并允许服务器来回连它的数据端口，而是提交PASV命令。这样做的结果是服务器会开启一个任意的非特权端口（P&nbsp;&gt;;&nbsp;1024），并发送PORT&nbsp;P命令给客户端。然后客户端发起从本地端口N+1到服务器的端口P的连接用来传送数据。 <br><br>对于服务器端的防火墙来说，必须允许下面的通讯才能支持被动方式的FTP: <br>
    <ol type=1><br>
        <li>从任何端口到服务器的21端口&nbsp;（客户端初始化的连接&nbsp;S&lt;-C） <br>
        <li>服务器的21端口到任何大于1023的端口&nbsp;（服务器响应到客户端的控制端口的连接&nbsp;S-&gt;C） <br>
        <li>从任何端口到服务器的大于1023端口&nbsp;（入；客户端初始化数据连接到服务器指定的任意端口&nbsp;S&lt;-C） <br>
        <li>服务器的大于1023端口到远程的大于1023的端口（出；服务器发送ACK响应和数据到客户端的数据端口&nbsp;S-&gt;C） <br><br>画出来的话，被动方式的FTP连接过程大概是下图的样子： <br><img alt="" src="http://slacksite.com/images/ftp/passiveftp.gif" onload="var image=new Image();image.src=this.src;if(image.width>0 &amp;&amp; image.height>0){if(image.width>=510){this.width=510;this.height=image.height*510/image.width;}}"> <br><br>在第1步中，客户端的命令端口与服务器的命令端口建立连接，并发送命令&#8220;PASV&#8221;。然后在第2步中，服务器返回命令"PORT&nbsp;2024"，告诉客户端（服务器）用哪个端口侦听数据连接。在第3步中，客户端初始化一个从自己的数据端口到服务器端指定的数据端口的数据连接。最后服务器在第4&nbsp;步中给客户端的数据端口返回一个"ACK"响应。 <br><br>被动方式的FTP解决了客户端的许多问题，但同时给服务器端带来了更多的问题。最大的问题是需要允许从任意远程终端到服务器高位端口的连接。幸运的是，许多FTP守护程序，包括流行的WU-FTPD允许管理员指定FTP服务器使用的端口范围。详细内容参看附录1。&nbsp; <br><br>第二个问题是客户端有的支持被动模式，有的不支持被动模式，必须考虑如何能支持这些客户端，以及为他们提供解决办法。例如，Solaris提供的FTP命令行工具就不支持被动模式，需要第三方的FTP客户端，比如ncftp。 <br><br>随着WWW的广泛流行，许多人习惯用web浏览器作为FTP客户端。大多数浏览器只在访问ftp://这样的URL时才支持被动模式。这到底是好还是坏取决于服务器和防火墙的配置。 <br><br><strong>被动FTP的例子</strong> <br><br>下面是一个被动FTP会话的实际例子，只是服务器名、IP地址和用户名都做了改动。在这个例子中，FTP会话从&nbsp;testbox1.slacksite.com&nbsp;(192.168.150.80)，一个运行标准的FTP命令行客户端的Linux工作站，发起到testbox2.slacksite.com&nbsp;(192.168.150.90)，一个运行ProFTPd&nbsp;1.2.2RC2的Linux工作站。debugging（-d）选项用来在FTP客户端显示连接的详细过程。红色的文字是&nbsp;debugging信息，显示的是发送到服务器的实际FTP命令和所产生的回应信息。服务器的输出信息用黑色字表示，用户的输入信息用粗体字表示。 <br><br>注意此例中的PORT命令与主动FTP例子的不同。这里，我们看到是服务器(192.168.150.90)而不是客户端的一个端口被打开了。可以跟上面的主动FTP例子中的PORT命令格式对比一下。 <br><br>testbox1:&nbsp;{/home/p-t/slacker/public_html}&nbsp;%&nbsp;ftp&nbsp;-d&nbsp;testbox2 <br>Connected&nbsp;to&nbsp;testbox2.slacksite.com. <br>220&nbsp;testbox2.slacksite.com&nbsp;FTP&nbsp;server&nbsp;ready. <br>Name&nbsp;(testbox2:slacker):&nbsp;<strong>slacker</strong> <br><font color=#ff0000>---&gt;&nbsp;USER&nbsp;slacker</font> <br>331&nbsp;Password&nbsp;required&nbsp;for&nbsp;slacker. <br>Password:&nbsp;<strong>TmpPass</strong> <br><font color=#ff0000>---&gt;&nbsp;PASS&nbsp;XXXX</font> <br>230&nbsp;User&nbsp;slacker&nbsp;logged&nbsp;in. <br><font color=#ff0000>---&gt;&nbsp;SYST <br>215&nbsp;UNIX&nbsp;Type:&nbsp;L8</font> <br>Remote&nbsp;system&nbsp;type&nbsp;is&nbsp;UNIX. <br>Using&nbsp;binary&nbsp;mode&nbsp;to&nbsp;transfer&nbsp;files. <br>ftp&gt;&nbsp;<strong>passive</strong> <br>Passive&nbsp;mode&nbsp;on. <br>ftp&gt;&nbsp;<strong>ls</strong> <br><font color=#ff0000>ftp:&nbsp;setsockopt&nbsp;(ignored):&nbsp;Permission&nbsp;denied</font> <br><font color=#ff0000>---&gt;&nbsp;PASV</font> <br>227&nbsp;Entering&nbsp;Passive&nbsp;Mode&nbsp;(192,168,150,90,195,149). <br><font color=#ff0000>---&gt;&nbsp;LIST</font> <br>150&nbsp;Opening&nbsp;ASCII&nbsp;mode&nbsp;data&nbsp;connection&nbsp;for&nbsp;file&nbsp;list <br>drwx------&nbsp;&nbsp;&nbsp;3&nbsp;slacker&nbsp;&nbsp;&nbsp;&nbsp;users&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;104&nbsp;Jul&nbsp;27&nbsp;01:45&nbsp;public_html <br>226&nbsp;Transfer&nbsp;complete. <br>ftp&gt;;&nbsp;<strong>quit</strong> <br><font color=#ff0000>---&gt;&nbsp;QUIT</font> <br>221&nbsp;Goodbye. <br><br><strong>总结</strong> <br><br>下面的图表会帮助管理员们记住每种FTP方式是怎样工作的： <br><br>主动FTP： <br>&nbsp;&nbsp;&nbsp;命令连接：客户端&nbsp;&gt;1023端口&nbsp;-&gt;&nbsp;服务器&nbsp;21端口 <br>&nbsp;&nbsp;&nbsp;数据连接：客户端&nbsp;&gt;1023端口&nbsp;&lt;-&nbsp;服务器&nbsp;20端口&nbsp; <br><br>被动FTP： <br>&nbsp;&nbsp;&nbsp;命令连接：客户端&nbsp;&gt;1023端口&nbsp;-&gt;&nbsp;服务器&nbsp;21端口 <br>&nbsp;&nbsp;&nbsp;数据连接：客户端&nbsp;&gt;1023端口&nbsp;-&gt;&nbsp;服务器&nbsp;&gt;1023端口&nbsp; <br><br>下面是主动与被动FTP优缺点的简要总结：&nbsp; <br><br>主动FTP对FTP服务器的管理有利，但对客户端的管理不利。因为FTP服务器企图与客户端的高位随机端口建立连接，而这个端口很有可能被客户端的防火墙阻塞掉。被动FTP对FTP客户端的管理有利，但对服务器端的管理不利。因为客户端要与服务器端建立两个连接，其中一个连到一个高位随机端口，而这个端口很有可能被服务器端的防火墙阻塞掉。 <br><br>幸运的是，有折衷的办法。既然FTP服务器的管理员需要他们的服务器有最多的客户连接，那么必须得支持被动FTP。我们可以通过为FTP服务器指定一个有限的端口范围来减小服务器高位端口的暴露。这样，不在这个范围的任何端口会被服务器的防火墙阻塞。虽然这没有消除所有针对服务器的危险，但它大大减少了危险。详细信息参看附录1。 <br><br><br><strong>参考资料&nbsp;</strong> <br><br>O'Reilly出版的《组建Internet防火墙》（第二版，Brent&nbsp;Chapman，Elizabeth&nbsp;Zwicky著）是一本很不错的参考资料。里面讲述了各种Internet协议如何工作，以及有关防火墙的例子。&nbsp; <br><br>最权威的FTP参考资料是RFC&nbsp;959，它是FTP协议的官方规范。RFC的资料可以从许多网站上下载，例如：<a href="ftp://nic.merit.edu/documents/rfc/rfc0959.txt&nbsp;" target=_blank><font color=#000000 size=2>ftp://nic.merit.edu/documents/rfc/rfc0959.txt&nbsp;</font></a>。 </li>
    </ol>
    </li>
</ol>
</span>
<img src ="http://www.phpweblog.net/killjin/aggbug/2653.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.phpweblog.net/killjin/" target="_blank">Prog</a> 2008-01-06 15:01 <a href="http://www.phpweblog.net/killjin/archive/2008/01/06/2653.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>最全的ARP欺骗攻击原理深入分析</title><link>http://www.phpweblog.net/killjin/archive/2007/12/10/2523.html</link><dc:creator>Prog</dc:creator><author>Prog</author><pubDate>Sun, 09 Dec 2007 23:43:00 GMT</pubDate><guid>http://www.phpweblog.net/killjin/archive/2007/12/10/2523.html</guid><wfw:comment>http://www.phpweblog.net/killjin/comments/2523.html</wfw:comment><comments>http://www.phpweblog.net/killjin/archive/2007/12/10/2523.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.phpweblog.net/killjin/comments/commentRss/2523.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/killjin/services/trackbacks/2523.html</trackback:ping><description><![CDATA[<p><strong>1、ARP协议概述</strong></p>
<p>IP数据包常通过以太网发送。以太网设备并不识别32位IP地址：它们是以48位以太网地址传输以太网数据包的。因此，IP驱动器必须把IP目的地址转换成以太网网目的地址。在这两种地址之间存在着某种静态的或算法的映射，常常需要查看一张表。地址解析协议(Address Resolution Protocol，ARP)就是用来确定这些映象的协议。</p>
<p>ARP工作时，送出一个含有所希望的IP地址的以太网广播数据包。目的地主机，或另一个代表该主机的系统，以一个含有IP和以太网地址对的数据包作为应答。发送者将这个地址对高速缓存起来，以节约不必要的ARP通信。</p>
<p>如果有一个不被信任的节点对本地网络具有写访问许可权，那么也会有某种风险。这样一台机器可以发布虚假的ARP报文并将所有通信都转向它自己，然后它就可以扮演某些机器，或者顺便对数据流进行简单的修改。ARP机制常常是自动起作用的。在特别安全的网络上， ARP映射可以用固件，并且具有自动抑制协议达到防止干扰的目的。<br></p>
<table cellSpacing=0 borderColorDark=#ffffff align=center bgColor=#ddddd borderColorLight=#999999 border=1>
    <tbody>
        <tr>
            <td bgColor=#ffffff><img onmousewheel="javascript:return big(this)" style="WIDTH: 498px; HEIGHT: 224px" height=224 alt="" src="http://www.phpweblog.net/images/phpweblog_net/killjin/1.gif" width=498 onload="javascript:if(this.width>498)this.style.width=498;" border=0 src_cetemp="http://www.phpweblog.net/images/phpweblog_net/killjin/1.gif"></td>
        </tr>
        <tr>
            <td align=middle bgColor=#dddddd>图1 以太网上的ARP报文格式 </td>
        </tr>
    </tbody>
</table>
<p>图1是一个用作IP到以太网地址转换的ARP报文的例子。在图中每一行为32位，也就是4个八位组表示，在以后的图中，我们也将遵循这一方式。</p>
<p>硬件类型字段指明了发送方想知道的硬件接口类型，以太网的值为1。协议类型字段指明了发送方提供的高层协议类型，IP为0806（16进制）。硬件地址长度和协议长度指明了硬件地址和高层协议地址的长度，这样ARP报文就可以在任意硬件和任意协议的网络中使用。操作字段用来表示这个报文的目的，ARP请求为1，ARP响应为2，RARP请求为3，RARP响应为4。</p>
<p>当发出ARP请求时，发送方填好发送方首部和发送方IP地址，还要填写目标IP地址。当目标机器收到这个ARP广播包时，就会在响应报文中填上自己的48位主机地址。<br><br><strong>2、ARP使用举例<br></strong>我们先看一下linux下的arp命令(如果开始arp表中的内容为空的话,需要先对某台主机进行一个连接,例如ping一下目标主机来产生一个arp项)：<br></p>
<p>&nbsp;</p>
<p>
<table cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
    <tbody>
        <tr>
            <td bgColor=#e6e6e6>
            <pre>d2server:/home/kerberos# arp
            Address          HWtype  HWaddress         Flags Mask            Iface
            211.161.17.254   ether   00:04:9A:AD:1C:0A      C                 eth0
            </pre>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p>Address：主机的IP地址<br>Hwtype：主机的硬件类型<br>Hwaddress：主机的硬件地址<br>Flags Mask：记录标志，"C"表示arp高速缓存中的条目，"M"表示静态的arp条目。<br>用"arp --a"命令可以显示主机地址与IP地址的对应表，也就是机器中所保存的arp缓存信息。这个高速缓存存放了最近Internet地址到硬件地址之间的映射记录。高速缓存中每一项的生存时间一般为20分钟，起始时间从被创建时开始算起。<br></p>
<p>
<table cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
    <tbody>
        <tr>
            <td bgColor=#e6e6e6>
            <pre>d2server:/home/kerberos# arp -a
            (211.161.17.254) at 00:04:9A:AD:1C:0A [ether] on eth0
            </pre>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p>可以看到在缓存中有一条211.161.17.254相对应的arp缓存条目。<br></p>
<p>
<table cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
    <tbody>
        <tr>
            <td bgColor=#e6e6e6>
            <pre>d2server:/home/kerberos# telnet 211.161.17.21
            Trying 211.161.17.21...
            Connected to 211.161.17.21.
            Escape character is '^]'.
            ^].
            telnet&gt;quit
            connetion closed.
            </pre>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p>在执行上面一条telnet命令的同时，用tcpdump进行监听：<br></p>
<p>
<table cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
    <tbody>
        <tr>
            <td bgColor=#e6e6e6>
            <pre>d2server:/home/kerberos# tcpdump -e dst host 211.161.17.21
            tcpdump: listening on eth0
            </pre>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p><br>我们将会听到很多包，我们取与我们arp协议相关的2个包：<br></p>
<p>
<table cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
    <tbody>
        <tr>
            <td bgColor=#e6e6e6>
            <pre>1  0.0 00:D0:F8:0A:FB:83 FF:FF:FF:FF:FF:FF  arp  60
            who has 211.161.17.21 tell d2server
            2  0.002344(0.0021)00:E0:3C:43:0D:24 00:D0:F8:0A:FB:83  arp  60
            arp reply 211.161.17.21 is at 00:E0:3C:43:0D:24
            </pre>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p>在第1行中，源端主机（d2server）的硬件地址是00:D0:F8:0A:FB:83。目的端主机的硬件地址是FF:FF:FF:FF:FF:FF，这是一个以太网广播地址。电缆上的每个以太网接口都要接收这个数据帧并对它进行处理。<br>第1行中紧接着的一个输出字段是arp，表明帧类型字段的值是0x0806，说明此数据帧是一个ARP请求或回答。<br>在每行中，单词后面的值60指的是以太网数据帧的长度。由于ARP请求或回答的数据帧长都是42字节（28字节的ARP数据，14字节的以太网帧头），因此，每一帧都必须加入填充字符以达到以太网的最小长度要求：60字节。<br>第1行中的下一个输出字段arp who-has表示作为ARP请求的这个数据帧中，目的I P地址是211.161.17.21的地址，发送端的I P地址是d2server的地址。tcpdump打印出主机名对应的默认I P地址。<br>从第2行中可以看到，尽管ARP请求是广播的，但是ARP应答的目的地址却是211.161.17.21(00:E0:3C:43:0D:24)。ARP应答是直接送到请求端主机的，而是广播的。tcpdump打印出arp reply的字样，同时打印出响应者的主机ip和硬件地址。<br>在每一行中，行号后面的数字表示tcpdump收到分组的时间（以秒为单位）。除第1行外，每行在括号中还包含了与上一行的时间差异（以秒为单位）。<br>这个时候我们再看看机器中的arp缓存：<br></p>
<p>
<table cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
    <tbody>
        <tr>
            <td bgColor=#e6e6e6>
            <pre>d2server:/home/ke
            rberos# arp -a (211.161.17.254) at 00:04:9A:AD:1C:0A
            [ether] on eth0 (211.161.17.21) at 00:E0:3C:43:0D:24 [ether] on eth0
            </pre>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p>arp高速缓存中已经增加了一条有关211.161.17.21的映射。<br>再看看其他的arp相关的命令：<br></p>
<p>
<table cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
    <tbody>
        <tr>
            <td bgColor=#e6e6e6>
            <pre>d2server:/home/kerberos# arp -s 211.161.17.21 00:00:00:00:00:00
            d2server:/home/kerberos# arp
            Address          HWtype  HWaddress        Flags Mask       Iface
            211.161.17.254     ether   00:04:9A:AD:1C:0A     C            eth0
            211.161.17.21      ether   00:00:00:00:00:00      CM           eth0
            d2server:/home/kerberos# arp -a
            (211.161.17.254) at 00:04:9A:AD:1C:0A [ether] on eth0
            (211.161.17.21) at 00:00:00:00:00:00 [ether] PERM on eth0
            </pre>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p><br>可以看到我们用arp -s选项设置了211.161.17.21对应的硬件地址为00:00:00:00:00:00，而且这条映射的标志字段为CM,也就是说我们手工设置的arp选项为静态arp选项，它保持不变没有超时，不像高速缓存中的条目要在一定的时间间隔后更新。<br>如果想让手工设置的arp选项有超时时间的话，可以加上temp选项<br></p>
<p>
<table cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
    <tbody>
        <tr>
            <td bgColor=#e6e6e6>
            <pre>d2server:/home/kerberos# arp -s 211.161.17.21 00:00:00:00:00:00 temp
            d2server:/home/kerberos# arp -a
            (211.161.17.254) at 00:04:9A:AD:1C:0A [ether] on eth0
            (211.161.17.21) at 00:00:00:00:00:00 [ether] on eth0
            d2server:/home/kerberos# arp
            Address        HWtype  HWaddress         Flags Mask      Iface
            211.161.17.254   ether   00:04:9A:AD:1C:0A     C            eth0
            211.161.17.21    ether   00:00:00:00:00:00       C            eth0
            </pre>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p><br>可以看到标志字段的静态arp标志"M"已经去掉了，我们手工加上的是一条动态条目。<br>请大家注意arp静态条目与动态条目的区别。<br>在不同的系统中，手工设置的arp静态条目是有区别的。在linux和win2000中，静态条目不会因为伪造的arp响应包而改变，而动态条目会改变。而在win98中，手工设置的静态条目会因为收到伪造的arp响应包而改变。<br>如果您想删除某个arp条目（包括静态条目），可以用下面的命令：<br></p>
<p>
<table cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
    <tbody>
        <tr>
            <td bgColor=#e6e6e6>
            <pre>d2server:/home/kerberos# arp -d 211.161.17.21
            d2server:/home/kerberos# arp -a
            (211.161.17.254) at 00:04:9A:AD:1C:0A [ether] on eth0
            (211.161.17.21) at  on eth0
            </pre>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p>可以看到211.161.17.21的arp条目已经是不完整的了。<br>还有一些其他的命令，可以参考linux下的man文档：d2server:/home/kerberos# man arp<br><br><br><strong>3、ARP欺骗<br></strong>我们先复习一下上面所讲的ARP协议的原理。在实现TCP/IP协议的网络环境下，一个ip包走到哪里，要怎么走是靠路由表定义，但是，当ip包到达该网络后，哪台机器响应这个ip包却是靠该ip包中所包含的硬件mac地址来识别。也就是说，只有机器的硬件mac地址和该ip包中的硬件mac地址相同的机器才会应答这个ip包，因为在网络中，每一台主机都会有发送ip包的时候，所以，在每台主机的内存中，都有一个 arp--&gt; 硬件mac 的转换表。通常是动态的转换表（该arp表可以手工添加静态条目）。也就是说，该对应表会被主机在一定的时间间隔后刷新。这个时间间隔就是ARP高速缓存的超时时间。<br>通常主机在发送一个ip包之前，它要到该转换表中寻找和ip包对应的硬件mac地址，如果没有找到，该主机就发送一个ARP广播包，于是，主机刷新自己的ARP缓存。然后发出该ip包。 <br>了解这些常识后，现在就可以谈在以太网络中如何实现ARP欺骗了，可以看看这样一个例子。<br><strong>3.1 同一网段的ARP欺骗<br></p>
<p>&nbsp;</p>
</strong>
<p>
<table cellSpacing=0 borderColorDark=#ffffff align=center bgColor=#ddddd borderColorLight=#999999 border=1>
    <tbody>
        <tr>
            <td bgColor=#ffffff><a href="" target=_blank href_cetemp><img onmousewheel="javascript:return big(this)" height=337 alt="" src="http://www.phpweblog.net/images/phpweblog_net/killjin/2.gif" width=355 onload="javascript:if(this.width>498)this.style.width=498;" border=0 src_cetemp="http://www.phpweblog.net/images/phpweblog_net/killjin/2.gif"></a></td>
        </tr>
        <tr>
            <td align=middle bgColor=#dddddd>图2 同一网段的arp欺骗</td>
        </tr>
    </tbody>
</table>
</p>
<p><br>如图2所示，三台主机<br></p>
<p>
<table cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
    <tbody>
        <tr>
            <td bgColor=#e6e6e6>
            <pre>A: ip地址 192.168.0.1 硬件地址 AA:AA:AA:AA:AA:AA
            B: ip地址 192.168.0.2 硬件地址 BB:BB:BB:BB:BB:BB
            C: ip地址 192.168.0.3 硬件地址 CC:CC:CC:CC:CC:CC</pre>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p>一个位于主机B的入侵者想非法进入主机A，可是这台主机上安装有防火墙。通过收集资料他知道这台主机A的防火墙只对主机C有信任关系（开放23端口(telnet)）。而他必须要使用telnet来进入主机A，这个时候他应该如何处理呢？</p>
<p>我们这样考虑，入侵者必须让主机A相信主机B就是主机C，如果主机A和主机C之间的信任关系是建立在ip地址之上的。如果单单把主机B的ip地址改的和主机C的一样，那是不能工作的，至少不能可靠地工作。如果你告诉以太网卡设备驱动程序， 自己IP是192.168.0.3，那么这只是一种纯粹的竞争关系，并不能达到目标。我们可以先研究C这台机器如果我们能让这台机器暂时当掉，竞争关系就可以解除,这个还是有可能实现的。在机器C当掉的同时，将机器B的ip地址改为192.168.0.3,这样就可以成功的通过23端口telnet到机器A上面，而成功的绕过防火墙的限制。</p>
<p>上面的这种想法在下面的情况下是没有作用的，如果主机A和主机C之间的信任关系是建立在硬件地址的基础上。这个时候还需要用ARP欺骗的手段让主机A把自己的ARP缓存中的关于192.168.0.3映射的硬件地址改为主机B的硬件地址。</p>
<p>我们可以人为的制造一个arp_reply的响应包,发送给想要欺骗的主机,这是可以实现的,因为协议并没有规定必须在接收到arp_echo后才可以发送响应包.这样的工具很多,我们也可以直接用snifferpro抓一个arp响应包,然后进行修改。</p>
<p>你可以人为地制造这个包。可以指定ARP包中的源IP、目标IP、源MAC地址、目标MAC地址。这样你就可以通过虚假的ARP响应包来修改主机A上的动态ARP缓存达到欺骗的目的。<br><strong>下面是具体的步骤：</strong><br>1.他先研究192.0.0.3这台主机，发现这台主机的漏洞。 <br>2.根据发现的漏洞使主机C当掉，暂时停止工作。 <br>3.这段时间里，入侵者把自己的ip改成192.0.0.3 <br>4.他用工具发一个源ip地址为192.168.0.3源MAC地址为BB:BB:BB:BB:BB:BB的包给主机A，要求主机A更新自己的arp转换表。 <br>5.主机更新了arp表中关于主机C的ip--&gt;mac对应关系。 <br>6.防火墙失效了，入侵的ip变成合法的mac地址，可以telnet 了。 <br>上面就是一个ARP的欺骗过程，这是在同网段发生的情况，但是，提醒注意的是，在B和C处于不同网段的时候，上面的方法是不起作用的。</p>
<p><strong>3.2 不同网段的ARP欺骗</strong></p>
<p>
<table cellSpacing=0 borderColorDark=#ffffff align=center bgColor=#ddddd borderColorLight=#999999 border=1>
    <tbody>
        <tr>
            <td bgColor=#ffffff><a href="" target=_blank href_cetemp><img onmousewheel="javascript:return big(this)" height=336 alt="" src="http://www.phpweblog.net/images/phpweblog_net/killjin/3.gif" width=468 onload="javascript:if(this.width>498)this.style.width=498;" border=0 src_cetemp="http://www.phpweblog.net/images/phpweblog_net/killjin/3.gif"></a></td>
        </tr>
        <tr>
            <td align=middle bgColor=#dddddd>图3 不同网段之间的ARP欺骗</td>
        </tr>
    </tbody>
</table>
</p>
<p>如图3所示A、C位于同一网段而主机B位于另一网段，三台机器的ip地址和硬件地址如下：<br></p>
<p>
<table cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
    <tbody>
        <tr>
            <td bgColor=#e6e6e6>
            <pre>A: ip地址 192.168.0.1 硬件地址 AA:AA:AA:AA:AA:AA
            B: ip地址 192.168.1.2 硬件地址 BB:BB:BB:BB:BB:BB
            C: ip地址 192.168.0.3 硬件地址 CC:CC:CC:CC:CC:CC
            </pre>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p>在现在的情况下，位于192.168.1网段的主机B如何冒充主机C欺骗主机A呢？显然用上面的办法的话，即使欺骗成功，那么由主机B和主机A之间也无法建立telnet会话，因为路由器不会把主机A发给主机B的包向外转发，路由器会发现地址在192.168.0.这个网段之内。</p>
<p>现在就涉及到另外一种欺骗方式―ICMP重定向。把ARP欺骗和ICMP重定向结合在一起就可以基本实现跨网段欺骗的目的。</p>
<p><strong>什么是ICMP重定向呢？</strong><br>ICMP重定向报文是ICMP控制报文中的一种。在特定的情况下，当路由器检测到一台机器使用非优化路由的时候，它会向该主机发送一个ICMP重定向报文，请求主机改变路由。路由器也会把初始数据报向它的目的地转发。</p>
<p>我们可以利用ICMP重定向报文达到欺骗的目的。下面是结合ARP欺骗和ICMP重定向进行攻击的步骤：<br>1.为了使自己发出的非法ip包能在网络上能够存活长久一点，开始修改ip包的生存时间ttl为下面的过程中可能带来的问题做准备。把ttl改成255. (ttl定义一个ip包如果在网络上到不了主机后，在网络上能存活的时间，改长一点在本例中有利于做充足的广播) <br>2.下载一个可以自由制作各种包的工具（例如hping2） <br>3.然后和上面一样，寻找主机C的漏洞按照这个漏洞当掉主机C。 <br>4.在该网络的主机找不到原来的192.0.0.3后，将更新自己的ARP对应表。于是他发送一个原ip地址为192.168.0.3硬件地址为BB:BB:BB:BB:BB:BB的ARP响应包。 <br>5.好了，现在每台主机都知道了，一个新的MAC地址对应192.0.0.3,一个ARP欺骗完成了，但是，每台主机都只会在局域网中找这个地址而根本就不会把发送给192.0.0.3的ip包丢给路由。于是他还得构造一个ICMP的重定向广播。 <br>6.自己定制一个ICMP重定向包告诉网络中的主机："到192.0.0.3的路由最短路径不是局域网，而是路由，请主机重定向你们的路由路径，把所有到192.0.0.3的ip包丢给路由。" <br>7.主机A接受这个合理的ICMP重定向，于是修改自己的路由路径，把对192.0.0.3的通讯都丢给路由器。 <br>8.入侵者终于可以在路由外收到来自路由内的主机的ip包了，他可以开始telnet到主机的23口。 <br>其实上面的想法只是一种理想话的情况，主机许可接收的ICMP重定向包其实有很多的限制条件，这些条件使ICMP重定向变的非常困难。</p>
<p>TCP/IP协议实现中关于主机接收ICMP重定向报文主要有下面几条限制：<br>1.新路由必须是直达的 <br>2.重定向包必须来自去往目标的当前路由 <br>3.重定向包不能通知主机用自己做路由 <br>4.被改变的路由必须是一条间接路由 <br>由于有这些限制，所以ICMP欺骗实际上很难实现。但是我们也可以主动的根据上面的思维寻找一些其他的方法。更为重要的是我们知道了这些欺骗方法的危害性，我们就可以采取相应的防御办法。<br><br><br><br><strong>3.3 ARP欺骗的防御<br></strong>知道了ARP欺骗的方法和危害，我们给出一些初步的防御方法：<br>1.不要把你的网络安全信任关系建立在ip地址的基础上或硬件mac地址基础上，（rarp同样存在欺骗的问题），理想的关系应该建立在ip+mac基础上。 <br>2.设置静态的mac--&gt;ip对应表，不要让主机刷新你设定好的转换表。 <br>3.除非很有必要，否则停止使用ARP，将ARP做为永久条目保存在对应表中。在linux下可以用ifconfig -arp可以使网卡驱动程序停止使用ARP。 <br>4.使用代理网关发送外出的通讯。 <br>5.修改系统拒收ICMP重定向报文 <br>在linux下可以通过在防火墙上拒绝ICMP重定向报文或者是修改内核选项重新编译内核来拒绝接收ICMP重定向报文。<br>在win2000下可以通过防火墙和IP策略拒绝接收ICMP报文。<br>4 代理ARP的应用<br>代理ARP有两大应用,一个是有利的就是我们在防火墙实现中常说的透明模式的实现,另一个是有害的就是通过它可以达到在交换环境中进行嗅探的目的.由此可见同样一种技术被应用于不同的目的,效果是不一样的.<br>我们先来看交换环境中局域网的嗅探.<br>通常在局域网环境中，我们都是通过交换环境的网关上网的。在交换环境中使用NetXray或者NAI Sniffer一类的嗅探工具除了抓到自己的包以外，是不能看到其他主机的网络通信的。<br>但是我们可以通过利用ARP欺骗可以实现Sniffer的目的。<br>ARP协议是将IP地址解析为MAC地址的协议，局域网中的通信都是基于MAC地址的。 </p>
<p>&nbsp;</p>
<p>
<table cellSpacing=0 borderColorDark=#ffffff align=center bgColor=#ddddd borderColorLight=#999999 border=1>
    <tbody>
        <tr>
            <td bgColor=#ffffff><a href="" target=_blank href_cetemp><img onmousewheel="javascript:return big(this)" height=336 alt="" src="http://www.phpweblog.net/images/phpweblog_net/killjin/4.gif" width=468 onload="javascript:if(this.width>498)this.style.width=498;" border=0 src_cetemp="http://www.phpweblog.net/images/phpweblog_net/killjin/4.gif"></a></td>
        </tr>
        <tr>
            <td align=middle bgColor=#dddddd>图4 交换网络中的ARP欺骗</td>
        </tr>
    </tbody>
</table>
</p>
<p>如图4所示，三台主机位于一个交换网络的环境中，其中A是网关：<br></p>
<p>
<table cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
    <tbody>
        <tr>
            <td bgColor=#e6e6e6>
            <pre>A: ip地址 192.168.0.1 硬件地址 AA:AA:AA:AA:AA
            B: ip地址 192.168.0.2 硬件地址 BB:BB:BB:BB:BB
            C：ip地址 192.168.0.3 硬件地址 CC:CC:CC:CC:CC</pre>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p>在局域网中192.168.0.2和192.168.0.3都是通过网关192.168.0.1上网的，假定攻击者的系统为192.168.0.2，他希望听到192.168.0.3的通信，那么我们就可以利用ARP欺骗实现。</p>
<p>这种欺骗的中心原则就是arp代理的应用.主机A是局域网中的代理服务器,局域网中每个节点的向外的通信都要通过它.主机B想要听主机C的通信,它需要先使用ARP欺骗,让主机C认为它就是主机A,这个时候它发一个IP地址为192.168.0.1,物理地址为BB:BB:BB:BB:BB:BB的ARP响应包给主机C,这样主机C会把发往主机A的包发往主机B.同理,还要让网关A相信它就是主机C,向网关A发送一个IP地址为192.168.0.3,物理地址为BB:BB:BB:BB:BB:BB的包。</p>
<p>上面这一步的操作和前面的ARP欺骗的原理是一样的，但是还是有问题,过一段时间主机B会发现自己无法上网.所以下面还有一个步骤就是需要在主机B上转发从主机A到主机C的包,并且转发从主机C到主机A的包.现在我们可以看到其实主机B在主机A和主机C的通讯中起到了一个代理的作用,这就是为什么叫做ARP代理的原因.</p>
<p>具体实现要用到两个工具dsniff和fragrouter,dsniff用来实现ARP欺骗,fragroute用来进行包的转发.<br>首先利用dsniff中的arpspoof来实现ARP欺骗,dsniff软件可以在下面的网址下载:<br><a href="http://naughty.monkey.org/~dugsong/dsniff"><font color=#002c99>http://naughty.monkey.org/~dugsong/dsniff</font></a><br>安装这个软件包之前先要下载安装libnet.</p>
<p>欺骗192.168.0.3，告诉这台机器网关192.168.0.1的MAC地址是192.168.0.2的MAC地址. <br>[root@sound dsniff-2.3]# ./arpspoof -i eth0 -t 192.168.0.3 192.168.0.1<br>欺骗192.168.0.1，告诉192.168.0.1主机192.168.0.3的MAC地址是192.168.0.2的MAC地址。<br>[root@sound dsniff-2.3]# ./arpspoof -i eth0 -t 192.168.0.1 192.168.0.3</p>
<p>现在我们已经完成了第一步的欺骗,这个欺骗是通过arpspoof来完成的,当然您也可以使用别的工具甚至自己发包来完成.现在我们可以看到在主机A和主机C的arp列表里面都完成了我们需要的工作.在后面的透明代理中我们将使用另外一种不同的理念.</p>
<p>下面我们先打开linux系统中的转发包的选项:<br>[root@sound /root]# echo "1" &gt;/proc/sys/net/ipv4/ip_forward</p>
<p>下面我们可以下载大名鼎鼎的dugsong的另外一个工具fragroute,这个工具以前叫做fragrouter(仅有1字的差别)主要用于实现入侵检测系统处理分片的ip和tcp包功能的检测,本身自代包转发的功能.可以到下面的网站下载:<br><a href="http://monkey.org/~dugsong/fragroute/"><font color=#002c99>http://monkey.org/~dugsong/fragroute/</font></a><br>安装这个软件包之前先要下载安装libpcap和libevent.</p>
<p>当然我们也可以使用fragrouter来完成:<br><a href="http://www.packetstormsecurity.org/groups/"><font color=#002c99>http://www.packetstormsecurity.org/groups/</font></a> w00w00/sectools/fragrouter/ <br>[root@sound fragrouter-1.6]# ./fragrouter -B1 <br>fragrouter: base-1: normal IP forwarding</p>
<p>现在就可以实现在交换局域网中嗅探的目标.当然上面这些只是一些原理性的介绍,在真正的使用中会遇到很多的问题,比如如何实现对网关A和主机C的欺骗,以及如何处理可能出现的广播风暴问题,这些可以在实践中学习.还有一个叫arpsniff的工具能够很方便的完成这一功能,很多网站都提供下载,界面比较友好,由于和上面的原理一样,只是工具使用上的不同并且添加了一些附加的功能,所以这里不在进行介绍.</p>
<p>代理ARP的另外一个应用就是防火墙的透明代理的实现.我们都知道早期的防火墙大都是基于路由模式,也就是防火墙要完成一个路由的作用.这种接入方式需要在局域网内的主机上设置防火墙的IP为代理,而且需要在外部路由器的路由表中加入一条指向防火墙的路由.这种方式的缺点在于不透明,需要进行过多的设置,并且破坏了原有的网络拓扑.所以现在几乎全部的防火墙都实现了一种透明接入的功能,用户的路由器和客户端不用做任何修改,用户甚至感觉不到透明接入方式防火墙的存在.这种透明接入的原理就是ARP代理.</p>
<p>我们现在看如何配置一台主机作为透明接入模式的防火墙(透明接入的防火墙不需要IP),</p>
<p>
<table cellSpacing=0 borderColorDark=#ffffff align=center bgColor=#ddddd borderColorLight=#999999 border=1>
    <tbody>
        <tr>
            <td bgColor=#ffffff><a href="" target=_blank href_cetemp><img onmousewheel="javascript:return big(this)" height=176 alt="" src="http://www.phpweblog.net/images/phpweblog_net/killjin/5.gif" width=307 onload="javascript:if(this.width>498)this.style.width=498;" border=0 src_cetemp="http://www.phpweblog.net/images/phpweblog_net/killjin/5.gif"></a></td>
        </tr>
        <tr>
            <td align=middle bgColor=#dddddd>图5 </td>
        </tr>
    </tbody>
</table>
</p>
<p>如图5所示,一台防火墙连接内部网段和DMZ网段到外部路由.我们在这台用作防火墙的主机上使用linux操作系统,这样我们可以方便的使用iptables防火墙.假设三块网卡为eth0,eth1和eth2,eth0和路由器相连,eth1和内网相连.eth2和外网相连.假设DMZ区有2台服务器.</p>
<p>
<table cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
    <tbody>
        <tr>
            <td bgColor=#e6e6e6>
            <pre>内网地址:192.168.1.0/24
            DMZ地址:192.168.1.2---192.168.1.3
            路由器的ip地址:192.168.1.1
            eth0:AA:AA:AA:AA:AA:AA
            eth1:BB:BB:BB:BB:BB:BB
            eth2:CC:CC:CC:CC:CC:CC</pre>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p>和前面差不多,第一步需要实现ARP欺骗,这次我们有个简单的实现.我们把路由器的IP地址和防火墙的eth1和eth2的网卡物理地址绑定,将内网和DMZ网段的IP地址和eth0的网卡绑定,在linux系统上我们用arp命令实现:</p>
<p>
<table cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
    <tbody>
        <tr>
            <td bgColor=#e6e6e6>
            <pre>arp -s 192.168.1.1 BB:BB:BB:BB:BB:BB
            arp -s 192.168.1.1 CC:CC:CC:CC:CC:CC
            arp -s 192.168.1.0/24 AA:AA:AA:AA:AA:AA
            </pre>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p>第二部我们需要在基于linux的防火墙上设置路由,把目标地址是外部路由的包转发到eth0,把目标地址为内网的包转发到eth1,把目标地址是DMZ网段服务器的包转发到eth2.在linux下面用route命令实现<br></p>
<p>
<table cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
    <tbody>
        <tr>
            <td bgColor=#e6e6e6>
            <pre>route add 192.168.1.1 dev eth0
            route add -net 192.168.1.0/24  dev eth1
            route add 192.168.1.2  dev eth2
            route add 192.168.1.3  dev eth3
            </pre>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p><br>(针对DMZ网段里面的每台服务器都要增加一条单独的路由) 现在我们就已经实现了一个简单的arp代理的透明接入,当然对应于防火墙的iptables部分要另外配置,iptables的配置不在本文范畴之内.</p>
<p><strong>小结</strong><br>本文介绍了ARP协议以及与其相关的安全问题。一个重要的安全问题就是ARP欺骗，我们讲到了同一网段的ARP欺骗以及跨网段的ARP欺骗和ICMP重定向相结合的方法。由于有这些安全问题的存在，我们给出一些最基本的解决办法。最后谈到了利用代理ARP实现在交换网络中嗅探和防火墙的透明接入。<br></p>
<img src ="http://www.phpweblog.net/killjin/aggbug/2523.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.phpweblog.net/killjin/" target="_blank">Prog</a> 2007-12-10 07:43 <a href="http://www.phpweblog.net/killjin/archive/2007/12/10/2523.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Google搜索引擎的几点常见用法</title><link>http://www.phpweblog.net/killjin/archive/2007/09/15/1960.html</link><dc:creator>Prog</dc:creator><author>Prog</author><pubDate>Fri, 14 Sep 2007 21:53:00 GMT</pubDate><guid>http://www.phpweblog.net/killjin/archive/2007/09/15/1960.html</guid><wfw:comment>http://www.phpweblog.net/killjin/comments/1960.html</wfw:comment><comments>http://www.phpweblog.net/killjin/archive/2007/09/15/1960.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.phpweblog.net/killjin/comments/commentRss/1960.html</wfw:commentRss><trackback:ping>http://www.phpweblog.net/killjin/services/trackbacks/1960.html</trackback:ping><description><![CDATA[你真的会用Google搜索引擎吗?<br>　　平时很多人用Google搜索引擎搜索信息，经常搜索成千上万的网页，查看几页就没耐心找下去了。在Google上搜索信息，不只输入希望搜索的词组这么简单，这样是无法得到做好的搜索结果的。Google为用户提供了很多基本搜索语法，熟练的运用Google搜索，将很快的搜到我们需要的结果。<br><br>短语搜索<br>　　Google默认的设置是在页面上任何位置搜索到用户定义的关键词，无论这些关键词是连在一起的，还是彼此分散的。如果希望搜索的结果中包含按照输入顺序出现的关键词，那应该在关键词加上引号，告诉搜索引擎用户需要的是什么样的匹配方式。在Google中，这就叫做短语搜索（phase search）。<br>如果以&#8220;娱乐资讯信息&#8221;关键词进行搜索，Google搜索出来的结果是那些在页面上任何位置包含这些关键词的关键字的页面，不一定按照输入的关键词的顺序显示。<br>如果以&#8220;"娱乐资讯信息"&#8221;关键词进行搜索，Google搜索出来的结果就包含这个关键词的页面，并且按照输入顺序显示。<br><br>布尔逻辑<br>　　对于一个搜索引擎的算法，搜索的页面是匹配所有的关键词，还是仅包含关键词的任意次就可以，称之为搜索引擎的布尔逻辑默认值。搜索引擎可以使用布尔逻辑与：AND（搜索到所有关键词），或者使用布尔逻辑或：OR(搜索到任意一个关键字即可)。就是搜索引擎默认布尔逻辑也不是说只能用这种逻辑，可以通过一些特殊的命令来执行其他的逻辑。Google搜索引擎默认是AND逻辑。<br>如果以&#8220;娱乐资讯信息&#8221;关键词进行搜索，Google会自动搜索所要包含关键词的网页。<br>如果希望的是匹配其中的任意个关键词，应该在每个词的中间加上&#8220;OR&#8221; ，如：&#8220;娱乐 OR 资讯 OR 信息&#8221;。（注：逻辑或要用大写&#8220;OR&#8221;，或者&#8220;|&#8221;）。<br>也可以将关键词用括号将其分组，搜索某个关键词加上一个或者几个其他的关键词。具体形式如下：&#8220;娱乐 (资讯 OR 信息)&#8221;，搜索的结果会是&#8220;资讯&#8221;或&#8220;信息&#8221;包含&#8220;娱乐&#8221;的网页。<br><br>否定<br>　　如果要求的查询结果里不包含有个词，可以使用符号&#8220;-&#8221;（一个减号），如：&#8220;娱乐咨询 &#8211;信息&#8221;，就会搜索到包含&#8220;娱乐&#8221;和&#8220;咨询&#8221;两个关键词，而不包含&#8220;信息&#8221;的网页。（注：减号与关键词之间不能有空格）。<br><br>同义词<br>　　有时候搜索的结果中会丢失一些重要的网页，因为选择的关键词不是唯一的表达这个信息方式，还有其他的表达方式。如果不跟关键词匹配，那就不会出现在搜索结果中。<br>Google允许查询同义词，在关键词的前面插入&#8220;~&#8221;符号，就可以进行同义词的查询了。这个功能好像对中文不怎么支持，输入&#8220;~汽车&#8221;，查询的网页都是有关&#8220;汽车&#8221;的页面没有发现同义词。用英文测试一下，输入&#8220;~car&#8221;查询，就会发现了同义词&#8220;BMW&#8221;和&#8220;Racing&#8221;等。<br><br>数字范围<br>　　在网络搜索时，有时候会遇到查询连个数字区间的问题，比如日期、货币、尺寸、重量、高度或其他的计量系统数字区间问题。数字范围运算符&#8220;..&#8221;（两个点）表示查询某个特定的数字范围内的结果。比如查询数码相机，价格在2000元-3000元之间的网页，如&#8220;数码相机 2000..3000元 &#8221;。<br>也可以进行最大值和最小值的搜索，比如，如果查找在蒙大拿州内不少于500英亩的土地，可以这样搜索，&#8220;acres Montana land 500..&#8221;；如果你想购买一件价值在30$以下的宠物雨衣，可以这样搜索&#8220;raincoat dog ..$30&#8221;。但是最大值和最小值对中文不支持的不好。最小值搜索，比如搜索关键词&#8220;济南商品房面积 90..&#8221;，就不会有任何搜索结果；最大值搜索，如果用关键词&#8220;济南商品房面积 ..120&#8221;，只是搜索到有包含任何关键词的网页，最大值没有体现出来。<br><br>参考资料：《Google Hacks 2nd Edition》. 
<img src ="http://www.phpweblog.net/killjin/aggbug/1960.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.phpweblog.net/killjin/" target="_blank">Prog</a> 2007-09-15 05:53 <a href="http://www.phpweblog.net/killjin/archive/2007/09/15/1960.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>