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地址来进行通信了。

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攻击的目的。

本人新手一枚,有些地方是自己的思考,如有错误还请指出!

声明:本文原创发表于博客园,作者为方小白,如有错误欢迎指出 。本文未经作者许可不许转载,否则视为侵权。

浅入ARP的更多相关文章

  1. 浅入浅出EmguCv(三)EmguCv打开指定视频

    打开视频的思路跟打开图片的思路是一样的,只不过视频是由一帧帧图片组成,因此,打开视频的处理程序有一个连续的获取图片并逐帧显示的处理过程.GUI同<浅入浅出EmguCv(二)EmguCv打开指定图 ...

  2. 浅入浅出EmguCv(一)OpenCv与EmguCv

    最近接触计算机视觉方面的东西,于是准备下手学习opencv,从官网下载windows的安装版,配置环境,一系列步骤走完后,准备按照惯例弄个HelloWord.也就是按照网上的教程,打开了那个图像处理领 ...

  3. 浅入深出之Java集合框架(上)

    Java中的集合框架(上) 由于Java中的集合框架的内容比较多,在这里分为三个部分介绍Java的集合框架,内容是从浅到深,如果已经有java基础的小伙伴可以直接跳到<浅入深出之Java集合框架 ...

  4. 浅入深出之Java集合框架(中)

    Java中的集合框架(中) 由于Java中的集合框架的内容比较多,在这里分为三个部分介绍Java的集合框架,内容是从浅到深,如果已经有java基础的小伙伴可以直接跳到<浅入深出之Java集合框架 ...

  5. 浅入深出之Java集合框架(下)

    Java中的集合框架(下) 由于Java中的集合框架的内容比较多,在这里分为三个部分介绍Java的集合框架,内容是从浅到深,哈哈这篇其实也还是基础,惊不惊喜意不意外 ̄▽ ̄ 写文真的好累,懒得写了.. ...

  6. 浅入深出Vue:环境搭建

    浅入深出Vue:环境搭建 工欲善其事必先利其器,该搭建我们的环境了. 安装NPM 所有工具的下载地址都可以在导航篇中找到,这里我们下载的是最新版本的NodeJS Windows安装程序 下载下来后,直 ...

  7. 浅入深出Vue:工具准备之PostMan安装配置及Mock服务配置

    浅入深出Vue之工具准备(二):PostMan安装配置 由于家中有事,文章没顾得上.在此说声抱歉,这是工具准备的最后一章. 接下来就是开始环境搭建了~尽情期待 工欲善其事必先利其器,让我们先做好准备工 ...

  8. 浅入深出Vue:工具准备之WebStorm安装配置

    浅入深出Vue之工具准备(一):WebStorm安装配置 工欲善其事必先利其器,让我们先做好准备工作吧 导航篇 WebStorm安装配置 所有工具的下载地址都可以在导航篇中找到,这里我们下载的是最新版 ...

  9. 浅入深出Vue系列

    浅入深出Vue导航 导航帖,直接点击标题即可. 文中所有涉及到的资源链接均在最下方列举出来了. 前言 基础篇 浅入深出Vue:工具准备之WebStorm搭建及配置 浅入深出Vue之工具准备(二):Po ...

随机推荐

  1. PHP模拟发送POST请求之三、用Telnet和fsockopen()模拟发送POST信息

    了解完了HTTP头信息和URL信息的具体内容,我们开始尝试自己动手写一段头信息发送到服务器.Windows内置命令Telnet可以帮助我们发送简单的HTTP请求. 并且TELNET是一个特别灵活的工具 ...

  2. 烂泥: KVM虚拟机Linux系统增加硬盘

    本文由秀依林枫提供友情赞助,首发于烂泥行天下. Linux虚拟机在使用过程中,硬盘空间不够使用.由于前期没有做LVM,所以只能手动添加新的硬盘. 给虚拟机添加硬盘有两种方法: 1.通过virsh at ...

  3. javascript 内部对象(1)——Math 对象

    Math是javascript中的内部对象之一,主要用于处理数学方面的任务,是一种静态对象.和其他动态对象如Date.String等不同的是它没有构造函数Math(),可以直接使用属性和方法. 例如使 ...

  4. 动手学习TCP:服务端状态变迁

    上一篇文章介绍了TCP状态机,并且通过实验了解了TCP客户端正常的状态变迁过程. 那么,本篇文章就一起看看TCP服务端的正常状态变迁过程 服务端状态变迁 根据上一篇文章中的TCP状态变迁图,可以得到服 ...

  5. [转]ionic项目之上传下载数据

    本文转自:http://blog.csdn.net/superjunjin/article/details/44158567 一,首先是上传数据 记得在angularjs的controller中注入$ ...

  6. Bellman-Ford算法解决单源最短路问题

    #include<stdio.h> #include<stdlib.h> #include<stdbool.h> #define max 100 #define I ...

  7. openfire+asmack搭建的安卓即时通讯(五) 15.4.12

    这一篇博客其实是要昨天写的,但昨天做了作修改就停不下来了,这次的修改应该是前期开发的最终回了,其余的功能有空再做了,下周可能要做一些好玩的东西,敬请期待! 1.修改下Logo:(Just We) ht ...

  8. 循环 wxl

    #include <cstdio> #include <cstring> #include <string> #include <algorithm> ...

  9. 【iOS 初见】第一个简单的 iOS 应用

    本实例来自 <iOS编程(第4版)>,介绍如何编写一个简单的 iOS 应用. 功能为:在视图中显示一个问题,用户点击视图下方的按钮,可以显示相应的答案,用户点击上方的按钮,则会显示一个新的 ...

  10. PHP简单post验证绕过

    if($_POST[user] && $_POST[pass]) { $conn = mysql_connect("*******", "****&quo ...