浅入ARP
2016-06-10 13:40
323 查看
1.ARP的工作原理
IP层协议ARP的核心功能就是通过目的主机IP地址得到主机的硬件地址,然后通过硬件地址进行通信。和计算机网络中的很多技术一样,ARP协议也是使用了建立一个缓存表的思想。它规定每个主机都维护着一个ARP高速缓存,里面是本网络中IP地址和MAC地址的映射表且这个表会动态更新。显然当主机需要MAC地址时它会首先查找ARP高速缓存,如果有的话就直接作为MAC地址构造MAC帧,否则则会运行ARP协议寻找MAC地址。首先ARP在本局域网广播一个ARP请求数据报,里面包含自己的源MAC、源IP、目的IP,想要得到目的MAC。这个广播数据包是依赖MAC帧来实现的,下图是MAC帧格式,其中在目的MAC中将地址设置为全F则为广播,ARP请求报文则是作为MAC帧的数据部分放入MAC帧中。接下来本网络中所有主机全都收到ARP请求,若主机与数据包中目的IP相同则收下这个数据包并返回一个响应数据包,其中含有自己的MAC地址。注意此时响应数据包是单播而不是广播,发送方收到接收方回复的响应数据包后便将这条映射加入ARP高速缓存,同时接收方也会添加这条映射。接下来发送方根据得到的IP-MAC映射表找到对应的MAC,在MAC层将目的MAC设置为找到的MAC地址并封装数据包发送出去,如果映射表不变就将以这个MAC地址来进行通信了。
![](http://images2015.cnblogs.com/blog/728358/201606/728358-20160610133806730-1044782853.png)
![](http://images2015.cnblogs.com/blog/728358/201606/728358-20160608190849199-1049636787.png)
2.为什么需要ARP
通过上面的ARP工作原理的介绍我们发现并不是只有通过MAC地址才能进行通信,得到MAC地址本身就是使用了IP地址。也就是说明明就可以使用IP地址进行本网络的数据转发,结果还要通过IP得到MAC然后再通过MAC进行通信,这样岂不是多此一举?再来看看这个过程,当数据包到达路由器后,路由器解析数据包后知道要从一个端口转发出去,可是路由器不知道目的主机的MAC地址,于是它广播ARP请求去得到目的MAC。假设现在路由器不寻找MAC地址,而是通过IP进行路由转发。到达交换机后,我们假设这种交换机不是根据MAC-端口转发的,而是通过IP-端口转发的。这种假想交换机会学习IP-端口而不是MAC-端口映射关系,数据包到达特殊的交换机后便可以通过路由端口表进行数据包的转发了。再来看互联网中的网络层,本来我想要不要去掉第二层直接全部使用路由器。但是由于有子网划分,一个路由器端口对应着一个网段,没必要在很小的网络里还划分子网,这样速度会变慢,因此仍然需要在第二层设置交换机。我们知道在第三层路由转发时路由器会修改源MAC与目的MAC,现在IP数据包格式不变,里面的源IP和目的IP和原来一样不会变化,而在二层帧中,完全可以使用变化的源IP和目的IP来代替原来的源MAC和目的MAC。也就是说一份以太网数据包,有4个IP地址,三层有2个不变的源IP和目的IP,二层则是随着路由转发时刻改变的源IP和目的IP。所以如果仅仅只是讨论IP代替MAC能否实现正常的网络通信,我觉得是可以代替的。
当然如今使用三层IP二层MAC也是有原因的,因为互联网发展到今天才形成采用以太网+TCP/IP的模式。当初使用MAC地址进行点到点通信时发现MAC较难记忆,简单的IP地址能够满足通信和记忆的需要。而且曾经还有各种各样的其他网络接口层协议,由于不同的网络可能使用不同的硬件地址,这样的话这些异构网络进行通信将会很麻烦。随着前辈们不停的探索发现愈发觉得分层这种思想的重要性。采用IP的话则可以屏蔽掉下层的复杂性,而下层则可以使用不同的网络协议,只要保证上层的IP协议是统一的或者在路由器可以进行转换的基础上使用其它的网络层协议。这相当于表现层拿业务层对象时通过业务层接口来取得,而实现类可以有不同的功能。
3.针对ARP的攻击
由于ARP协议中主机接收数据包不会有什么限制,因此任何时候攻击者都可以给主机发送ARP请求或ARP响应数据包。在局域网的ARP攻击中主要分为2类,一类就是发送大量的数据包造成洪泛,一类是ARP欺骗。再来回顾ARP解析的过程,假设A和B通信建立了正确的ARP高速缓存。现在有一个攻击者C,它向B发送伪装的ARP响应数据包,其中目的IP为B,源IP为A,源MAC为C的MAC地址。这样B收到后更新ARP高速缓存,将原来的映射关系改为A的IP地址和C的MAC地址。如下图所示,这样的话A能正常给B发送数据,但是B给A发送的数据则会被C收到。如果攻击者再对A也发送伪装的数据包,这样C就成了A和B的中间人了,C可以收到A与B之间的通信数据。ARP欺骗还有一种攻击,那就是攻击者可以给路由器网关发送大量的错误ARP响应数据包。在这个数据包中数据链路层源MAC是攻击者C的MAC,目的MAC为路由器MAC(这个MAC可通过路由器ARP广播时得到),在网络层中,攻击者可以伪造网络中任意的IP地址,但是ARP数据包的源MAC将设置为不在本网络中的任意MAC地址。这样的话将导致路由器中的ARP高速缓存中放入了大量错误的IP与MAC映射条目。当一个发往主机D的数据包到达路由器后,如下图攻击后的ARP表可以看出,路由器会解析数据包通过目的IP找到转发出去的端口然后封装数据链路层。这时路由器就要去查找ARP高速缓存了,它发现主机D对应的MAC为MACH,于是源MAC为路由器的MAC目的MAC为MACH。封装数据包后交给交换机,交换机查看目的MAC发现没有MACH这个硬件地址所对应的端口。接下来交换机广播这个数据包给ABCD,但由于根本就没MACH这个硬件地址因此ABCD四个主机将全部丢弃这个数据包,这样整个网络都不可用了。如果攻击者不持续发送响应数据包,那瘫痪的网络将会在路由器更新ARP高速缓存时恢复正常状态,如果攻击者持续发送数据包整个网络仍将瘫痪。从攻击过程我们发现攻击者需要发送大量的ARP请求数据包,可以通过这个特征来找到发起攻击的主机。为了预防ARP欺骗,最最本质的事情就是要保证ARP高速缓存是正确的,我们可以设置静态的IP-MAC映射表来达到这一目的,许多防护软件就是以这个原理为基础来设置静态映射表,从而达到防御ARP攻击的目的。
本人新手一枚,有些地方是自己的思考,如有错误还请指出!
IP层协议ARP的核心功能就是通过目的主机IP地址得到主机的硬件地址,然后通过硬件地址进行通信。和计算机网络中的很多技术一样,ARP协议也是使用了建立一个缓存表的思想。它规定每个主机都维护着一个ARP高速缓存,里面是本网络中IP地址和MAC地址的映射表且这个表会动态更新。显然当主机需要MAC地址时它会首先查找ARP高速缓存,如果有的话就直接作为MAC地址构造MAC帧,否则则会运行ARP协议寻找MAC地址。首先ARP在本局域网广播一个ARP请求数据报,里面包含自己的源MAC、源IP、目的IP,想要得到目的MAC。这个广播数据包是依赖MAC帧来实现的,下图是MAC帧格式,其中在目的MAC中将地址设置为全F则为广播,ARP请求报文则是作为MAC帧的数据部分放入MAC帧中。接下来本网络中所有主机全都收到ARP请求,若主机与数据包中目的IP相同则收下这个数据包并返回一个响应数据包,其中含有自己的MAC地址。注意此时响应数据包是单播而不是广播,发送方收到接收方回复的响应数据包后便将这条映射加入ARP高速缓存,同时接收方也会添加这条映射。接下来发送方根据得到的IP-MAC映射表找到对应的MAC,在MAC层将目的MAC设置为找到的MAC地址并封装数据包发送出去,如果映射表不变就将以这个MAC地址来进行通信了。
![](http://images2015.cnblogs.com/blog/728358/201606/728358-20160610133806730-1044782853.png)
![](http://images2015.cnblogs.com/blog/728358/201606/728358-20160608190849199-1049636787.png)
2.为什么需要ARP
通过上面的ARP工作原理的介绍我们发现并不是只有通过MAC地址才能进行通信,得到MAC地址本身就是使用了IP地址。也就是说明明就可以使用IP地址进行本网络的数据转发,结果还要通过IP得到MAC然后再通过MAC进行通信,这样岂不是多此一举?再来看看这个过程,当数据包到达路由器后,路由器解析数据包后知道要从一个端口转发出去,可是路由器不知道目的主机的MAC地址,于是它广播ARP请求去得到目的MAC。假设现在路由器不寻找MAC地址,而是通过IP进行路由转发。到达交换机后,我们假设这种交换机不是根据MAC-端口转发的,而是通过IP-端口转发的。这种假想交换机会学习IP-端口而不是MAC-端口映射关系,数据包到达特殊的交换机后便可以通过路由端口表进行数据包的转发了。再来看互联网中的网络层,本来我想要不要去掉第二层直接全部使用路由器。但是由于有子网划分,一个路由器端口对应着一个网段,没必要在很小的网络里还划分子网,这样速度会变慢,因此仍然需要在第二层设置交换机。我们知道在第三层路由转发时路由器会修改源MAC与目的MAC,现在IP数据包格式不变,里面的源IP和目的IP和原来一样不会变化,而在二层帧中,完全可以使用变化的源IP和目的IP来代替原来的源MAC和目的MAC。也就是说一份以太网数据包,有4个IP地址,三层有2个不变的源IP和目的IP,二层则是随着路由转发时刻改变的源IP和目的IP。所以如果仅仅只是讨论IP代替MAC能否实现正常的网络通信,我觉得是可以代替的。
当然如今使用三层IP二层MAC也是有原因的,因为互联网发展到今天才形成采用以太网+TCP/IP的模式。当初使用MAC地址进行点到点通信时发现MAC较难记忆,简单的IP地址能够满足通信和记忆的需要。而且曾经还有各种各样的其他网络接口层协议,由于不同的网络可能使用不同的硬件地址,这样的话这些异构网络进行通信将会很麻烦。随着前辈们不停的探索发现愈发觉得分层这种思想的重要性。采用IP的话则可以屏蔽掉下层的复杂性,而下层则可以使用不同的网络协议,只要保证上层的IP协议是统一的或者在路由器可以进行转换的基础上使用其它的网络层协议。这相当于表现层拿业务层对象时通过业务层接口来取得,而实现类可以有不同的功能。
3.针对ARP的攻击
由于ARP协议中主机接收数据包不会有什么限制,因此任何时候攻击者都可以给主机发送ARP请求或ARP响应数据包。在局域网的ARP攻击中主要分为2类,一类就是发送大量的数据包造成洪泛,一类是ARP欺骗。再来回顾ARP解析的过程,假设A和B通信建立了正确的ARP高速缓存。现在有一个攻击者C,它向B发送伪装的ARP响应数据包,其中目的IP为B,源IP为A,源MAC为C的MAC地址。这样B收到后更新ARP高速缓存,将原来的映射关系改为A的IP地址和C的MAC地址。如下图所示,这样的话A能正常给B发送数据,但是B给A发送的数据则会被C收到。如果攻击者再对A也发送伪装的数据包,这样C就成了A和B的中间人了,C可以收到A与B之间的通信数据。ARP欺骗还有一种攻击,那就是攻击者可以给路由器网关发送大量的错误ARP响应数据包。在这个数据包中数据链路层源MAC是攻击者C的MAC,目的MAC为路由器MAC(这个MAC可通过路由器ARP广播时得到),在网络层中,攻击者可以伪造网络中任意的IP地址,但是ARP数据包的源MAC将设置为不在本网络中的任意MAC地址。这样的话将导致路由器中的ARP高速缓存中放入了大量错误的IP与MAC映射条目。当一个发往主机D的数据包到达路由器后,如下图攻击后的ARP表可以看出,路由器会解析数据包通过目的IP找到转发出去的端口然后封装数据链路层。这时路由器就要去查找ARP高速缓存了,它发现主机D对应的MAC为MACH,于是源MAC为路由器的MAC目的MAC为MACH。封装数据包后交给交换机,交换机查看目的MAC发现没有MACH这个硬件地址所对应的端口。接下来交换机广播这个数据包给ABCD,但由于根本就没MACH这个硬件地址因此ABCD四个主机将全部丢弃这个数据包,这样整个网络都不可用了。如果攻击者不持续发送响应数据包,那瘫痪的网络将会在路由器更新ARP高速缓存时恢复正常状态,如果攻击者持续发送数据包整个网络仍将瘫痪。从攻击过程我们发现攻击者需要发送大量的ARP请求数据包,可以通过这个特征来找到发起攻击的主机。为了预防ARP欺骗,最最本质的事情就是要保证ARP高速缓存是正确的,我们可以设置静态的IP-MAC映射表来达到这一目的,许多防护软件就是以这个原理为基础来设置静态映射表,从而达到防御ARP攻击的目的。
本人新手一枚,有些地方是自己的思考,如有错误还请指出!
![](http://images2015.cnblogs.com/blog/728358/201606/728358-20160610133716215-424497850.png)
相关文章推荐
- 抽象类和接口的区别
- Oracle 11g R2+RAC+ASM+OracleLinux6.4安装详解(图)
- 1 thinkphp 如何访问控制层
- 算法与数据结构之简单排序
- jstl标签不起作用不管用,jstl标签直接输出表达式
- Failed to get the adb version: "/android-sdk/tools/adb"权限不够
- Android自定义View
- 如何将latex模板中的照片框去掉?
- Win 7 64位 单机Spark安装
- 第三方轮子处理内容的汇总
- 设计模式---简单工场模式
- 打开gps定位-->发回短信&拦截指令&锁屏&销毁数据&ComponentName
- 利用wrapper打包java编写的服务注册window服务
- 网络 协议
- 【GOF23设计模式】_装饰模式_IO流底层架构_装饰和桥接模式的区别JAVA240
- Android如何隐藏底部虚拟按键
- 农村土地确权之调查公示 —— ArcGIS中地块分布图标注设置说明[地块分布图制作]
- 【leetcode】96. Unique Binary Search Trees
- CSS3实现炫酷进度条
- PowerDesigner连接数据库附PowerDesigner15.1汉化破解版