醉里乾坤大,壶中日月长

【原创】TCP/IP之ARP

上一篇 / 下一篇  2009-06-08 20:45:42

首先今天露了个怯,在论坛新手上路区看到一篇TCP/IP的帖子,里面说ARP协议是链路层的,我当时大脑放映过来的ARP不是网络层吗?然后就反驳了人家,呵呵,后来查了查资料,ARP果然是链路层的协议,而且之前在部门培训IP寻址的时候我还讲过ARP是链路层协议,真不好意思啊。

看《TCP/IP详解卷一:协议》的1.3节有一幅TCP/IP协议族分层,里面详细描述了ARP和RARP是链路层,同时在第二章链路层介绍中,明确提出了链路层的三个主要目的:1)为IP模块发送和接受IP数据包 2)为ARP模块发送ARP请求和接受ARP应答 3)为RARP模块发送RARP请求和接受RARP应答,在这里咱们可以确认ARP和RARP是链路层协议了。

好,说清楚了这个问题,就来谈谈ARP吧。

TCP/IP协议族是一个整体,是整个协议族各协议协同作战使网络传输成为了现实。而ARP在其中的作用非常重要:链路层寻址。可以很多朋友对ARP数据包比较熟悉,里面包含了目的IP地址,本地MAC地址,本机IP地址,我们发现少了目的MAC地址,而ARP协议的主要作用就是为了获取目的MAC地址。为什么要获取目的MAC地址呢?说来简单,TCP/IP是分层封包的,从应用层-->传输层-->网络层-->链路层,在链路层需要目的MAC地址。

数据包寻址是分为两个阶段的,IP寻址和ARP寻址,当要发送的数据包是本网段内网地址时,IP数据包就不会路由转发出去,而是通过ARP协议直接获取数据包目的MAC从而直接将数据包发送到目的地。

具体的ARP寻址的过程就是:加入你的本机IP地址是192.168.1.10,然后你要发送数据包到192.168.1.100,这时候IP模块通过route table会发现目的IP地址和你是同一网段的,这时候它就会首先去arp table查找在arp table是否有192.168.1.100这条记录,如果有,就会直接读取记录中的MAC地址组包,发包;如果没有,就会调用ARP模块面向MAC地址为ff:ff:ff:ff:ff:ff(255.255.255.255)的广播地址发送ARP请求。局域网中的同网段所有主机都会收到这个ARP数据包,然后在IP层将ARP数据包中的目的IP地址和本机的IP地址比对,如果相同,就会返回一个ARP应答包,里面填充源主机的MAC地址和IP地址,同时将自己的MAC地址和IP地址封装到包中,这样刚才询问的源主机就获取了目的主机的MAC地址,从而可以封包发包了。

过程简单来说就一句话:小明你住哪?

为什么这么说呢,听我道来:其实整个过程可以用下面这个故事描述:你住在大院,你的门卫是王大爷。。。如果看着不熟悉的,请参看之前的日志《高手眼中的网络》。你写了封信给小明,信写好了就翻开你的通讯录,发现小明居然就和你住在同一个大院,这时候你会怎么做?总不会傻到还要寄到邮局再让邮局发给小明吧,那样消费就大了(邮票钱,人工钱),所以最简单的办法:你跑到院子里,对着所有的人家狂喊“小明你丫住哪?”,这时候小明听到了你的喊叫,回了你句“你丫别喊了,我在三号门”,这时候你就可以把信直接给他送过去了。

这是一个非常简单的建模,当然有的时候不是这么简单的事情,这就是最近两天我在做的事情:ARP欺骗。

ARP欺骗主要是对两个IP地址的欺骗:网关欺骗和DNS欺骗。简单来说(接下来的建模就更简单了),你刚睡醒要写信(唉,这主没事就写信了)这时候突然外面有个人狂喊,我是网关,我在三号门,我是网关,我在三号门。。。一直这么絮叨着,本来你的ARP table中已经注明了:网关在1号门,可是ARP协议就是这样,它会根据收到的ARP数据包更新自己的ARP table,这时候你要发往外网的信就倒霉了,将全部发往刚才那哥们喊得地址去了。它获得你的数据包主要有两种处理方式:一种就是直接丢弃,这样方式对你也没啥影响,只不过你不能上网而已。。。别急,这并不变态,如果他将他的电脑设置为可以抓发数据包并且正确的指向到正确网关,这时你是可以上网的,但人家费了半天劲为了啥呢?呵呵,可能是为了给你限速可能是为了窃取你的网络信息,因为这时候可以sniffer了。

在实际测试中你可以使用自己的IP地址和MAC地址构造ARP欺骗包,从来实现上面说的让被欺骗主机的数据包发送到你电脑的目的,同时也可以构造不存在的IP地址和MAC地址,这样对方就完全不能够上网了。建议使用第二种办法,因为第二种办法我测试了使用360ARP防火墙是跟踪不到你的地址的,但如果使用本机构造欺骗包时,360ARP防火墙是可以跟踪到你的地址的,从而被人家揪出来,这样就影响和谐了。

上面说的两种欺骗包都非常好实现。各位可以到自己的局域网中去尝试下,并不难。现在在分析ARP防火墙,目前主流的ARP防火墙技术是两种方式实现的:一种是不断的往外放ARP请求包已获得正确的ARP地址,二是通过保护ARP table来避免欺骗ARP包对本机ARP table的篡改。第二种方式应用的比较少,因为它不能保证目前ARP table中的记录是否为正确的,如果是不正确的岂不是会错?

而第一种方法是非常消耗网络资源的,而且在测试中,如果多线程频繁发欺骗包(我是针对一台指定虚拟机发的),360防火墙在获取正确的网关地址也需要一段时间的缓冲,我现在在想如果我能够足够告诉的发包理论上是可以让被欺骗主机无法获取正确的网关MAC的,在继续测试中。。。

 

 

可能全篇都是文字没有代码自己看着都不爽,但我觉得有两点是我很少在日志上写代码的原因:1)代码在实现中并不重要,我一直认为理论比代码重要,代码只不过是思想的转化,就好像说话似的,懂得理论(思想)才最重要 2)这些说道的代码都非常简单,有兴趣完全可以自己去试试,几行就可以实现一个简单的ARP欺骗


TAG:

测试也是一种人生吗? 引用 删除 欧阳   /   2009-06-19 16:44:32
逍遥家以后地板上放张地毯哈。
假装不在 引用 删除 假装不在   /   2009-06-09 10:33:16
沙发者,必坐之。
 

评分:0

我来说两句

Open Toolbar